freertos: check that mutex is released by owner task
Mutex type semaphores should be acquired and released by the same task. Add a check to xQueueGenericSend for this condition.
This commit is contained in:
parent
fc4823c885
commit
13523c95b4
4 changed files with 40 additions and 0 deletions
|
@ -419,4 +419,11 @@ menu "FreeRTOS"
|
|||
abort the application. This option is also required for GDB backtraces and C++
|
||||
exceptions to work correctly inside top-level task functions.
|
||||
|
||||
config FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER
|
||||
bool "Check that mutex semaphore is given by owner task"
|
||||
default y
|
||||
help
|
||||
If enabled, assert that when a mutex semaphore is given, the task giving the
|
||||
semaphore is the task which is currently holding the mutex.
|
||||
|
||||
endmenu
|
||||
|
|
|
@ -314,5 +314,11 @@ extern void vPortCleanUpTCB ( void *pxTCB );
|
|||
#endif /* def __ASSEMBLER__ */
|
||||
#endif
|
||||
|
||||
#if CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER
|
||||
#define configCHECK_MUTEX_GIVEN_BY_OWNER 1
|
||||
#else
|
||||
#define configCHECK_MUTEX_GIVEN_BY_OWNER 0
|
||||
#endif
|
||||
|
||||
#endif /* FREERTOS_CONFIG_H */
|
||||
|
||||
|
|
|
@ -724,6 +724,12 @@ Queue_t * const pxQueue = ( Queue_t * ) xQueue;
|
|||
configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );
|
||||
}
|
||||
#endif
|
||||
#if ( configUSE_MUTEXES == 1 && configCHECK_MUTEX_GIVEN_BY_OWNER == 1)
|
||||
{
|
||||
configASSERT(pxQueue->uxQueueType != queueQUEUE_IS_MUTEX || pxQueue->pxMutexHolder == NULL || xTaskGetCurrentTaskHandle() == pxQueue->pxMutexHolder);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/* This function relaxes the coding standard somewhat to allow return
|
||||
|
|
21
components/freertos/test/test_freertos_mutex.c
Normal file
21
components/freertos/test/test_freertos_mutex.c
Normal file
|
@ -0,0 +1,21 @@
|
|||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "freertos/semphr.h"
|
||||
#include "unity.h"
|
||||
#include "esp_ipc.h"
|
||||
#include "test_utils.h"
|
||||
|
||||
static void mutex_release_task(void* arg)
|
||||
{
|
||||
SemaphoreHandle_t mutex = (SemaphoreHandle_t) arg;
|
||||
xSemaphoreGive(mutex);
|
||||
TEST_FAIL_MESSAGE("should not be reached");
|
||||
}
|
||||
|
||||
TEST_CASE("mutex released not by owner causes an assert", "[freertos][reset=abort,SW_CPU_RESET]")
|
||||
{
|
||||
SemaphoreHandle_t mutex = xSemaphoreCreateMutex();
|
||||
xSemaphoreTake(mutex, portMAX_DELAY);
|
||||
xTaskCreate(&mutex_release_task, "mutex_release", 2048, mutex, UNITY_FREERTOS_PRIORITY + 1, NULL);
|
||||
vTaskDelay(1);
|
||||
}
|
Loading…
Reference in a new issue