diff --git a/components/freertos/event_groups.c b/components/freertos/event_groups.c index 1aa95e084..0eafab10a 100644 --- a/components/freertos/event_groups.c +++ b/components/freertos/event_groups.c @@ -123,7 +123,7 @@ typedef struct xEventGroupDefinition /* Again: one mux for all events. Maybe this can be made more granular. ToDo: look into that. -JD */ -static portMUX_TYPE xEventGroupMux; +static portMUX_TYPE xEventGroupMux = portMUX_INITIALIZER_UNLOCKED; static BaseType_t xMuxInitialized = pdFALSE; diff --git a/components/freertos/heap_regions.c b/components/freertos/heap_regions.c index d1ab6240b..491a1fe6e 100644 --- a/components/freertos/heap_regions.c +++ b/components/freertos/heap_regions.c @@ -155,7 +155,7 @@ typedef struct A_BLOCK_LINK } BlockLink_t; //Mux to protect the memory status data -static portMUX_TYPE xMallocMutex; +static portMUX_TYPE xMallocMutex = portMUX_INITIALIZER_UNLOCKED; /*-----------------------------------------------------------*/ diff --git a/components/freertos/include/freertos/portmacro.h b/components/freertos/include/freertos/portmacro.h index b659a8271..bb574a1aa 100644 --- a/components/freertos/include/freertos/portmacro.h +++ b/components/freertos/include/freertos/portmacro.h @@ -147,6 +147,19 @@ typedef struct { #define portMUX_VAL_MASK 0x000000FF #define portMUX_VAL_SHIFT 0 +//Keep this in sync with the portMUX_TYPE struct definition please. +#ifdef portMUX_DEBUG +#define portMUX_INITIALIZER_UNLOCKED { \ + .mux = portMUX_MAGIC_VAL|portMUX_FREE_VAL \ + } +#else +#define portMUX_INITIALIZER_UNLOCKED { \ + .mux = portMUX_MAGIC_VAL|portMUX_FREE_VAL, \ + .lastLockedFn = "(never locked)", \ + .lastLockedLine = -1 \ + } +#endif + /* Critical section management. NW-TODO: replace XTOS_SET_INTLEVEL with more efficient version, if any? */ // These cannot be nested. They should be used with a lot of care and cannot be called from interrupt level. #define portDISABLE_INTERRUPTS() do { XTOS_SET_INTLEVEL(XCHAL_EXCM_LEVEL); portbenchmarkINTERRUPT_DISABLE(); } while (0) diff --git a/components/freertos/port.c b/components/freertos/port.c index fd7760e01..8f0a617af 100644 --- a/components/freertos/port.c +++ b/components/freertos/port.c @@ -297,7 +297,7 @@ void vPortCPUAcquireMutex(portMUX_TYPE *mux) { #ifdef portMUX_DEBUG uint32_t cnt=(1<<16); if ( (mux->mux & portMUX_MAGIC_MASK) != portMUX_MAGIC_VAL ) { - ets_printf("ERROR: vPortCPUAcquireMutex: mux %p is uninitialized (0x%X)!\n", mux, mux->mux); + ets_printf("ERROR: vPortCPUAcquireMutex: mux %p is uninitialized (0x%X)! Called from %s line %d.\n", mux, mux->mux, fnName, line); mux->mux=portMUX_FREE_VAL; } #endif diff --git a/components/freertos/queue.c b/components/freertos/queue.c index 337352fca..92e182a62 100644 --- a/components/freertos/queue.c +++ b/components/freertos/queue.c @@ -460,6 +460,8 @@ int8_t *pcAllocatedBuffer; vListInitialise( &( pxNewQueue->xTasksWaitingToSend ) ); vListInitialise( &( pxNewQueue->xTasksWaitingToReceive ) ); + vPortCPUInitializeMutex(&pxNewQueue->mux); + traceCREATE_MUTEX( pxNewQueue ); /* Start with the semaphore in the expected state. */ diff --git a/components/freertos/tasks.c b/components/freertos/tasks.c index d747708eb..f0e4fb120 100644 --- a/components/freertos/tasks.c +++ b/components/freertos/tasks.c @@ -273,8 +273,8 @@ PRIVILEGED_DATA static volatile UBaseType_t uxSchedulerSuspended[ portNUM_PROCES PRIVILEGED_DATA static portBASE_TYPE xMutexesInitialised = pdFALSE; /* For now, we use just one mux for all the critical sections. ToDo: give evrything a bit more granularity; that could improve performance by not needlessly spinning in spinlocks for unrelated resources. */ -PRIVILEGED_DATA static portMUX_TYPE xTaskQueueMutex; -PRIVILEGED_DATA static portMUX_TYPE xTickCountMutex; +PRIVILEGED_DATA static portMUX_TYPE xTaskQueueMutex = portMUX_INITIALIZER_UNLOCKED; +PRIVILEGED_DATA static portMUX_TYPE xTickCountMutex = portMUX_INITIALIZER_UNLOCKED; #if ( configGENERATE_RUN_TIME_STATS == 1 ) diff --git a/components/freertos/timers.c b/components/freertos/timers.c index 7c0ba5bd9..92e4bf94a 100644 --- a/components/freertos/timers.c +++ b/components/freertos/timers.c @@ -170,7 +170,7 @@ PRIVILEGED_DATA static List_t *pxOverflowTimerList; PRIVILEGED_DATA static QueueHandle_t xTimerQueue = NULL; /* Mux. We use a single mux for all the timers for now. ToDo: maybe increase granularity here? */ -PRIVILEGED_DATA portMUX_TYPE xTimerMux; +PRIVILEGED_DATA portMUX_TYPE xTimerMux = portMUX_INITIALIZER_UNLOCKED; #if ( INCLUDE_xTimerGetTimerDaemonTaskHandle == 1 )