From fc53bb6ed5c72120ee967c4dc088f82cbef6371f Mon Sep 17 00:00:00 2001 From: Jeroen Domburg Date: Tue, 27 Sep 2016 11:36:30 +0800 Subject: [PATCH] Add UNTESTED_FUNCTION() call to untested functions, make Kconfig option to enable that to map to assert() --- components/freertos/Kconfig | 8 ++++++ components/freertos/croutine.c | 1 + .../include/freertos/FreeRTOSConfig.h | 8 ++++++ components/freertos/queue.c | 6 +++-- components/freertos/tasks.c | 27 +++++++++++++------ 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/components/freertos/Kconfig b/components/freertos/Kconfig index d7c306c24..af7142bb1 100644 --- a/components/freertos/Kconfig +++ b/components/freertos/Kconfig @@ -44,6 +44,14 @@ config FREERTOS_HZ help Select the tick rate at which FreeRTOS does pre-emptive context switching. +config FREERTOS_ASSERT_ON_UNTESTED_FUNCTION + bool "Halt when an SMP-untested function is called" + default y + help + Some functions in FreeRTOS have not been thoroughly tested yet when moving to + the SMP implementation of FreeRTOS. When this option is enabled, these fuctions + will throw an assert(). + choice FREERTOS_CHECK_STACKOVERFLOW prompt "Check for stack overflow" default FREERTOS_CHECK_STACKOVERFLOW_QUICK diff --git a/components/freertos/croutine.c b/components/freertos/croutine.c index 6a36da903..cd596ad45 100644 --- a/components/freertos/croutine.c +++ b/components/freertos/croutine.c @@ -143,6 +143,7 @@ BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPri BaseType_t xReturn; CRCB_t *pxCoRoutine; + UNTESTED_FUNCTION(); //Actually, coroutines are entirely unsupported /* Allocate the memory that will store the co-routine control block. */ pxCoRoutine = ( CRCB_t * ) pvPortMalloc( sizeof( CRCB_t ) ); if( pxCoRoutine ) diff --git a/components/freertos/include/freertos/FreeRTOSConfig.h b/components/freertos/include/freertos/FreeRTOSConfig.h index 089d799dd..466c6404c 100644 --- a/components/freertos/include/freertos/FreeRTOSConfig.h +++ b/components/freertos/include/freertos/FreeRTOSConfig.h @@ -263,5 +263,13 @@ #define configXT_SIMULATOR 0 +#if CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION +#include "rom/ets_sys.h" +#define UNTESTED_FUNCTION() { ets_printf("Untested FreeRTOS function %s\r\n", __FUNCTION__); configASSERT(false); } while(0) +#else +#define UNTESTED_FUNCTION() +#endif + + #endif /* FREERTOS_CONFIG_H */ diff --git a/components/freertos/queue.c b/components/freertos/queue.c index 1fb0552d4..bf4866569 100644 --- a/components/freertos/queue.c +++ b/components/freertos/queue.c @@ -888,7 +888,7 @@ Queue_t * const pxQueue = ( Queue_t * ) xQueue; configASSERT( pxQueue ); configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); - ets_printf("Not Supported: %s\n", __FUNCTION__); + UNTESTED_FUNCTION(); for( ;; ) { taskENTER_CRITICAL(); @@ -1902,6 +1902,7 @@ Queue_t * const pxQueue = ( Queue_t * ) xQueue; BaseType_t xReturn; Queue_t * const pxQueue = ( Queue_t * ) xQueue; + UNTESTED_FUNCTION(); /* If the queue is already full we may have to block. A critical section is required to prevent an interrupt removing something from the queue between the check to see if the queue is full and blocking on the queue. */ @@ -2175,7 +2176,8 @@ Queue_t * const pxQueue = ( Queue_t * ) xQueue; void vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcQueueName ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ { UBaseType_t ux; - + + UNTESTED_FUNCTION(); /* See if there is an empty space in the registry. A NULL name denotes a free slot. */ for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) diff --git a/components/freertos/tasks.c b/components/freertos/tasks.c index b9035bda0..806a047f4 100644 --- a/components/freertos/tasks.c +++ b/components/freertos/tasks.c @@ -129,6 +129,9 @@ functions but without including stdio.h here. */ } while(0) #endif + + + /* Value that can be assigned to the eNotifyState member of the TCB. */ typedef enum { @@ -584,7 +587,6 @@ BaseType_t xReturn; TCB_t * pxNewTCB; StackType_t *pxTopOfStack; BaseType_t i; - configASSERT( pxTaskCode ); configASSERT( ( ( uxPriority & ( ~portPRIVILEGE_BIT ) ) < configMAX_PRIORITIES ) ); configASSERT( (xCoreID>=0 && xCoreID 0U ) ); configASSERT( uxSchedulerSuspended[ xPortGetCoreID() ] == 0 ); @@ -1029,7 +1031,7 @@ BaseType_t i; List_t *pxStateList; const TCB_t * const pxTCB = ( TCB_t * ) xTask; - ets_printf("ToDo %s\n", __FUNCTION__); + UNTESTED_FUNCTION(); configASSERT( pxTCB ); if( pxTCB == pxCurrentTCB[ xPortGetCoreID() ] ) @@ -1099,7 +1101,7 @@ BaseType_t i; TCB_t *pxTCB; UBaseType_t uxReturn; - ets_printf("ToDo %s\n", __FUNCTION__); + UNTESTED_FUNCTION(); taskENTER_CRITICAL(&xTaskQueueMutex); { /* If null is passed in here then we are changing the @@ -1307,7 +1309,7 @@ BaseType_t i; { TCB_t *pxTCB; - ets_printf("ToDo %s\n", __FUNCTION__); + UNTESTED_FUNCTION(); taskENTER_CRITICAL(&xTaskQueueMutex); { /* If null is passed in here then it is the running task that is @@ -1448,7 +1450,7 @@ BaseType_t i; { TCB_t * const pxTCB = ( TCB_t * ) xTaskToResume; - ets_printf("ToDo %s\n", __FUNCTION__); + UNTESTED_FUNCTION(); /* It does not make sense to resume the calling task. */ configASSERT( xTaskToResume ); @@ -1850,7 +1852,7 @@ UBaseType_t uxTaskGetNumberOfTasks( void ) { UBaseType_t uxTask = 0, uxQueue = configMAX_PRIORITIES; - ets_printf("ToDo %s\n", __FUNCTION__); + UNTESTED_FUNCTION(); vTaskSuspendAll(); //WARNING: This only suspends one CPU. ToDo: suspend others as well. Mux using taskQueueMutex maybe? { /* Is there a space in the array for each task in the system? */ @@ -3136,7 +3138,7 @@ UBaseType_t x; { TCB_t *pxTCB; - ets_printf("ToDo %s\n", __FUNCTION__); + UNTESTED_FUNCTION(); /* If null is passed in here then we are deleting ourselves. */ pxTCB = prvGetTCBFromHandle( xTaskToModify ); @@ -3344,6 +3346,7 @@ TCB_t *pxNewTCB; volatile TCB_t *pxNextTCB, *pxFirstTCB; UBaseType_t uxTask = 0; + UNTESTED_FUNCTION(); if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) { listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); @@ -3450,6 +3453,7 @@ TCB_t *pxNewTCB; uint8_t *pucEndOfStack; UBaseType_t uxReturn; + UNTESTED_FUNCTION(); pxTCB = prvGetTCBFromHandle( xTask ); #if portSTACK_GROWTH < 0 @@ -3881,6 +3885,7 @@ scheduler will re-enable the interrupts instead. */ TaskStatus_t *pxTaskStatusArray; volatile UBaseType_t uxArraySize, x; char cStatus; + UNTESTED_FUNCTION(); /* * PLEASE NOTE: @@ -3974,6 +3979,7 @@ scheduler will re-enable the interrupts instead. */ volatile UBaseType_t uxArraySize, x; uint32_t ulTotalTime, ulStatsAsPercentage; + UNTESTED_FUNCTION(); #if( configUSE_TRACE_FACILITY != 1 ) { #error configUSE_TRACE_FACILITY must also be set to 1 in FreeRTOSConfig.h to use vTaskGetRunTimeStats(). @@ -4131,6 +4137,7 @@ TickType_t uxReturn; TickType_t xTimeToWake; uint32_t ulReturn; + UNTESTED_FUNCTION(); taskENTER_CRITICAL(&xTaskQueueMutex); { /* Only block if the notification count is not already non-zero. */ @@ -4241,6 +4248,7 @@ TickType_t uxReturn; TickType_t xTimeToWake; BaseType_t xReturn; + UNTESTED_FUNCTION(); taskENTER_CRITICAL(&xTaskQueueMutex); { /* Only block if a notification is not already pending. */ @@ -4363,6 +4371,7 @@ TickType_t uxReturn; eNotifyValue eOriginalNotifyState; BaseType_t xReturn = pdPASS; + UNTESTED_FUNCTION(); configASSERT( xTaskToNotify ); pxTCB = ( TCB_t * ) xTaskToNotify; @@ -4447,6 +4456,7 @@ TickType_t uxReturn; eNotifyValue eOriginalNotifyState; BaseType_t xReturn = pdPASS; + UNTESTED_FUNCTION(); configASSERT( xTaskToNotify ); pxTCB = ( TCB_t * ) xTaskToNotify; @@ -4540,6 +4550,7 @@ TickType_t uxReturn; TCB_t * pxTCB; eNotifyValue eOriginalNotifyState; + UNTESTED_FUNCTION(); configASSERT( xTaskToNotify );