From d77ff2f4e918c71920e93b75bceca67028db2c42 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 14 Oct 2021 20:08:28 +0200 Subject: [PATCH] Do not use FreeRTOS functions as long as the scheduler is not started Otherwise interrupts with a logical priority lower than configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY are masked after the first call to xTaskResumeAll() (after the first critical section is entered, and never released). --- radio/src/FreeRTOSConfig.h | 4 ++++ radio/src/syscalls.c | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/radio/src/FreeRTOSConfig.h b/radio/src/FreeRTOSConfig.h index 4ae31c3ae..ef598e888 100644 --- a/radio/src/FreeRTOSConfig.h +++ b/radio/src/FreeRTOSConfig.h @@ -74,6 +74,10 @@ to exclude the API function. */ #define INCLUDE_vTaskDelayUntil 1 #define INCLUDE_vTaskDelay 1 +#if defined(THREADSAFE_MALLOC) +#define INCLUDE_xTaskGetSchedulerState 1 +#endif + /* Cortex-M specific definitions. */ #ifdef __NVIC_PRIO_BITS /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */ diff --git a/radio/src/syscalls.c b/radio/src/syscalls.c index c9de63def..ed3bd31c5 100644 --- a/radio/src/syscalls.c +++ b/radio/src/syscalls.c @@ -53,13 +53,15 @@ extern caddr_t _sbrk(int nbytes) void __malloc_lock(struct _reent *r) { (void)(r); - vTaskSuspendAll(); + if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) + vTaskSuspendAll(); }; void __malloc_unlock(struct _reent *r) { (void)(r); - (void)xTaskResumeAll(); + if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) + (void)xTaskResumeAll(); }; #endif