From 135fffcf55716736cda842132c209437bf336f78 Mon Sep 17 00:00:00 2001 From: pennam Date: Wed, 19 Feb 2025 14:18:54 +0100 Subject: [PATCH 1/6] Revert "freertos: declare start_freertos_on_header_inclusion only if required" This reverts commit b83fd201289ab7925d9062064f605dcee2372d20. --- libraries/Arduino_FreeRTOS/src/portable/FSP/port.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c b/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c index 3fd8c53c..598de672 100644 --- a/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c +++ b/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c @@ -225,7 +225,6 @@ static void prvTaskExitError(void); #endif -#ifdef PROVIDE_FREERTOS_HOOK void loop_thread_func(void* arg) { while (1) { @@ -246,7 +245,6 @@ void start_freertos_on_header_inclusion() { vTaskStartScheduler(); } -#endif /* Arduino specific overrides */ void delay(uint32_t ms) { From 117ce05bedcf63c9d03457ada59a34f806f96b60 Mon Sep 17 00:00:00 2001 From: pennam Date: Wed, 19 Feb 2025 14:19:02 +0100 Subject: [PATCH 2/6] Revert "Provide FreeRTOS hook only for PortentaC33" This reverts commit acb578e2610d7566f39fd0e8419ff38e460798a2. --- boards.txt | 2 +- cores/arduino/main.cpp | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/boards.txt b/boards.txt index b6815e8d..d89c412a 100644 --- a/boards.txt +++ b/boards.txt @@ -12,7 +12,7 @@ portenta_c33.build.fpu=-mfpu=fpv5-sp-d16 portenta_c33.build.float-abi=-mfloat-abi=hard portenta_c33.build.board=PORTENTA_C33 -portenta_c33.build.defines=-DF_CPU=200000000 -DPROVIDE_FREERTOS_HOOK +portenta_c33.build.defines=-DF_CPU=200000000 portenta_c33.vid.0=0x2341 portenta_c33.pid.0=0x0068 portenta_c33.vid.1=0x2341 diff --git a/cores/arduino/main.cpp b/cores/arduino/main.cpp index 24dfa3ec..1d8c1386 100644 --- a/cores/arduino/main.cpp +++ b/cores/arduino/main.cpp @@ -113,9 +113,7 @@ void arduino_main(void) #endif startAgt(); setup(); -#ifdef PROVIDE_FREERTOS_HOOK start_freertos_on_header_inclusion(); -#endif while (1) { loop(); From 4bd9c6f4ab73574a4f2ab20b0f1224b7f9ee06a0 Mon Sep 17 00:00:00 2001 From: pennam Date: Wed, 19 Feb 2025 14:19:10 +0100 Subject: [PATCH 3/6] Revert "Move freertos hook between setup() and loop()" This reverts commit 3a3cfe47b5ad977dd1cbf73eb8cad299edd02f37. --- cores/arduino/main.cpp | 2 +- libraries/Arduino_FreeRTOS/src/portable/FSP/port.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cores/arduino/main.cpp b/cores/arduino/main.cpp index 1d8c1386..8a1e1b2f 100644 --- a/cores/arduino/main.cpp +++ b/cores/arduino/main.cpp @@ -112,8 +112,8 @@ void arduino_main(void) Serial.begin(115200); #endif startAgt(); - setup(); start_freertos_on_header_inclusion(); + setup(); while (1) { loop(); diff --git a/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c b/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c index 598de672..036bd626 100644 --- a/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c +++ b/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c @@ -226,6 +226,7 @@ static void prvTaskExitError(void); #endif void loop_thread_func(void* arg) { + setup(); while (1) { loop(); From 00692e699433b59cbaf01a4ea3435848bca4024d Mon Sep 17 00:00:00 2001 From: pennam Date: Wed, 19 Feb 2025 14:19:17 +0100 Subject: [PATCH 4/6] Revert "freertos: start scheduler and loop task on header inclusion" This reverts commit fee8ca9afedb0b768ddee7264c26dd6ec76aefd5. --- cores/arduino/main.cpp | 2 -- .../Arduino_FreeRTOS/src/portable/FSP/port.c | 22 ------------------- 2 files changed, 24 deletions(-) diff --git a/cores/arduino/main.cpp b/cores/arduino/main.cpp index 8a1e1b2f..85e22808 100644 --- a/cores/arduino/main.cpp +++ b/cores/arduino/main.cpp @@ -64,7 +64,6 @@ void unsecure_registers() { #define str(s) #s extern "C" void Stacktrace_Handler(void); -extern "C" __attribute__((weak)) void start_freertos_on_header_inclusion() {} void arduino_main(void) { @@ -112,7 +111,6 @@ void arduino_main(void) Serial.begin(115200); #endif startAgt(); - start_freertos_on_header_inclusion(); setup(); while (1) { diff --git a/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c b/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c index 036bd626..c0b5938d 100644 --- a/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c +++ b/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c @@ -225,28 +225,6 @@ static void prvTaskExitError(void); #endif -void loop_thread_func(void* arg) { - setup(); - while (1) - { - loop(); - } -} - -static TaskHandle_t loop_task; -void start_freertos_on_header_inclusion() { - xTaskCreate( - (TaskFunction_t)loop_thread_func, - "Loop Thread", - 4096 / 4, /* usStackDepth in words */ - NULL, /* pvParameters */ - 4, /* uxPriority */ - &loop_task /* pxCreatedTask */ - ); - - vTaskStartScheduler(); -} - /* Arduino specific overrides */ void delay(uint32_t ms) { if (xTaskGetSchedulerState() == taskSCHEDULER_RUNNING) { From 71e2fd21fb68c5c0ee7d112ed4e10cbc6f4ebe39 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Wed, 19 Feb 2025 14:22:46 +0100 Subject: [PATCH 5/6] FreeRTOS: allow override startup hooks default implementation The default behaviour is do nothing: scheduler has to be started manually by the user. Use AUTOSTART_FREERTOS if you declare tasks in your setup() and use them in loop(). Use EARLY_AUTOSTART_FREERTOS if you need the scheduler to be already running in setup(). Libraries that need to use threads/semaphores during setup() (for example, to implement the usual myObj.begin(); <- this starts a thread while (!myObj) { <- this becomes true when the thread is unlocked delay(); } will need to declare EARLY_START_FREERTOS_HOOK in one of their cpp files --- cores/arduino/main.cpp | 4 +++ .../Arduino_FreeRTOS/src/Arduino_FreeRTOS.h | 21 ++++++++++++++ .../Arduino_FreeRTOS/src/portable/FSP/port.c | 28 +++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/cores/arduino/main.cpp b/cores/arduino/main.cpp index 85e22808..f73ab965 100644 --- a/cores/arduino/main.cpp +++ b/cores/arduino/main.cpp @@ -64,6 +64,8 @@ void unsecure_registers() { #define str(s) #s extern "C" void Stacktrace_Handler(void); +extern "C" __attribute__((weak)) void start_freertos_on_header_inclusion() {} +extern "C" __attribute__((weak)) void early_start_freertos_on_header_inclusion() {} void arduino_main(void) { @@ -111,7 +113,9 @@ void arduino_main(void) Serial.begin(115200); #endif startAgt(); + early_start_freertos_on_header_inclusion(); setup(); + start_freertos_on_header_inclusion(); while (1) { loop(); diff --git a/libraries/Arduino_FreeRTOS/src/Arduino_FreeRTOS.h b/libraries/Arduino_FreeRTOS/src/Arduino_FreeRTOS.h index 8e58dedd..1edfa529 100644 --- a/libraries/Arduino_FreeRTOS/src/Arduino_FreeRTOS.h +++ b/libraries/Arduino_FreeRTOS/src/Arduino_FreeRTOS.h @@ -27,6 +27,27 @@ extern "C" { #include "lib/FreeRTOS-Kernel-v10.5.1/semphr.h" #include "lib/FreeRTOS-Kernel-v10.5.1/task.h" #include "lib/FreeRTOS-Kernel-v10.5.1/timers.h" +#include + + +// If you need to automatically start FREERTOS, declare either EARLY_AUTOSTART_FREERTOS or +// AUTOSTART_FREERTOS in your library or sketch code (.ino or .cpp file) +// +// EARLY_AUTOSTART_FREERTOS -> if you need the scheduler to be already running in setup() +// AUTOSTART_FREERTOS -> if you only declare the threads in setup() and use them in loop() + +void _start_freertos_on_header_inclusion_impl(bool early_start); +void early_start_freertos_on_header_inclusion(); +void start_freertos_on_header_inclusion(); +#define EARLY_AUTOSTART_FREERTOS \ + void early_start_freertos_on_header_inclusion() { \ + _start_freertos_on_header_inclusion_impl(true); \ + } +#define AUTOSTART_FREERTOS \ + void start_freertos_on_header_inclusion() { \ + _start_freertos_on_header_inclusion_impl(false); \ + } + #ifdef __cplusplus } diff --git a/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c b/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c index c0b5938d..a4d3c6fe 100644 --- a/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c +++ b/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c @@ -32,6 +32,7 @@ #include "FreeRTOSConfig.h" #include "../../lib/FreeRTOS-Kernel-v10.5.1/FreeRTOS.h" #include "../../lib/FreeRTOS-Kernel-v10.5.1/task.h" +#include "portmacro.h" #if BSP_TZ_NONSECURE_BUILD #include "tz_context.h" @@ -225,6 +226,33 @@ static void prvTaskExitError(void); #endif + +static void sketch_thread_func(void* arg) { + bool early_start = (bool)arg; + if (early_start) { + setup(); + } + while (1) + { + loop(); + } +} + +void _start_freertos_on_header_inclusion_impl(bool early_start) { + static TaskHandle_t sketch_task; + if (xTaskGetSchedulerState() != taskSCHEDULER_RUNNING) { + xTaskCreate( + (TaskFunction_t)sketch_thread_func, + "Sketch Thread", + 4096 / 4, /* usStackDepth in words */ + (void*)early_start, /* pvParameters */ + 4, /* uxPriority */ + &sketch_task /* pxCreatedTask */ + ); + vTaskStartScheduler(); + } +} + /* Arduino specific overrides */ void delay(uint32_t ms) { if (xTaskGetSchedulerState() == taskSCHEDULER_RUNNING) { From 11fb7288fabc59e5b3c5c363999caee6dc2b48e2 Mon Sep 17 00:00:00 2001 From: pennam Date: Wed, 19 Feb 2025 14:48:48 +0100 Subject: [PATCH 6/6] FreeRTOS port: add setup() and loop() extern declaration --- libraries/Arduino_FreeRTOS/src/portable/FSP/port.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c b/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c index a4d3c6fe..f2b59f9b 100644 --- a/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c +++ b/libraries/Arduino_FreeRTOS/src/portable/FSP/port.c @@ -226,6 +226,8 @@ static void prvTaskExitError(void); #endif +extern void setup(void); +extern void loop(void); static void sketch_thread_func(void* arg) { bool early_start = (bool)arg;