From: Jeroen Domburg Date: Mon, 22 Aug 2016 09:36:32 +0000 (+0800) Subject: Add static initializers for muxes, add mutex init to vPortCPUAcquireMutex X-Git-Tag: v0.9~96^2~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=925fbb587e3be78a8db88859d8219afc4a47ea9e;p=esp-idf Add static initializers for muxes, add mutex init to vPortCPUAcquireMutex --- diff --git a/components/freertos/event_groups.c b/components/freertos/event_groups.c index 1aa95e0841..0eafab10a5 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 d1ab6240b6..491a1fe6eb 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 b659a8271e..c698cb8cb3 100644 --- a/components/freertos/include/freertos/portmacro.h +++ b/components/freertos/include/freertos/portmacro.h @@ -147,6 +147,13 @@ typedef struct { #define portMUX_VAL_MASK 0x000000FF #define portMUX_VAL_SHIFT 0 +//Keep this in sync with the portMUX_TYPE struct definition +#ifdef portMUX_DEBUG +#define portMUX_INITIALIZER_UNLOCKED { portMUX_MAGIC_VAL|portMUX_FREE_VAL } +#else +#define portMUX_INITIALIZER_UNLOCKED { portMUX_MAGIC_VAL|portMUX_FREE_VAL, "(never locked)", -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 fd7760e014..0be29c1907 100644 --- a/components/freertos/port.c +++ b/components/freertos/port.c @@ -297,7 +297,8 @@ 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); + asm("break.n 1"); mux->mux=portMUX_FREE_VAL; } #endif diff --git a/components/freertos/queue.c b/components/freertos/queue.c index 337352fca8..92e182a620 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 d747708eb0..f0e4fb120a 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 7c0ba5bd9a..92e4bf94ad 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 )