From 4e94b3ae89333d60b5709f0fd51d1b5361449736 Mon Sep 17 00:00:00 2001 From: josesimoes Date: Fri, 2 Oct 2020 13:32:53 +0100 Subject: [PATCH 1/3] Rework system state and PAL events - Replace GLOBAL LOCK & UNLOCK with builtin atomic operations. - Move SystemEvents from platform to global implemention. --- CMake/Modules/FindNF_CoreCLR.cmake | 1 + src/HAL/Include/nanoHAL_v2.h | 229 ++++++++++-------- src/HAL/nanoHAL_SystemEvents.c | 41 ++++ targets/CMSIS-OS/ChibiOS/Include/targetHAL.h | 8 - .../CMSIS-OS/ChibiOS/nanoCLR/targetHAL.cpp | 47 ---- .../ChibiOS/nanoCLR/targetPAL_Events.cpp | 16 +- targets/FreeRTOS/NXP/nanoCLR/targetHAL.cpp | 47 ---- targets/FreeRTOS/common/include/targetHAL.h | 8 - .../common/nanoCLR/targetPAL_Events.cpp | 16 +- .../ESP32_WROOM_32/Include/targetHAL.h | 8 - .../ESP32_WROOM_32/nanoCLR/targetHAL.cpp | 46 ---- .../nanoCLR/targetPAL_Events.cpp | 16 +- targets/TI-SimpleLink/Include/targetHAL.h | 6 - targets/TI-SimpleLink/nanoCLR/targetHAL.cpp | 46 ---- .../nanoCLR/targetPAL_Events.cpp | 16 +- 15 files changed, 190 insertions(+), 361 deletions(-) create mode 100644 src/HAL/nanoHAL_SystemEvents.c diff --git a/CMake/Modules/FindNF_CoreCLR.cmake b/CMake/Modules/FindNF_CoreCLR.cmake index 26f7ada281..4cdc978e5f 100644 --- a/CMake/Modules/FindNF_CoreCLR.cmake +++ b/CMake/Modules/FindNF_CoreCLR.cmake @@ -145,6 +145,7 @@ set(NF_CoreCLR_SRCS # HAL nanoHAL_Time.cpp nanoHAL_Watchdog.c + nanoHAL_SystemEvents.c # PAL nanoPAL_BlockStorage.c diff --git a/src/HAL/Include/nanoHAL_v2.h b/src/HAL/Include/nanoHAL_v2.h index bae8d0840e..0e8a6942c9 100644 --- a/src/HAL/Include/nanoHAL_v2.h +++ b/src/HAL/Include/nanoHAL_v2.h @@ -30,31 +30,31 @@ typedef enum SYSTEM_STATE ////////////////////////////////////////////////////////////////// typedef enum SLEEP_LEVEL { - SLEEP_LEVEL__AWAKE = 0x00, + SLEEP_LEVEL__AWAKE = 0x00, SLEEP_LEVEL__SELECTIVE_OFF = 0x10, - SLEEP_LEVEL__SLEEP = 0x20, - SLEEP_LEVEL__DEEP_SLEEP = 0x30, - SLEEP_LEVEL__OFF = 0x40, + SLEEP_LEVEL__SLEEP = 0x20, + SLEEP_LEVEL__DEEP_SLEEP = 0x30, + SLEEP_LEVEL__OFF = 0x40, } SLEEP_LEVEL_type; -//These events match emulator events in Framework\Tools\Emulator\Events.cs +// These events match emulator events in Framework\Tools\Emulator\Events.cs -#define SYSTEM_EVENT_FLAG_COM_IN 0x00000001 -#define SYSTEM_EVENT_FLAG_COM_OUT 0x00000002 -#define SYSTEM_EVENT_FLAG_STORAGE_IO 0x00000004 -#define SYSTEM_EVENT_FLAG_SYSTEM_TIMER 0x00000010 +#define SYSTEM_EVENT_FLAG_COM_IN 0x00000001 +#define SYSTEM_EVENT_FLAG_COM_OUT 0x00000002 +#define SYSTEM_EVENT_FLAG_STORAGE_IO 0x00000004 +#define SYSTEM_EVENT_FLAG_SYSTEM_TIMER 0x00000010 //#define SYSTEM_EVENT_FLAG_TIMER1 0x00000020 //#define SYSTEM_EVENT_FLAG_TIMER2 0x00000040 //#define SYSTEM_EVENT_FLAG_BUTTON 0x00000080 -#define SYSTEM_EVENT_FLAG_GENERIC_PORT 0x00000100 +#define SYSTEM_EVENT_FLAG_GENERIC_PORT 0x00000100 //#define SYSTEM_EVENT_FLAG_UNUSED_0x00000200 0x00000200 //#define SYSTEM_EVENT_FLAG_UNUSED_0x00000400 0x00000400 -#define SYSTEM_EVENT_FLAG_NETWORK 0x00000800 +#define SYSTEM_EVENT_FLAG_NETWORK 0x00000800 //#define SYSTEM_EVENT_FLAG_TONE_COMPLETE 0x00001000 //#define SYSTEM_EVENT_FLAG_TONE_BUFFER_EMPTY 0x00002000 -#define SYSTEM_EVENT_FLAG_SOCKET 0x00004000 -#define SYSTEM_EVENT_FLAG_ONEWIRE_MASTER 0x00008000 -#define SYSTEM_EVENT_FLAG_RADIO 0x00010000 +#define SYSTEM_EVENT_FLAG_SOCKET 0x00004000 +#define SYSTEM_EVENT_FLAG_ONEWIRE_MASTER 0x00008000 +#define SYSTEM_EVENT_FLAG_RADIO 0x00010000 //#define SYSTEM_EVENT_FLAG_SPI 0x00008000 //#define SYSTEM_EVENT_FLAG_OEM_RESERVED_1 0x00020000 @@ -62,38 +62,35 @@ typedef enum SLEEP_LEVEL //#define SYSTEM_EVENT_FLAG_UNUSED_0x00080000 0x00080000 //#define SYSTEM_EVENT_FLAG_UNUSED_0x00100000 0x00100000 - //#define SYSTEM_EVENT_FLAG_UNUSED_0x00200000 0x00200000 //#define SYSTEM_EVENT_FLAG_UNUSED_0x00400000 0x00400000 //#define SYSTEM_EVENT_FLAG_UNUSED_0x00800000 0x00800000 //#define SYSTEM_EVENT_FLAG_UNUSED_0x01000000 0x01000000 -#define SYSTEM_EVENT_FLAG_SPI_MASTER 0x02000000 -#define SYSTEM_EVENT_FLAG_I2C_MASTER 0x04000000 -#define SYSTEM_EVENT_HW_INTERRUPT 0x08000000 -#define SYSTEM_EVENT_FLAG_DEBUGGER_ACTIVITY 0x20000000 -#define SYSTEM_EVENT_FLAG_MESSAGING_ACTIVITY 0x40000000 +#define SYSTEM_EVENT_FLAG_SPI_MASTER 0x02000000 +#define SYSTEM_EVENT_FLAG_I2C_MASTER 0x04000000 +#define SYSTEM_EVENT_HW_INTERRUPT 0x08000000 +#define SYSTEM_EVENT_FLAG_DEBUGGER_ACTIVITY 0x20000000 +#define SYSTEM_EVENT_FLAG_MESSAGING_ACTIVITY 0x40000000 //#define SYSTEM_EVENT_FLAG_UNUSED_0x80000000 0x80000000 -#define SYSTEM_EVENT_FLAG_ALL 0xFFFFFFFF - +#define SYSTEM_EVENT_FLAG_ALL 0xFFFFFFFF //////////////////////////////////////////////////////////////////////////////////////////// // !!! KEEP IN SYNC WITH nanoFramework.Runtime.Events.EventCategory (in managed code) !!! // //////////////////////////////////////////////////////////////////////////////////////////// -#define EVENT_UNKNOWN 0 -#define EVENT_CUSTOM 10 -#define EVENT_GPIO 20 -#define EVENT_SERIAL 30 -#define EVENT_NETWORK 40 -#define EVENT_WIFI 50 -#define EVENT_CAN 60 -#define EVENT_STORAGE 70 -#define EVENT_RADIO 80 +#define EVENT_UNKNOWN 0 +#define EVENT_CUSTOM 10 +#define EVENT_GPIO 20 +#define EVENT_SERIAL 30 +#define EVENT_NETWORK 40 +#define EVENT_WIFI 50 +#define EVENT_CAN 60 +#define EVENT_STORAGE 70 +#define EVENT_RADIO 80 //////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// - // COM_HANDLE Defines a type representing both a port type or "transport" and a port number // The COM_HANDLE is a multi bit field value with the following bit fields usage // |--------+--------+--------+--------| @@ -104,7 +101,7 @@ typedef enum SLEEP_LEVEL // |--------+--------+--------+--------| // |00000000|00000000|TTTTTTTT|cccppppp| ( transport == USB_TRANSPORT ) // |--------+--------+--------+--------| -// +// // where: // T => Transport type // USART_TRANSPORT => 1 @@ -115,14 +112,14 @@ typedef enum SLEEP_LEVEL // FLASH_WRITE_TRANSPORT => 6 // MESSAGING_TRANSPORT => 7 // GENERIC_TRANSPORT => 8 -// p => port instance number +// p => port instance number // Port instances in the handle are 1 based. (e.g. p == 0 is invalid except when T == 0 ) // c -> Controller instance number ( USB_TRANSPORT only ) // // NULL_PORT => T==0 && p == 0 // -// GENERIC_TRANSPORT is any custom port that isn't one of the above, they -// are implemented for the DebugPort_xxxx APIs and the port number is +// GENERIC_TRANSPORT is any custom port that isn't one of the above, they +// are implemented for the DebugPort_xxxx APIs and the port number is // an index into a const global table of port interfaces (structure of // function pointers) These allow custom extensions to the normal transports // without needing to continue defining additional transport types and modifying @@ -133,13 +130,13 @@ typedef int COM_HANDLE; typedef struct HAL_DRIVER_CONFIG_HEADER { unsigned int Enable; -}HAL_DRIVER_CONFIG_HEADER; +} HAL_DRIVER_CONFIG_HEADER; typedef struct HAL_SYSTEM_MEMORY_CONFIG { unsigned int Base; unsigned int Size; -}HAL_SYSTEM_MEMORY_CONFIG; +} HAL_SYSTEM_MEMORY_CONFIG; typedef struct HAL_SYSTEM_CONFIG { @@ -147,50 +144,52 @@ typedef struct HAL_SYSTEM_CONFIG //--// - COM_HANDLE DebuggerPort; + COM_HANDLE DebuggerPort; // communication channel for debug messages in the debugger // which may be VS, MFDEPLOY, etc... Accessed via debug_printf // in the HAL/PAL and System.Diagnostics.Debug.Print() in managed // applications - COM_HANDLE DebugTextPort; + COM_HANDLE DebugTextPort; - unsigned int USART_DefaultBaudRate; + unsigned int USART_DefaultBaudRate; // internal HAL/PAL debug/tracing channel, this is separate // to allow tracing messages in the driver that implements // the transport for the Debugger and DebugTextPort. This // channel is accessed via hal_printf() in the HAL/PAL - COM_HANDLE stdio; + COM_HANDLE stdio; HAL_SYSTEM_MEMORY_CONFIG RAM1; HAL_SYSTEM_MEMORY_CONFIG FLASH1; -}HAL_SYSTEM_CONFIG; +} HAL_SYSTEM_CONFIG; -extern HAL_SYSTEM_CONFIG HalSystemConfig; +extern HAL_SYSTEM_CONFIG HalSystemConfig; #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif -void nanoHAL_Initialize_C(); -void nanoHAL_Uninitialize_C(); -void HeapLocation_C(unsigned char** baseAddress, unsigned int* sizeInBytes); + void nanoHAL_Initialize_C(); + void nanoHAL_Uninitialize_C(); + void HeapLocation_C(unsigned char **baseAddress, unsigned int *sizeInBytes); -// Call to the external memory configuration and initialization function -// If a target has external memory it has to provide the implementation for it. -void Target_ExternalMemoryInit(); + // Call to the external memory configuration and initialization function + // If a target has external memory it has to provide the implementation for it. + void Target_ExternalMemoryInit(); #ifdef __cplusplus } #endif #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif -void CPU_Reset(); -void CPU_Sleep(SLEEP_LEVEL_type level, uint64_t wakeEvents); -void CPU_SetPowerMode(PowerLevel_type powerLevel); + void CPU_Reset(); + void CPU_Sleep(SLEEP_LEVEL_type level, uint64_t wakeEvents); + void CPU_SetPowerMode(PowerLevel_type powerLevel); #ifdef __cplusplus } @@ -199,78 +198,96 @@ void CPU_SetPowerMode(PowerLevel_type powerLevel); //--// // -// This has to be extern "C" because we want to use platform implemented malloc +// This has to be extern "C" because we want to use platform implemented malloc // #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif -void* platform_malloc ( size_t size ); -void platform_free ( void* ptr ); -void* platform_realloc( void* ptr, size_t size ); + void *platform_malloc(size_t size); + void platform_free(void *ptr); + void *platform_realloc(void *ptr, size_t size); #ifdef __cplusplus } #endif -void SystemState_Set ( SYSTEM_STATE_type newState ); -void SystemState_Clear( SYSTEM_STATE_type state ); -bool SystemState_Query( SYSTEM_STATE_type state ); +void SystemState_Set(SYSTEM_STATE_type newState); +void SystemState_Clear(SYSTEM_STATE_type state); +bool SystemState_Query(SYSTEM_STATE_type state); //--// - #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif -void SystemState_SetNoLock ( SYSTEM_STATE_type state ); -void SystemState_ClearNoLock( SYSTEM_STATE_type state ); -bool SystemState_QueryNoLock( SYSTEM_STATE_type state ); + void SystemState_SetNoLock(SYSTEM_STATE_type state); + void SystemState_ClearNoLock(SYSTEM_STATE_type state); + bool SystemState_QueryNoLock(SYSTEM_STATE_type state); #ifdef __cplusplus } #endif +// these macros are to be used at entry/exit of native interrupt handlers +#define NATIVE_INTERRUPT_START \ + SystemState_SetNoLock(SYSTEM_STATE_ISR); \ + SystemState_SetNoLock(SYSTEM_STATE_NO_CONTINUATIONS); +#define NATIVE_INTERRUPT_END \ + SystemState_ClearNoLock(SYSTEM_STATE_NO_CONTINUATIONS); \ + SystemState_ClearNoLock(SYSTEM_STATE_ISR); + //--// -#define HAL_COMPLETION_IDLE_VALUE 0x0000FFFFFFFFFFFFull +#define HAL_COMPLETION_IDLE_VALUE 0x0000FFFFFFFFFFFFull // provide platform dependent delay to CLR code #if defined(_WIN32) -#define OS_DELAY(milliSecs); +#define OS_DELAY(milliSecs) ; #else -#define OS_DELAY(milliSecs) PLATFORM_DELAY(milliSecs) +#define OS_DELAY(milliSecs) PLATFORM_DELAY(milliSecs) #endif //--// // Function macros #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif -void HAL_Assert ( const char* Func, int Line, const char* File ); -// HAL_AssertEx is to be defined at platform layer -void HAL_AssertEx(); + void HAL_Assert(const char *Func, int Line, const char *File); + // HAL_AssertEx is to be defined at platform layer + void HAL_AssertEx(); #ifdef __cplusplus } #endif #if defined(PLATFORM_ARM) || defined(PLATFORM_ESP32) - #if !defined(BUILD_RTM) - #define ASSERT(i) { if(!(i)) HAL_AssertEx(); } - #define _SIDE_ASSERTE(i) { if(!(i)) HAL_AssertEx(); } - #endif +#if !defined(BUILD_RTM) +#define ASSERT(i) \ + { \ + if (!(i)) \ + HAL_AssertEx(); \ + } +#define _SIDE_ASSERTE(i) \ + { \ + if (!(i)) \ + HAL_AssertEx(); \ + } +#endif #else - #if defined(_DEBUG) +#if defined(_DEBUG) #if !defined _ASSERTE #error #endif - #define ASSERT(i) _ASSERTE(i) - #define _SIDE_ASSERTE(i) _ASSERTE(i) - #endif +#define ASSERT(i) _ASSERTE(i) +#define _SIDE_ASSERTE(i) _ASSERTE(i) +#endif #endif #ifndef ASSERT @@ -286,9 +303,10 @@ void HAL_AssertEx(); #endif #if STATIC_ASSERT_SUPPORTED -#define CT_ASSERT_STRING( x ) #x -#define CT_ASSERT_UNIQUE_NAME(e,name)static_assert( (e), CT_ASSERT_STRING( name ) "@" __FILE__ CT_ASSERT_STRING(__LINE__) ); -#define CT_ASSERT(e) static_assert( (e), __FILE__ CT_ASSERT_STRING(__LINE__) ); +#define CT_ASSERT_STRING(x) #x +#define CT_ASSERT_UNIQUE_NAME(e, name) \ + static_assert((e), CT_ASSERT_STRING(name) "@" __FILE__ CT_ASSERT_STRING(__LINE__)); +#define CT_ASSERT(e) static_assert((e), __FILE__ CT_ASSERT_STRING(__LINE__)); #else // CT_ASSERT (compile-time assert) macro is used to test condition at compiler time and generate // compiler error if condition is bool. @@ -300,44 +318,53 @@ void HAL_AssertEx(); // The possible problem with the macro - it creates multiple identical typedefs. // It is not a problem in global scope, but if macro is used inside of struct - it generates warnings. // CT_ASSERT_UNIQUE_NAME is the same in essence, but it provides a way to customize the name of the type. -#define CT_ASSERT_UNIQUE_NAME(e,name) typedef char __CT_ASSERT__##name[(e)?1:-1]; -#define CT_ASSERT(e) CT_ASSERT_UNIQUE_NAME(e,nanoclr) +#define CT_ASSERT_UNIQUE_NAME(e, name) typedef char __CT_ASSERT__##name[(e) ? 1 : -1]; +#define CT_ASSERT(e) CT_ASSERT_UNIQUE_NAME(e, nanoclr) #endif #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif #if !defined(BUILD_RTM) -void debug_printf( const char *format, ... ); + void debug_printf(const char *format, ...); #else -__inline void debug_printf( const char *format, ... ) {} +__inline void debug_printf(const char *format, ...) +{ +} -#endif // !defined(BUILD_RTM) +#endif // !defined(BUILD_RTM) #ifdef __cplusplus } #endif //--// -#define NANOCLR_LOCKED_ACCESS_DECLARATION(type, name) type copy##name -#define NANOCLR_LOCKED_ACCESS_EXECUTE(name, expr) { GLOBAL_LOCK(); copy##name = expr; GLOBAL_UNLOCK(); } -#define NANOCLR_LOCKED_ACCESS_GET(name) copy##name +#define NANOCLR_LOCKED_ACCESS_DECLARATION(type, name) type copy##name +#define NANOCLR_LOCKED_ACCESS_EXECUTE(name, expr) \ + { \ + GLOBAL_LOCK(); \ + copy##name = expr; \ + GLOBAL_UNLOCK(); \ + } +#define NANOCLR_LOCKED_ACCESS_GET(name) copy##name //--// #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif -bool Target_HasNanoBooter(); -void HARD_Breakpoint(); -bool Target_ConfigUpdateRequiresErase(); -uint32_t GetPlatformCapabilities(); -uint32_t GetTargetCapabilities(); + bool Target_HasNanoBooter(); + void HARD_Breakpoint(); + bool Target_ConfigUpdateRequiresErase(); + uint32_t GetPlatformCapabilities(); + uint32_t GetTargetCapabilities(); #ifdef __cplusplus } diff --git a/src/HAL/nanoHAL_SystemEvents.c b/src/HAL/nanoHAL_SystemEvents.c new file mode 100644 index 0000000000..a42e6e9ea8 --- /dev/null +++ b/src/HAL/nanoHAL_SystemEvents.c @@ -0,0 +1,41 @@ +// +// Copyright (c) .NET Foundation and Contributors +// See LICENSE file in the project root for full license information. +// + +#include +#include + +volatile int32_t SystemStates[SYSTEM_STATE_TOTAL_STATES]; + +// the functions below are declared as weak so they can be replaced at target/platform level if needed + +__nfweak void SystemState_SetNoLock(SYSTEM_STATE_type state) +{ + SystemStates[state]++; +} + +__nfweak void SystemState_ClearNoLock(SYSTEM_STATE_type state) +{ + SystemStates[state]--; +} + +__nfweak bool SystemState_QueryNoLock(SYSTEM_STATE_type state) +{ + return (SystemStates[state] > 0) ? true : false; +} + +__nfweak void SystemState_Set(SYSTEM_STATE_type state) +{ + __atomic_fetch_add(&SystemStates[state], 1, __ATOMIC_RELAXED); +} + +__nfweak void SystemState_Clear(SYSTEM_STATE_type state) +{ + __atomic_fetch_sub(&SystemStates[state], 1, __ATOMIC_RELAXED); +} + +__nfweak bool SystemState_Query(SYSTEM_STATE_type state) +{ + return __atomic_load_n(&state, __ATOMIC_RELAXED) ? true : false; +} diff --git a/targets/CMSIS-OS/ChibiOS/Include/targetHAL.h b/targets/CMSIS-OS/ChibiOS/Include/targetHAL.h index 72283bf9f2..869e894c38 100644 --- a/targets/CMSIS-OS/ChibiOS/Include/targetHAL.h +++ b/targets/CMSIS-OS/ChibiOS/Include/targetHAL.h @@ -23,14 +23,6 @@ #define LPCSTR const char * -// these macros are to be used at entry/exit of native interrupt handlers -#define NATIVE_INTERRUPT_START \ - SystemState_SetNoLock(SYSTEM_STATE_ISR); \ - SystemState_SetNoLock(SYSTEM_STATE_NO_CONTINUATIONS); -#define NATIVE_INTERRUPT_END \ - SystemState_ClearNoLock(SYSTEM_STATE_NO_CONTINUATIONS); \ - SystemState_ClearNoLock(SYSTEM_STATE_ISR); - #if !defined(BUILD_RTM) #define HARD_BREAKPOINT() HARD_Breakpoint() diff --git a/targets/CMSIS-OS/ChibiOS/nanoCLR/targetHAL.cpp b/targets/CMSIS-OS/ChibiOS/nanoCLR/targetHAL.cpp index 64039f6468..9670c35daf 100644 --- a/targets/CMSIS-OS/ChibiOS/nanoCLR/targetHAL.cpp +++ b/targets/CMSIS-OS/ChibiOS/nanoCLR/targetHAL.cpp @@ -261,50 +261,3 @@ void nanoHAL_Uninitialize() HAL_CONTINUATION::Uninitialize(); HAL_COMPLETION ::Uninitialize(); } - -volatile int32_t SystemStates[SYSTEM_STATE_TOTAL_STATES]; - -void SystemState_SetNoLock(SYSTEM_STATE_type state) -{ - SystemStates[state]++; -} - -void SystemState_ClearNoLock(SYSTEM_STATE_type state) -{ - SystemStates[state]--; -} - -bool SystemState_QueryNoLock(SYSTEM_STATE_type state) -{ - return (SystemStates[state] > 0) ? true : false; -} - -void SystemState_Set(SYSTEM_STATE_type state) -{ - GLOBAL_LOCK(); - - SystemState_SetNoLock(state); - - GLOBAL_UNLOCK(); -} - -void SystemState_Clear(SYSTEM_STATE_type state) -{ - GLOBAL_LOCK(); - - SystemState_ClearNoLock(state); - - GLOBAL_UNLOCK(); -} - -bool SystemState_Query(SYSTEM_STATE_type state) -{ - bool systemStateCopy = false; - GLOBAL_LOCK(); - - systemStateCopy = SystemState_QueryNoLock(state); - - GLOBAL_UNLOCK(); - - return systemStateCopy; -} \ No newline at end of file diff --git a/targets/CMSIS-OS/ChibiOS/nanoCLR/targetPAL_Events.cpp b/targets/CMSIS-OS/ChibiOS/nanoCLR/targetPAL_Events.cpp index 87752fcaec..f401d96e4a 100644 --- a/targets/CMSIS-OS/ChibiOS/nanoCLR/targetPAL_Events.cpp +++ b/targets/CMSIS-OS/ChibiOS/nanoCLR/targetPAL_Events.cpp @@ -22,10 +22,8 @@ bool Events_Initialize() { NATIVE_PROFILE_PAL_EVENTS(); - // init events - GLOBAL_LOCK(); - systemEvents = 0; - GLOBAL_UNLOCK(); + // init events atomically + __atomic_clear(&systemEvents, __ATOMIC_RELAXED); return true; } @@ -43,10 +41,8 @@ void Events_Set( uint32_t events ) { NATIVE_PROFILE_PAL_EVENTS(); - // set events - GLOBAL_LOCK(); - systemEvents |= events; - GLOBAL_UNLOCK(); + // set events atomically + __atomic_fetch_or(&systemEvents, events, __ATOMIC_RELAXED); if( g_Event_Callback != NULL ) { @@ -62,9 +58,7 @@ uint32_t Events_Get( uint32_t eventsOfInterest ) uint32_t returnEvents = (systemEvents & eventsOfInterest); // ... clear the requested flags atomically - GLOBAL_LOCK(); - systemEvents &= ~eventsOfInterest; - GLOBAL_UNLOCK(); + __atomic_fetch_nand(&systemEvents, eventsOfInterest, __ATOMIC_RELAXED); // give the caller notice of just the events they asked for ( and were cleared already ) return returnEvents; diff --git a/targets/FreeRTOS/NXP/nanoCLR/targetHAL.cpp b/targets/FreeRTOS/NXP/nanoCLR/targetHAL.cpp index fc6ff596b4..68220a52a2 100644 --- a/targets/FreeRTOS/NXP/nanoCLR/targetHAL.cpp +++ b/targets/FreeRTOS/NXP/nanoCLR/targetHAL.cpp @@ -112,50 +112,3 @@ void nanoHAL_Uninitialize() HAL_CONTINUATION::Uninitialize(); HAL_COMPLETION ::Uninitialize(); } - - -volatile int32_t SystemStates[SYSTEM_STATE_TOTAL_STATES]; - -void SystemState_SetNoLock(SYSTEM_STATE_type state) -{ - SystemStates[state]++; -} - -void SystemState_ClearNoLock(SYSTEM_STATE_type state) -{ - SystemStates[state]--; -} - -bool SystemState_QueryNoLock(SYSTEM_STATE_type state) -{ - return (SystemStates[state] > 0) ? true : false; -} - -void SystemState_Set(SYSTEM_STATE_type state) -{ - GLOBAL_LOCK(); - - SystemState_SetNoLock(state); - - GLOBAL_UNLOCK(); -} - -void SystemState_Clear(SYSTEM_STATE_type state) -{ - GLOBAL_LOCK(); - - SystemState_ClearNoLock(state ); - - GLOBAL_UNLOCK(); -} - -bool SystemState_Query(SYSTEM_STATE_type state) -{ - GLOBAL_LOCK(); - - bool systemStateCopy = SystemState_QueryNoLock(state); - - GLOBAL_UNLOCK(); - - return systemStateCopy; -} diff --git a/targets/FreeRTOS/common/include/targetHAL.h b/targets/FreeRTOS/common/include/targetHAL.h index a7bbd3c5ac..ca5b97fae0 100644 --- a/targets/FreeRTOS/common/include/targetHAL.h +++ b/targets/FreeRTOS/common/include/targetHAL.h @@ -47,14 +47,6 @@ #define LPCSTR const char * -// these macros are to be used at entry/exit of native interrupt handlers -#define NATIVE_INTERRUPT_START \ - SystemState_SetNoLock(SYSTEM_STATE_ISR); \ - SystemState_SetNoLock(SYSTEM_STATE_NO_CONTINUATIONS); -#define NATIVE_INTERRUPT_END \ - SystemState_ClearNoLock(SYSTEM_STATE_NO_CONTINUATIONS); \ - SystemState_ClearNoLock(SYSTEM_STATE_ISR); - // TODO: Doesn't seem to be defined anywhere, used clr corlib math #define INT32 int32_t #define TRUE true diff --git a/targets/FreeRTOS/common/nanoCLR/targetPAL_Events.cpp b/targets/FreeRTOS/common/nanoCLR/targetPAL_Events.cpp index 3d91843a06..b4b9c1a355 100644 --- a/targets/FreeRTOS/common/nanoCLR/targetPAL_Events.cpp +++ b/targets/FreeRTOS/common/nanoCLR/targetPAL_Events.cpp @@ -27,10 +27,8 @@ bool Events_Initialize() { NATIVE_PROFILE_PAL_EVENTS(); - // init events - GLOBAL_LOCK(); - systemEvents = 0; - GLOBAL_UNLOCK(); + // init events atomically + __atomic_clear(&systemEvents, __ATOMIC_RELAXED); boolEventsTimer = xTimerCreate( "boolEventsTimer", 10, pdFALSE, (void *)0, local_Events_SetBoolTimer_Callback); @@ -50,10 +48,8 @@ void Events_Set( uint32_t events ) { NATIVE_PROFILE_PAL_EVENTS(); - // set events - GLOBAL_LOCK(); - systemEvents |= events; - GLOBAL_UNLOCK(); + // set events atomically + __atomic_fetch_or(&systemEvents, events, __ATOMIC_RELAXED); if( g_Event_Callback != NULL ) { @@ -69,9 +65,7 @@ uint32_t Events_Get( uint32_t eventsOfInterest ) uint32_t returnEvents = (systemEvents & eventsOfInterest); // ... clear the requested flags atomically - GLOBAL_LOCK(); - systemEvents &= ~eventsOfInterest; - GLOBAL_UNLOCK(); + __atomic_fetch_nand(&systemEvents, eventsOfInterest, __ATOMIC_RELAXED); // give the caller notice of just the events they asked for ( and were cleared already ) return returnEvents; diff --git a/targets/FreeRTOS_ESP32/ESP32_WROOM_32/Include/targetHAL.h b/targets/FreeRTOS_ESP32/ESP32_WROOM_32/Include/targetHAL.h index bde964efe6..70968ba829 100644 --- a/targets/FreeRTOS_ESP32/ESP32_WROOM_32/Include/targetHAL.h +++ b/targets/FreeRTOS_ESP32/ESP32_WROOM_32/Include/targetHAL.h @@ -26,14 +26,6 @@ extern portMUX_TYPE globalLockMutex; #define LPCSTR const char * -// these macros are to be used at entry/exit of native interrupt handlers -#define NATIVE_INTERRUPT_START \ - SystemState_SetNoLock(SYSTEM_STATE_ISR); \ - SystemState_SetNoLock(SYSTEM_STATE_NO_CONTINUATIONS); -#define NATIVE_INTERRUPT_END \ - SystemState_ClearNoLock(SYSTEM_STATE_NO_CONTINUATIONS); \ - SystemState_ClearNoLock(SYSTEM_STATE_ISR); - // TODO: Doesn't seem to be defined anywhere, used clr corlib math #define INT32 int32_t #define TRUE true diff --git a/targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetHAL.cpp b/targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetHAL.cpp index a1ff21870b..5456ded6fc 100644 --- a/targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetHAL.cpp +++ b/targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetHAL.cpp @@ -139,52 +139,6 @@ void nanoHAL_Uninitialize() HAL_COMPLETION ::Uninitialize(); } -volatile int32_t SystemStates[SYSTEM_STATE_TOTAL_STATES]; - -void SystemState_SetNoLock(SYSTEM_STATE_type state) -{ - SystemStates[state]++; -} - -void SystemState_ClearNoLock(SYSTEM_STATE_type state) -{ - SystemStates[state]--; -} - -bool SystemState_QueryNoLock(SYSTEM_STATE_type state) -{ - return (SystemStates[state] > 0) ? true : false; -} - -void SystemState_Set(SYSTEM_STATE_type state) -{ - GLOBAL_LOCK(); - - SystemState_SetNoLock(state); - - GLOBAL_UNLOCK(); -} - -void SystemState_Clear(SYSTEM_STATE_type state) -{ - GLOBAL_LOCK(); - - SystemState_ClearNoLock(state); - - GLOBAL_UNLOCK(); -} - -bool SystemState_Query(SYSTEM_STATE_type state) -{ - GLOBAL_LOCK(); - - bool systemStateCopy = SystemState_QueryNoLock(state); - - GLOBAL_UNLOCK(); - - return systemStateCopy; -} - // Just in case storage is not configured __nfweak void Storage_Initialize(){}; __nfweak void Storage_Uninitialize(){}; \ No newline at end of file diff --git a/targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetPAL_Events.cpp b/targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetPAL_Events.cpp index db3041780c..b525f4961f 100644 --- a/targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetPAL_Events.cpp +++ b/targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetPAL_Events.cpp @@ -25,10 +25,8 @@ bool Events_Initialize() { NATIVE_PROFILE_PAL_EVENTS(); - // init events - GLOBAL_LOCK(); - systemEvents = 0; - GLOBAL_UNLOCK(); + // init events atomically + __atomic_clear(&systemEvents, __ATOMIC_RELAXED); boolEventsTimer = xTimerCreate( "boolEventsTimer", 10, pdFALSE, (void *)0, local_Events_SetBoolTimer_Callback); @@ -48,10 +46,8 @@ void Events_Set( uint32_t events ) { NATIVE_PROFILE_PAL_EVENTS(); - // set events - GLOBAL_LOCK(); - systemEvents |= events; - GLOBAL_UNLOCK(); + // set events atomically + __atomic_fetch_or(&systemEvents, events, __ATOMIC_RELAXED); if( g_Event_Callback != NULL ) { @@ -67,9 +63,7 @@ uint32_t Events_Get( uint32_t eventsOfInterest ) uint32_t returnEvents = (systemEvents & eventsOfInterest); // ... clear the requested flags atomically - GLOBAL_LOCK(); - systemEvents &= ~eventsOfInterest; - GLOBAL_UNLOCK(); + __atomic_fetch_nand(&systemEvents, eventsOfInterest, __ATOMIC_RELAXED); // give the caller notice of just the events they asked for ( and were cleared already ) return returnEvents; diff --git a/targets/TI-SimpleLink/Include/targetHAL.h b/targets/TI-SimpleLink/Include/targetHAL.h index 1b42b7a6cc..a95d07f187 100644 --- a/targets/TI-SimpleLink/Include/targetHAL.h +++ b/targets/TI-SimpleLink/Include/targetHAL.h @@ -25,12 +25,6 @@ #define LPCSTR const char* -// these macros are to be used at entry/exit of native interrupt handlers -#define NATIVE_INTERRUPT_START SystemState_SetNoLock( SYSTEM_STATE_ISR ); \ - SystemState_SetNoLock( SYSTEM_STATE_NO_CONTINUATIONS ); -#define NATIVE_INTERRUPT_END SystemState_ClearNoLock( SYSTEM_STATE_NO_CONTINUATIONS ); \ - SystemState_ClearNoLock( SYSTEM_STATE_ISR ); - #define TRUE true #define FALSE false diff --git a/targets/TI-SimpleLink/nanoCLR/targetHAL.cpp b/targets/TI-SimpleLink/nanoCLR/targetHAL.cpp index 2382a4c74a..e7eed4934c 100644 --- a/targets/TI-SimpleLink/nanoCLR/targetHAL.cpp +++ b/targets/TI-SimpleLink/nanoCLR/targetHAL.cpp @@ -153,49 +153,3 @@ void nanoHAL_Uninitialize() HAL_CONTINUATION::Uninitialize(); HAL_COMPLETION ::Uninitialize(); } - -volatile int32_t SystemStates[SYSTEM_STATE_TOTAL_STATES]; - -void SystemState_SetNoLock(SYSTEM_STATE_type state) -{ - SystemStates[state]++; -} - -void SystemState_ClearNoLock(SYSTEM_STATE_type state) -{ - SystemStates[state]--; -} - -bool SystemState_QueryNoLock(SYSTEM_STATE_type state) -{ - return (SystemStates[state] > 0) ? true : false; -} - -void SystemState_Set(SYSTEM_STATE_type state) -{ - GLOBAL_LOCK(); - - SystemState_SetNoLock(state); - - GLOBAL_UNLOCK(); -} - -void SystemState_Clear(SYSTEM_STATE_type state) -{ - GLOBAL_LOCK(); - - SystemState_ClearNoLock(state); - - GLOBAL_UNLOCK(); -} - -bool SystemState_Query(SYSTEM_STATE_type state) -{ - GLOBAL_LOCK(); - - bool systemStateCopy = SystemState_QueryNoLock(state); - - GLOBAL_UNLOCK(); - - return systemStateCopy; -} diff --git a/targets/TI-SimpleLink/nanoCLR/targetPAL_Events.cpp b/targets/TI-SimpleLink/nanoCLR/targetPAL_Events.cpp index 609339ada1..0288dec611 100644 --- a/targets/TI-SimpleLink/nanoCLR/targetPAL_Events.cpp +++ b/targets/TI-SimpleLink/nanoCLR/targetPAL_Events.cpp @@ -28,10 +28,8 @@ bool Events_Initialize() { NATIVE_PROFILE_PAL_EVENTS(); - // init events - GLOBAL_LOCK(); - systemEvents = 0; - GLOBAL_UNLOCK(); + // init events atomically + __atomic_clear(&systemEvents, __ATOMIC_RELAXED); Clock_Params params; @@ -58,10 +56,8 @@ void Events_Set(uint32_t events) { NATIVE_PROFILE_PAL_EVENTS(); - // set events - GLOBAL_LOCK(); - systemEvents |= events; - GLOBAL_UNLOCK(); + // set events atomically + __atomic_fetch_or(&systemEvents, events, __ATOMIC_RELAXED); if (g_Event_Callback != NULL) { @@ -77,9 +73,7 @@ uint32_t Events_Get(uint32_t eventsOfInterest) uint32_t returnEvents = (systemEvents & eventsOfInterest); // ... clear the requested flags atomically - GLOBAL_LOCK(); - systemEvents &= ~eventsOfInterest; - GLOBAL_UNLOCK(); + __atomic_fetch_nand(&systemEvents, eventsOfInterest, __ATOMIC_RELAXED); // give the caller notice of just the events they asked for ( and were cleared already ) return returnEvents; From 6a1eeb087965efbb0563432f1e297406427e4abb Mon Sep 17 00:00:00 2001 From: nfbot Date: Fri, 2 Oct 2020 13:40:59 +0100 Subject: [PATCH 2/3] Code style fixes (#38) Automated fixes for code style. --- .../ChibiOS/nanoCLR/targetPAL_Events.cpp | 70 ++++++++++-------- targets/FreeRTOS/NXP/nanoCLR/targetHAL.cpp | 59 +++++++-------- .../common/nanoCLR/targetPAL_Events.cpp | 71 +++++++++--------- .../nanoCLR/targetPAL_Events.cpp | 72 +++++++++---------- targets/TI-SimpleLink/Include/targetHAL.h | 36 +++++----- 5 files changed, 160 insertions(+), 148 deletions(-) diff --git a/targets/CMSIS-OS/ChibiOS/nanoCLR/targetPAL_Events.cpp b/targets/CMSIS-OS/ChibiOS/nanoCLR/targetPAL_Events.cpp index f401d96e4a..7ce2ed76ac 100644 --- a/targets/CMSIS-OS/ChibiOS/nanoCLR/targetPAL_Events.cpp +++ b/targets/CMSIS-OS/ChibiOS/nanoCLR/targetPAL_Events.cpp @@ -15,8 +15,8 @@ uint64_t CPU_MillisecondsToTicks(uint64_t ticks); static virtual_timer_t boolEventsTimer; uint32_t systemEvents; -set_Event_Callback g_Event_Callback = NULL; -void* g_Event_Callback_Arg = NULL; +set_Event_Callback g_Event_Callback = NULL; +void *g_Event_Callback_Arg = NULL; bool Events_Initialize() { @@ -37,20 +37,20 @@ bool Events_Uninitialize() return true; } -void Events_Set( uint32_t events ) +void Events_Set(uint32_t events) { NATIVE_PROFILE_PAL_EVENTS(); // set events atomically __atomic_fetch_or(&systemEvents, events, __ATOMIC_RELAXED); - if( g_Event_Callback != NULL ) + if (g_Event_Callback != NULL) { - g_Event_Callback( g_Event_Callback_Arg ); + g_Event_Callback(g_Event_Callback_Arg); } } -uint32_t Events_Get( uint32_t eventsOfInterest ) +uint32_t Events_Get(uint32_t eventsOfInterest) { NATIVE_PROFILE_PAL_EVENTS(); @@ -59,80 +59,90 @@ uint32_t Events_Get( uint32_t eventsOfInterest ) // ... clear the requested flags atomically __atomic_fetch_nand(&systemEvents, eventsOfInterest, __ATOMIC_RELAXED); - + // give the caller notice of just the events they asked for ( and were cleared already ) return returnEvents; } -uint32_t Events_MaskedRead( uint32_t eventsOfInterest ) +uint32_t Events_MaskedRead(uint32_t eventsOfInterest) { NATIVE_PROFILE_PAL_EVENTS(); return (systemEvents & eventsOfInterest); } -static void local_Events_SetBoolTimer_Callback( void* arg ) +static void local_Events_SetBoolTimer_Callback(void *arg) { NATIVE_PROFILE_PAL_EVENTS(); - bool* timerCompleteFlag = (bool*)arg; + bool *timerCompleteFlag = (bool *)arg; *timerCompleteFlag = true; } -void Events_SetCallback( set_Event_Callback pfn, void* arg ) +void Events_SetCallback(set_Event_Callback pfn, void *arg) { NATIVE_PROFILE_PAL_EVENTS(); - g_Event_Callback = pfn; + g_Event_Callback = pfn; g_Event_Callback_Arg = arg; } -void Events_SetBoolTimer( bool* timerCompleteFlag, uint32_t millisecondsFromNow ) +void Events_SetBoolTimer(bool *timerCompleteFlag, uint32_t millisecondsFromNow) { NATIVE_PROFILE_PAL_EVENTS(); - if(timerCompleteFlag != NULL) + if (timerCompleteFlag != NULL) { // no need to stop the timer even if it's running because the API does it anyway - if (port_is_isr_context()){ - chVTSetI(&boolEventsTimer, TIME_MS2I(millisecondsFromNow), local_Events_SetBoolTimer_Callback, timerCompleteFlag); - } - else{ - chVTSet(&boolEventsTimer, TIME_MS2I(millisecondsFromNow), local_Events_SetBoolTimer_Callback, timerCompleteFlag); - } + if (port_is_isr_context()) + { + chVTSetI( + &boolEventsTimer, + TIME_MS2I(millisecondsFromNow), + local_Events_SetBoolTimer_Callback, + timerCompleteFlag); + } + else + { + chVTSet( + &boolEventsTimer, + TIME_MS2I(millisecondsFromNow), + local_Events_SetBoolTimer_Callback, + timerCompleteFlag); + } } } -uint32_t Events_WaitForEvents( uint32_t powerLevel, uint32_t wakeupSystemEvents, uint32_t timeoutMilliseconds ) +uint32_t Events_WaitForEvents(uint32_t powerLevel, uint32_t wakeupSystemEvents, uint32_t timeoutMilliseconds) { // schedule an interrupt for this far in the future // timeout is in milliseconds, need to convert to ticks - uint64_t countsRemaining = CPU_MillisecondsToTicks( timeoutMilliseconds ); + uint64_t countsRemaining = CPU_MillisecondsToTicks(timeoutMilliseconds); #if defined(HAL_PROFILE_ENABLED) Events_WaitForEvents_Calls++; #endif - uint64_t expireTimeInTicks = HAL_Time_CurrentSysTicks() + countsRemaining; + uint64_t expireTimeInTicks = HAL_Time_CurrentSysTicks() + countsRemaining; bool runContinuations = true; - while(true) + while (true) { EVENTS_HEART_BEAT; - uint32_t events = Events_MaskedRead( wakeupSystemEvents ); - if(events) + uint32_t events = Events_MaskedRead(wakeupSystemEvents); + if (events) { return events; } - if(expireTimeInTicks <= HAL_Time_CurrentSysTicks()) + if (expireTimeInTicks <= HAL_Time_CurrentSysTicks()) { break; } // first check and possibly run any continuations // but only if we have slept after stalling - if(runContinuations && !SystemState_QueryNoLock(SYSTEM_STATE_NO_CONTINUATIONS)) + if (runContinuations && !SystemState_QueryNoLock(SYSTEM_STATE_NO_CONTINUATIONS)) { // if we stall on time, don't check again until after we sleep runContinuations = HAL_CONTINUATION::Dequeue_And_Execute(); @@ -142,14 +152,14 @@ uint32_t Events_WaitForEvents( uint32_t powerLevel, uint32_t wakeupSystemEvents, // try stalled continuations again after sleeping runContinuations = true; - HAL_COMPLETION::WaitForInterrupts(expireTimeInTicks, powerLevel, wakeupSystemEvents ); + HAL_COMPLETION::WaitForInterrupts(expireTimeInTicks, powerLevel, wakeupSystemEvents); } // no events, pass control to the OS osThreadYield(); // check if reboot or exit flags were set when the other OS threads executed - if(CLR_EE_DBG_IS(RebootPending) || CLR_EE_DBG_IS(ExitPending)) + if (CLR_EE_DBG_IS(RebootPending) || CLR_EE_DBG_IS(ExitPending)) { break; } diff --git a/targets/FreeRTOS/NXP/nanoCLR/targetHAL.cpp b/targets/FreeRTOS/NXP/nanoCLR/targetHAL.cpp index 68220a52a2..042ded1938 100644 --- a/targets/FreeRTOS/NXP/nanoCLR/targetHAL.cpp +++ b/targets/FreeRTOS/NXP/nanoCLR/targetHAL.cpp @@ -12,32 +12,35 @@ // // Reboot handlers clean up on reboot // -static ON_SOFT_REBOOT_HANDLER s_rebootHandlers[16] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; +static ON_SOFT_REBOOT_HANDLER s_rebootHandlers[16] = + {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; void HAL_AddSoftRebootHandler(ON_SOFT_REBOOT_HANDLER handler) { - for(unsigned int i=0; i #include -#define GLOBAL_LOCK() uint32_t taskKey = Task_disable(); -#define GLOBAL_UNLOCK() Task_restore(taskKey); +#define GLOBAL_LOCK() uint32_t taskKey = Task_disable(); +#define GLOBAL_UNLOCK() Task_restore(taskKey); // platform dependent delay -#define PLATFORM_DELAY(milliSecs) ClockP_usleep(milliSecs * 1000); +#define PLATFORM_DELAY(milliSecs) ClockP_usleep(milliSecs * 1000); // Definitions for Sockets/Network -#define GLOBAL_LOCK_SOCKETS(x) +#define GLOBAL_LOCK_SOCKETS(x) -#define PLATFORM_DEPENDENT__SOCKETS_MAX_COUNT 16 +#define PLATFORM_DEPENDENT__SOCKETS_MAX_COUNT 16 -#define LPCSTR const char* +#define LPCSTR const char * #define TRUE true #define FALSE false #if !defined(BUILD_RTM) -#define HARD_BREAKPOINT() HARD_Breakpoint() +#define HARD_BREAKPOINT() HARD_Breakpoint() // #if defined(_DEBUG) // #define DEBUG_HARD_BREAKPOINT() HARD_Breakpoint() @@ -43,27 +43,27 @@ // #define HARD_BREAKPOINT() // #define DEBUG_HARD_BREAKPOINT() -#endif // !defined(BUILD_RTM) +#endif // !defined(BUILD_RTM) // map TI SimpleLink calls to UART output to nanoFramework API // this is valid only for debug buils // release and RTM build don't call these #if defined(BUILD_RTM) -#define UART_PRINT(x,...) -#define INFO_PRINT(x,...) +#define UART_PRINT(x, ...) +#define INFO_PRINT(x, ...) #else #if defined(DEBUG) || defined(_DEBUG) -#define UART_PRINT DebuggerPort_WriteProxy -#define INFO_PRINT DebuggerPort_WriteProxy +#define UART_PRINT DebuggerPort_WriteProxy +#define INFO_PRINT DebuggerPort_WriteProxy #else -#define UART_PRINT(x,...) -#define INFO_PRINT(x,...) +#define UART_PRINT(x, ...) +#define INFO_PRINT(x, ...) #endif // DEBUG @@ -78,11 +78,11 @@ // The implementation should is to be provided by each target at target_common.h.in // //////////////////////////////////////////////////////////////////////////////////////////////////// #if defined(BUILD_RTM) - #define EVENTS_HEART_BEAT +#define EVENTS_HEART_BEAT #else - #ifndef EVENTS_HEART_BEAT - #define EVENTS_HEART_BEAT __asm__ __volatile__ ("nop") - #endif // EVENTS_HEART_BEAT +#ifndef EVENTS_HEART_BEAT +#define EVENTS_HEART_BEAT __asm__ __volatile__("nop") +#endif // EVENTS_HEART_BEAT #endif extern int HeapBegin; From f94acaaf8d8f418b22fb07f7de385ed753c66c27 Mon Sep 17 00:00:00 2001 From: josesimoes Date: Fri, 2 Oct 2020 16:33:24 +0100 Subject: [PATCH 3/3] Move PAL events to common location. --- CMake/Modules/FindNF_CoreCLR.cmake | 2 + src/HAL/nanoHAL_SystemEvents.c | 13 ++ src/PAL/Events/nanoPAL_Events.cpp | 95 ++++++++++++ src/PAL/Include/nanoPAL_Events.h | 77 +++++---- targets/CMSIS-OS/ChibiOS/Include/targetHAL.h | 3 +- .../CMSIS-OS/ChibiOS/nanoCLR/targetHAL.cpp | 1 + .../ChibiOS/nanoCLR/targetPAL_Events.cpp | 59 +------ targets/FreeRTOS/NXP/nanoCLR/targetHAL.cpp | 1 + .../common/nanoCLR/targetPAL_Events.cpp | 57 +------ .../ESP32_WROOM_32/nanoCLR/targetHAL.cpp | 1 + .../nanoCLR/targetPAL_Events.cpp | 57 +------ .../nanoCLR/targetPAL_Events.cpp.groups.cpp | 146 ------------------ targets/TI-SimpleLink/nanoCLR/targetHAL.cpp | 1 + .../nanoCLR/targetPAL_Events.cpp | 57 +------ 14 files changed, 160 insertions(+), 410 deletions(-) create mode 100644 src/PAL/Events/nanoPAL_Events.cpp delete mode 100644 targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetPAL_Events.cpp.groups.cpp diff --git a/CMake/Modules/FindNF_CoreCLR.cmake b/CMake/Modules/FindNF_CoreCLR.cmake index 4cdc978e5f..d155fc85bc 100644 --- a/CMake/Modules/FindNF_CoreCLR.cmake +++ b/CMake/Modules/FindNF_CoreCLR.cmake @@ -149,6 +149,7 @@ set(NF_CoreCLR_SRCS # PAL nanoPAL_BlockStorage.c + nanoPAL_Events.cpp nanoPAL_NativeDouble.cpp nanoPAL_Network_stubs.cpp nanoPAL_PerformanceCounters_stubs.cpp @@ -235,6 +236,7 @@ foreach(SRC_FILE ${NF_CoreCLR_SRCS}) ${PROJECT_SOURCE_DIR}/src/PAL ${PROJECT_SOURCE_DIR}/src/PAL/BlockStorage ${PROJECT_SOURCE_DIR}/src/PAL/Double + ${PROJECT_SOURCE_DIR}/src/PAL/Events # PAL stubs ${PROJECT_SOURCE_DIR}/src/PAL/AsyncProcCall diff --git a/src/HAL/nanoHAL_SystemEvents.c b/src/HAL/nanoHAL_SystemEvents.c index a42e6e9ea8..c8146cde62 100644 --- a/src/HAL/nanoHAL_SystemEvents.c +++ b/src/HAL/nanoHAL_SystemEvents.c @@ -5,6 +5,7 @@ #include #include +#include volatile int32_t SystemStates[SYSTEM_STATE_TOTAL_STATES]; @@ -27,12 +28,24 @@ __nfweak bool SystemState_QueryNoLock(SYSTEM_STATE_type state) __nfweak void SystemState_Set(SYSTEM_STATE_type state) { +#ifdef __CM0_CMSIS_VERSION + GLOBAL_LOCK(); + SystemState_SetNoLock(state); + GLOBAL_UNLOCK(); +#else __atomic_fetch_add(&SystemStates[state], 1, __ATOMIC_RELAXED); +#endif } __nfweak void SystemState_Clear(SYSTEM_STATE_type state) { +#ifdef __CM0_CMSIS_VERSION + GLOBAL_LOCK(); + SystemState_ClearNoLock(state); + GLOBAL_UNLOCK(); +#else __atomic_fetch_sub(&SystemStates[state], 1, __ATOMIC_RELAXED); +#endif } __nfweak bool SystemState_Query(SYSTEM_STATE_type state) diff --git a/src/PAL/Events/nanoPAL_Events.cpp b/src/PAL/Events/nanoPAL_Events.cpp new file mode 100644 index 0000000000..9e28785f5d --- /dev/null +++ b/src/PAL/Events/nanoPAL_Events.cpp @@ -0,0 +1,95 @@ +// +// Copyright (c) .NET Foundation and Contributors +// Portions Copyright (c) Microsoft Corporation. All rights reserved. +// See LICENSE file in the project root for full license information. +// + +#include +// #include + +volatile uint32_t systemEvents; + +set_Event_Callback g_Event_Callback = NULL; +void *g_Event_Callback_Arg = NULL; + +// functions below declared as weak can be replaced at target/platform level if needed + +__nfweak bool Events_Initialize_Platform() +{ + return true; +} + +__nfweak bool Events_Uninitialize_Platform() +{ + return true; +} + +__nfweak void Events_Set(uint32_t events) +{ + NATIVE_PROFILE_PAL_EVENTS(); + + // set events atomically +#ifdef __CM0_CMSIS_VERSION + GLOBAL_LOCK(); + systemEvents |= events; + GLOBAL_UNLOCK(); +#else + __atomic_fetch_or(&systemEvents, events, __ATOMIC_RELAXED); +#endif + + if (g_Event_Callback != NULL) + { + g_Event_Callback(g_Event_Callback_Arg); + } +} + +__nfweak uint32_t Events_Get(uint32_t eventsOfInterest) +{ + NATIVE_PROFILE_PAL_EVENTS(); + + // get the requested flags from system events state and... + uint32_t returnEvents = (systemEvents & eventsOfInterest); + + // ... clear the requested flags atomically +#ifdef __CM0_CMSIS_VERSION + GLOBAL_LOCK(); + systemEvents &= ~eventsOfInterest; + GLOBAL_UNLOCK(); +#else + __atomic_fetch_nand(&systemEvents, eventsOfInterest, __ATOMIC_RELAXED); +#endif + + // give the caller notice of just the events they asked for ( and were cleared already ) + return returnEvents; +} + +__nfweak uint32_t Events_MaskedRead(uint32_t eventsOfInterest) +{ + NATIVE_PROFILE_PAL_EVENTS(); + return (systemEvents & eventsOfInterest); +} + +__nfweak void Events_SetCallback(set_Event_Callback pfn, void *arg) +{ + NATIVE_PROFILE_PAL_EVENTS(); + + g_Event_Callback = pfn; + g_Event_Callback_Arg = arg; +} + +bool Events_Initialize() +{ + NATIVE_PROFILE_PAL_EVENTS(); + + // init events atomically + __atomic_clear(&systemEvents, __ATOMIC_RELAXED); + + return Events_Initialize_Platform(); +} + +bool Events_Uninitialize() +{ + NATIVE_PROFILE_PAL_EVENTS(); + + return Events_Uninitialize_Platform(); +} diff --git a/src/PAL/Include/nanoPAL_Events.h b/src/PAL/Include/nanoPAL_Events.h index c674b96c4d..118999dd41 100644 --- a/src/PAL/Include/nanoPAL_Events.h +++ b/src/PAL/Include/nanoPAL_Events.h @@ -9,53 +9,47 @@ #include #include -typedef void (*set_Event_Callback)( void* ); +typedef void (*set_Event_Callback)(void *); #define EVENTS_TIMEOUT_INFINITE 0xFFFFFFFF #if NATIVE_PROFILE_PAL & NATIVE_PROFILE_PAL_EVENTS__flag - #define NATIVE_PROFILE_PAL_EVENTS() Native_Profiler profiler_obj +#define NATIVE_PROFILE_PAL_EVENTS() Native_Profiler profiler_obj #else - #define NATIVE_PROFILE_PAL_EVENTS() +#define NATIVE_PROFILE_PAL_EVENTS() #endif +#ifdef __cplusplus +extern "C" +{ +#endif - bool Events_Initialize(); - bool Events_Uninitialize(); - void Events_Set( uint32_t events ); - -// destructive read system event flags - uint32_t Events_Get( uint32_t eventsOfInterest ); - -// non-destructive read system event flags - uint32_t Events_MaskedRead( uint32_t eventsOfInterest ); + bool Events_Initialize(); + bool Events_Uninitialize(); + void Events_Set(uint32_t events); -// returns 0 for timeout, non-zero are events that have happened and were asked to be waiting on (non-destructive read) -// timeout limit is about 3034 milliseconds currently -// values greater than this are capped to this + // destructive read system event flags + uint32_t Events_Get(uint32_t eventsOfInterest); -// sleep relative time into the future, or until a SystemEvent occurs, which occurs first -// timeout is a non-negative number of 1mSec ticks, or -1 (any negative value) to sleep forever until a SystemEvent occurs + // non-destructive read system event flags + uint32_t Events_MaskedRead(uint32_t eventsOfInterest); -// Events_WaitForEvents(0, n), sleeps for n milliseconds independent of events -// Events_WaitForEvents(0, EVENTS_TIMEOUT_INFINITE) sleeps forever. Don't do that. -// Events_WaitForEvents(flags, EVENTS_TIMEOUT_INFINITE) waits forever for that event. + // returns 0 for timeout, non-zero are events that have happened and were asked to be waiting on (non-destructive + // read) timeout limit is about 3034 milliseconds currently values greater than this are capped to this -uint32_t Events_WaitForEvents( uint32_t powerLevel, uint32_t wakeupSystemEvents, uint32_t timeoutMilliseconds ); + // sleep relative time into the future, or until a SystemEvent occurs, which occurs first + // timeout is a non-negative number of 1mSec ticks, or -1 (any negative value) to sleep forever until a SystemEvent + // occurs -__inline uint32_t Events_WaitForEvents( uint32_t wakeupSystemEvents, uint32_t timeoutMilliseconds ) -{ - return Events_WaitForEvents( SLEEP_LEVEL__SLEEP, wakeupSystemEvents, timeoutMilliseconds ); -} + // Events_WaitForEvents(0, n), sleeps for n milliseconds independent of events + // Events_WaitForEvents(0, EVENTS_TIMEOUT_INFINITE) sleeps forever. Don't do that. + // Events_WaitForEvents(flags, EVENTS_TIMEOUT_INFINITE) waits forever for that event. - void Events_SetBoolTimer( bool* timerCompleteFlag, uint32_t millisecondsFromNow ); - void Events_SetCallback( set_Event_Callback pfn, void* arg ); - void FreeManagedEvent(uint8_t category, uint8_t subCategory, uint16_t data1, uint32_t data2); + uint32_t Events_WaitForEvents(uint32_t powerLevel, uint32_t wakeupSystemEvents, uint32_t timeoutMilliseconds); - -#ifdef __cplusplus -extern "C" { -#endif + void Events_SetBoolTimer(bool *timerCompleteFlag, uint32_t millisecondsFromNow); + void Events_SetCallback(set_Event_Callback pfn, void *arg); + void FreeManagedEvent(uint8_t category, uint8_t subCategory, uint16_t data1, uint32_t data2); void PostManagedEvent(uint8_t category, uint8_t subCategory, uint16_t data1, uint32_t data2); @@ -63,36 +57,39 @@ extern "C" { } #endif +__inline uint32_t Events_WaitForEvents(uint32_t wakeupSystemEvents, uint32_t timeoutMilliseconds) +{ + return Events_WaitForEvents(SLEEP_LEVEL__SLEEP, wakeupSystemEvents, timeoutMilliseconds); +} + //--// -typedef void (*PALEVENTLISTENER) (uint32_t e, uint32_t param); +typedef void (*PALEVENTLISTENER)(uint32_t e, uint32_t param); struct PalEventListener : public HAL_DblLinkedNode { PALEVENTLISTENER m_palEventListener; - uint32_t m_eventMask; + uint32_t m_eventMask; }; - HRESULT PalEvent_Initialize(); HRESULT PalEvent_Uninitialize(); HRESULT PalEvent_Post(uint32_t e, uint32_t param); -HRESULT PalEvent_Enlist(PalEventListener* listener); +HRESULT PalEvent_Enlist(PalEventListener *listener); //--// struct PalEventDriver { -public: - + public: HAL_DblLinkedList listenerList; static HRESULT Initialize(); static HRESULT Uninitialize(); static HRESULT PostEvent(uint32_t e, uint32_t param); - static HRESULT EnlistListener(PalEventListener* listener); + static HRESULT EnlistListener(PalEventListener *listener); -private: + private: static bool s_initialized; }; diff --git a/targets/CMSIS-OS/ChibiOS/Include/targetHAL.h b/targets/CMSIS-OS/ChibiOS/Include/targetHAL.h index 869e894c38..ac94d6eca8 100644 --- a/targets/CMSIS-OS/ChibiOS/Include/targetHAL.h +++ b/targets/CMSIS-OS/ChibiOS/Include/targetHAL.h @@ -66,7 +66,6 @@ extern uint32_t __nanoConfig_end__; extern uint32_t __deployment_start__; extern uint32_t __deployment_end__; -#endif //_TARGET_HAL_H_ extern int my_lock_counter; #define GLOBAL_LOCK() \ @@ -83,5 +82,7 @@ extern int my_lock_counter; chSysUnlock(); \ } +#endif //_TARGET_HAL_H_ + //#define GLOBAL_LOCK() chSysLock(); //#define GLOBAL_UNLOCK(); chSysUnlock(); diff --git a/targets/CMSIS-OS/ChibiOS/nanoCLR/targetHAL.cpp b/targets/CMSIS-OS/ChibiOS/nanoCLR/targetHAL.cpp index 9670c35daf..a7f52c41c4 100644 --- a/targets/CMSIS-OS/ChibiOS/nanoCLR/targetHAL.cpp +++ b/targets/CMSIS-OS/ChibiOS/nanoCLR/targetHAL.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include diff --git a/targets/CMSIS-OS/ChibiOS/nanoCLR/targetPAL_Events.cpp b/targets/CMSIS-OS/ChibiOS/nanoCLR/targetPAL_Events.cpp index 7ce2ed76ac..dc633a1504 100644 --- a/targets/CMSIS-OS/ChibiOS/nanoCLR/targetPAL_Events.cpp +++ b/targets/CMSIS-OS/ChibiOS/nanoCLR/targetPAL_Events.cpp @@ -13,63 +13,14 @@ uint64_t CPU_MillisecondsToTicks(uint64_t ticks); // timer for bool events static virtual_timer_t boolEventsTimer; -uint32_t systemEvents; -set_Event_Callback g_Event_Callback = NULL; -void *g_Event_Callback_Arg = NULL; - -bool Events_Initialize() +bool Events_Uninitialize_Platform() { - NATIVE_PROFILE_PAL_EVENTS(); - - // init events atomically - __atomic_clear(&systemEvents, __ATOMIC_RELAXED); - - return true; -} - -bool Events_Uninitialize() -{ - NATIVE_PROFILE_PAL_EVENTS(); - chVTReset(&boolEventsTimer); return true; } -void Events_Set(uint32_t events) -{ - NATIVE_PROFILE_PAL_EVENTS(); - - // set events atomically - __atomic_fetch_or(&systemEvents, events, __ATOMIC_RELAXED); - - if (g_Event_Callback != NULL) - { - g_Event_Callback(g_Event_Callback_Arg); - } -} - -uint32_t Events_Get(uint32_t eventsOfInterest) -{ - NATIVE_PROFILE_PAL_EVENTS(); - - // get the requested flags from system events state and... - uint32_t returnEvents = (systemEvents & eventsOfInterest); - - // ... clear the requested flags atomically - __atomic_fetch_nand(&systemEvents, eventsOfInterest, __ATOMIC_RELAXED); - - // give the caller notice of just the events they asked for ( and were cleared already ) - return returnEvents; -} - -uint32_t Events_MaskedRead(uint32_t eventsOfInterest) -{ - NATIVE_PROFILE_PAL_EVENTS(); - return (systemEvents & eventsOfInterest); -} - static void local_Events_SetBoolTimer_Callback(void *arg) { NATIVE_PROFILE_PAL_EVENTS(); @@ -78,14 +29,6 @@ static void local_Events_SetBoolTimer_Callback(void *arg) *timerCompleteFlag = true; } -void Events_SetCallback(set_Event_Callback pfn, void *arg) -{ - NATIVE_PROFILE_PAL_EVENTS(); - - g_Event_Callback = pfn; - g_Event_Callback_Arg = arg; -} - void Events_SetBoolTimer(bool *timerCompleteFlag, uint32_t millisecondsFromNow) { NATIVE_PROFILE_PAL_EVENTS(); diff --git a/targets/FreeRTOS/NXP/nanoCLR/targetHAL.cpp b/targets/FreeRTOS/NXP/nanoCLR/targetHAL.cpp index 042ded1938..df8c633cac 100644 --- a/targets/FreeRTOS/NXP/nanoCLR/targetHAL.cpp +++ b/targets/FreeRTOS/NXP/nanoCLR/targetHAL.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include diff --git a/targets/FreeRTOS/common/nanoCLR/targetPAL_Events.cpp b/targets/FreeRTOS/common/nanoCLR/targetPAL_Events.cpp index 71dc113320..a58db86edf 100644 --- a/targets/FreeRTOS/common/nanoCLR/targetPAL_Events.cpp +++ b/targets/FreeRTOS/common/nanoCLR/targetPAL_Events.cpp @@ -15,67 +15,22 @@ uint64_t CPU_MillisecondsToTicks(uint64_t ticks); // timer for bool events static TimerHandle_t boolEventsTimer; -volatile uint32_t systemEvents; - static void local_Events_SetBoolTimer_Callback(TimerHandle_t xTimer); -set_Event_Callback g_Event_Callback = NULL; -void *g_Event_Callback_Arg = NULL; - -bool Events_Initialize() +bool Events_Initialize_Platform() { - NATIVE_PROFILE_PAL_EVENTS(); - - // init events atomically - __atomic_clear(&systemEvents, __ATOMIC_RELAXED); - boolEventsTimer = xTimerCreate("boolEventsTimer", 10, pdFALSE, (void *)0, local_Events_SetBoolTimer_Callback); return true; } -bool Events_Uninitialize() +bool Events_Uninitialize_Platform() { - NATIVE_PROFILE_PAL_EVENTS(); - xTimerDelete(boolEventsTimer, 0); return true; } -void Events_Set(uint32_t events) -{ - NATIVE_PROFILE_PAL_EVENTS(); - - // set events atomically - __atomic_fetch_or(&systemEvents, events, __ATOMIC_RELAXED); - - if (g_Event_Callback != NULL) - { - g_Event_Callback(g_Event_Callback_Arg); - } -} - -uint32_t Events_Get(uint32_t eventsOfInterest) -{ - NATIVE_PROFILE_PAL_EVENTS(); - - // get the requested flags from system events state and... - uint32_t returnEvents = (systemEvents & eventsOfInterest); - - // ... clear the requested flags atomically - __atomic_fetch_nand(&systemEvents, eventsOfInterest, __ATOMIC_RELAXED); - - // give the caller notice of just the events they asked for ( and were cleared already ) - return returnEvents; -} - -uint32_t Events_MaskedRead(uint32_t eventsOfInterest) -{ - NATIVE_PROFILE_PAL_EVENTS(); - return (systemEvents & eventsOfInterest); -} - static void local_Events_SetBoolTimer_Callback(TimerHandle_t xTimer) { NATIVE_PROFILE_PAL_EVENTS(); @@ -83,14 +38,6 @@ static void local_Events_SetBoolTimer_Callback(TimerHandle_t xTimer) *timerCompleteFlag = true; } -void Events_SetCallback(set_Event_Callback pfn, void *arg) -{ - NATIVE_PROFILE_PAL_EVENTS(); - - g_Event_Callback = pfn; - g_Event_Callback_Arg = arg; -} - void Events_SetBoolTimer(bool *timerCompleteFlag, uint32_t millisecondsFromNow) { NATIVE_PROFILE_PAL_EVENTS(); diff --git a/targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetHAL.cpp b/targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetHAL.cpp index 5456ded6fc..edfe10c795 100644 --- a/targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetHAL.cpp +++ b/targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetHAL.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include diff --git a/targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetPAL_Events.cpp b/targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetPAL_Events.cpp index 4220d939bf..96c30242c5 100644 --- a/targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetPAL_Events.cpp +++ b/targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetPAL_Events.cpp @@ -14,67 +14,22 @@ uint64_t CPU_MillisecondsToTicks(uint64_t ticks); // timer for bool events static TimerHandle_t boolEventsTimer; -volatile uint32_t systemEvents; - static void local_Events_SetBoolTimer_Callback(TimerHandle_t xTimer); -set_Event_Callback g_Event_Callback = NULL; -void *g_Event_Callback_Arg = NULL; - -bool Events_Initialize() +bool Events_Initialize_Platform() { - NATIVE_PROFILE_PAL_EVENTS(); - - // init events atomically - __atomic_clear(&systemEvents, __ATOMIC_RELAXED); - boolEventsTimer = xTimerCreate("boolEventsTimer", 10, pdFALSE, (void *)0, local_Events_SetBoolTimer_Callback); return true; } -bool Events_Uninitialize() +bool Events_Uninitialize_Platform() { - NATIVE_PROFILE_PAL_EVENTS(); - xTimerDelete(boolEventsTimer, 0); return true; } -void Events_Set(uint32_t events) -{ - NATIVE_PROFILE_PAL_EVENTS(); - - // set events atomically - __atomic_fetch_or(&systemEvents, events, __ATOMIC_RELAXED); - - if (g_Event_Callback != NULL) - { - g_Event_Callback(g_Event_Callback_Arg); - } -} - -uint32_t Events_Get(uint32_t eventsOfInterest) -{ - NATIVE_PROFILE_PAL_EVENTS(); - - // get the requested flags from system events state and... - uint32_t returnEvents = (systemEvents & eventsOfInterest); - - // ... clear the requested flags atomically - __atomic_fetch_nand(&systemEvents, eventsOfInterest, __ATOMIC_RELAXED); - - // give the caller notice of just the events they asked for ( and were cleared already ) - return returnEvents; -} - -uint32_t Events_MaskedRead(uint32_t eventsOfInterest) -{ - NATIVE_PROFILE_PAL_EVENTS(); - return (systemEvents & eventsOfInterest); -} - static void local_Events_SetBoolTimer_Callback(TimerHandle_t xTimer) { NATIVE_PROFILE_PAL_EVENTS(); @@ -83,14 +38,6 @@ static void local_Events_SetBoolTimer_Callback(TimerHandle_t xTimer) *timerCompleteFlag = true; } -void Events_SetCallback(set_Event_Callback pfn, void *arg) -{ - NATIVE_PROFILE_PAL_EVENTS(); - - g_Event_Callback = pfn; - g_Event_Callback_Arg = arg; -} - void Events_SetBoolTimer(bool *timerCompleteFlag, uint32_t millisecondsFromNow) { NATIVE_PROFILE_PAL_EVENTS(); diff --git a/targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetPAL_Events.cpp.groups.cpp b/targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetPAL_Events.cpp.groups.cpp deleted file mode 100644 index 483de3d1be..0000000000 --- a/targets/FreeRTOS_ESP32/ESP32_WROOM_32/nanoCLR/targetPAL_Events.cpp.groups.cpp +++ /dev/null @@ -1,146 +0,0 @@ -// -// Copyright (c) .NET Foundation and Contributors -// See LICENSE file in the project root for full license information. -// - -#include -#include -#include -#include - -#define ESP32_AVAILABLE_EVENTBITS 0x00ffffff - -static void local_Events_SetBoolTimer_Callback( TimerHandle_t xTimer ); - -// events timer -static TimerHandle_t boolEventsTimer; -static bool* saveTimerCompleteFlag = 0; - -EventGroupHandle_t systemEventsHigh; -EventGroupHandle_t systemEventsLow; - -set_Event_Callback g_Event_Callback = NULL; -void* g_Event_Callback_Arg = NULL; - -bool Events_Initialize() -{ - NATIVE_PROFILE_PAL_EVENTS(); - - // init events - // The Eps32 Event group is 24 bits, top 8 bits used by system - // Currently Nanoframework only uses 21 bits, see nanoHal.h - systemEventsHigh = xEventGroupCreate(); - systemEventsLow = xEventGroupCreate(); - - boolEventsTimer = xTimerCreate( "boolEventsTimer", 10, pdFALSE, (void *)0, local_Events_SetBoolTimer_Callback); - - return true; -} - -bool Events_Uninitialize() -{ - NATIVE_PROFILE_PAL_EVENTS(); - - vEventGroupDelete( systemEventsHigh ); - vEventGroupDelete( systemEventsLow); - - return true; -} - -void Events_Set( uint32_t events ) -{ - NATIVE_PROFILE_PAL_EVENTS(); -ets_printf( "Events_set %X\n", events); - // set events - xEventGroupSetBits( systemEventsHigh, events >> 16 ); - xEventGroupSetBits( systemEventsLow, events & 0x00ffff ); - - if( g_Event_Callback != NULL ) - { - g_Event_Callback( g_Event_Callback_Arg ); - } -} - -uint32_t Events_Get( uint32_t eventsOfInterest ) -{ - NATIVE_PROFILE_PAL_EVENTS(); - - // get the requested flags from system events state and... - - uint32_t returnEvents = (xEventGroupGetBits(systemEventsHigh) << 16) & xEventGroupGetBits(systemEventsLow) - - // Make off top 8 bits otherwise get exception when calling xEventGroupClearBits - uint32_t eventstoClear = ~eventsOfInterest; - - // ... clear the requested flags atomically - xEventGroupClearBits(systemEventsHigh, eventstoClear >> 16 ); - xEventGroupClearBits(systemEventsLow, eventstoClear & 0x00ffff ); - - // give the caller notice of just the events they asked for ( and were cleared already ) - return returnEvents; -} - -uint32_t Events_MaskedRead( uint32_t eventsOfInterest ) -{ - NATIVE_PROFILE_PAL_EVENTS(); - - uint32_t returnEvents = (xEventGroupGetBits(systemEventsHigh) << 16) & xEventGroupGetBits(systemEventsLow) - - return ( returnEvents & eventsOfInterest); -} - -static void local_Events_SetBoolTimer_Callback( TimerHandle_t xTimer ) -{ - NATIVE_PROFILE_PAL_EVENTS(); - - *saveTimerCompleteFlag = true; -} - -void Events_SetCallback( set_Event_Callback pfn, void* arg ) -{ - NATIVE_PROFILE_PAL_EVENTS(); - - g_Event_Callback = pfn; - g_Event_Callback_Arg = arg; -} - -void Events_SetBoolTimer( bool* timerCompleteFlag, uint32_t millisecondsFromNow ) -{ - NATIVE_PROFILE_PAL_EVENTS(); - - // we assume only 1 can be active, abort previous just in case - xTimerStop( boolEventsTimer, 0 ); - - if(timerCompleteFlag != NULL) - { - - xTimerChangePeriod( boolEventsTimer, millisecondsFromNow / portTICK_PERIOD_MS, 0 ); - -// Was going to just change existing timer but vTimerSetTimerID() does not exist in this version of FreeRTOS -// As only one timer running at a time we will just save it in global memory - saveTimerCompleteFlag = timerCompleteFlag; - // vTimerSetTimerID( boolEventsTimer, (void *)timerCompleteFlag ); - xTimerStart(boolEventsTimer, 0); - } -} - -uint32_t Events_WaitForEvents( uint32_t powerLevel, uint32_t wakeupSystemEvents, uint32_t timeoutMilliseconds ) -{ - -#if defined(HAL_PROFILE_ENABLED) - Events_WaitForEvents_Calls++; -#endif - - EventBits_t events = (xEventGroupGetBits(systemEventsHigh) << 16) & xEventGroupGetBits(systemEventsLow) - if( events == 0) { - // no events, wait for timeoutMilliseconds - vTaskDelay( timeoutMilliseconds / portTICK_PERIOD_MS ); - } - - return (uint32_t)events; -} - -void FreeManagedEvent(uint8_t category, uint8_t subCategory, uint16_t data1, uint32_t data2) -{ - NATIVE_PROFILE_PAL_EVENTS(); -} diff --git a/targets/TI-SimpleLink/nanoCLR/targetHAL.cpp b/targets/TI-SimpleLink/nanoCLR/targetHAL.cpp index e7eed4934c..7a32fd0ed0 100644 --- a/targets/TI-SimpleLink/nanoCLR/targetHAL.cpp +++ b/targets/TI-SimpleLink/nanoCLR/targetHAL.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include // #include diff --git a/targets/TI-SimpleLink/nanoCLR/targetPAL_Events.cpp b/targets/TI-SimpleLink/nanoCLR/targetPAL_Events.cpp index 0288dec611..d0affd12df 100644 --- a/targets/TI-SimpleLink/nanoCLR/targetPAL_Events.cpp +++ b/targets/TI-SimpleLink/nanoCLR/targetPAL_Events.cpp @@ -17,20 +17,10 @@ uint64_t CPU_MillisecondsToTicks(uint64_t ticks); static Clock_Handle boolEventsTimer; static bool *saveTimerCompleteFlag = 0; -volatile uint32_t systemEvents; - static void local_Events_SetBoolTimer_Callback(UArg arg); -set_Event_Callback g_Event_Callback = NULL; -void *g_Event_Callback_Arg = NULL; - -bool Events_Initialize() +bool Events_Initialize_Platform() { - NATIVE_PROFILE_PAL_EVENTS(); - - // init events atomically - __atomic_clear(&systemEvents, __ATOMIC_RELAXED); - Clock_Params params; Clock_Params_init(¶ms); @@ -43,48 +33,13 @@ bool Events_Initialize() return true; } -bool Events_Uninitialize() +bool Events_Uninitialize_Platform() { - NATIVE_PROFILE_PAL_EVENTS(); - Clock_stop(boolEventsTimer); return true; } -void Events_Set(uint32_t events) -{ - NATIVE_PROFILE_PAL_EVENTS(); - - // set events atomically - __atomic_fetch_or(&systemEvents, events, __ATOMIC_RELAXED); - - if (g_Event_Callback != NULL) - { - g_Event_Callback(g_Event_Callback_Arg); - } -} - -uint32_t Events_Get(uint32_t eventsOfInterest) -{ - NATIVE_PROFILE_PAL_EVENTS(); - - // get the requested flags from system events state and... - uint32_t returnEvents = (systemEvents & eventsOfInterest); - - // ... clear the requested flags atomically - __atomic_fetch_nand(&systemEvents, eventsOfInterest, __ATOMIC_RELAXED); - - // give the caller notice of just the events they asked for ( and were cleared already ) - return returnEvents; -} - -uint32_t Events_MaskedRead(uint32_t eventsOfInterest) -{ - NATIVE_PROFILE_PAL_EVENTS(); - return (systemEvents & eventsOfInterest); -} - static void local_Events_SetBoolTimer_Callback(UArg arg) { NATIVE_PROFILE_PAL_EVENTS(); @@ -94,14 +49,6 @@ static void local_Events_SetBoolTimer_Callback(UArg arg) *saveTimerCompleteFlag = true; } -void Events_SetCallback(set_Event_Callback pfn, void *arg) -{ - NATIVE_PROFILE_PAL_EVENTS(); - - g_Event_Callback = pfn; - g_Event_Callback_Arg = arg; -} - void Events_SetBoolTimer(bool *timerCompleteFlag, uint32_t millisecondsFromNow) { NATIVE_PROFILE_PAL_EVENTS();