Skip to content

Commit

Permalink
freertos: check that mutex is released by owner task
Browse files Browse the repository at this point in the history
Mutex type semaphores should be acquired and released by the same task.
Add a check to xQueueGenericSend for this condition.
  • Loading branch information
igrr authored and espressif-bot committed Mar 11, 2019
1 parent fc4823c commit 13523c9
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 0 deletions.
7 changes: 7 additions & 0 deletions components/freertos/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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
6 changes: 6 additions & 0 deletions components/freertos/include/freertos/FreeRTOSConfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

6 changes: 6 additions & 0 deletions components/freertos/queue.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
21 changes: 21 additions & 0 deletions components/freertos/test/test_freertos_mutex.c
Original file line number Diff line number Diff line change
@@ -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);
}

0 comments on commit 13523c9

Please sign in to comment.