diff --git a/FreeRTOS/Source b/FreeRTOS/Source index fcc665325c..78069a79ea 160000 --- a/FreeRTOS/Source +++ b/FreeRTOS/Source @@ -1 +1 @@ -Subproject commit fcc665325c033065cb6fd89d18a92f2ca611495e +Subproject commit 78069a79ea8f9d17c0eae88c417fd41e2c54a2cd diff --git a/FreeRTOS/Test/CMock/queue/generic/queue_delete_dynamic_utest.c b/FreeRTOS/Test/CMock/queue/generic/queue_delete_dynamic_utest.c index 8cbed72ff6..f41fb4267a 100644 --- a/FreeRTOS/Test/CMock/queue/generic/queue_delete_dynamic_utest.c +++ b/FreeRTOS/Test/CMock/queue/generic/queue_delete_dynamic_utest.c @@ -129,3 +129,74 @@ void test_vQueueDelete_full( void ) vQueueDelete( xQueue ); TEST_ASSERT_EQUAL_PTR( ( void * ) xQueue, getLastFreedAddress() ); } + +/** + * @brief Test vQueueDelete asserts when tasks are waiting to send and waiting to receive + * @details Verify that vQueueDelete triggers a configASSERT when both the + * xTasksWaitingToSend and xTasksWaitingToReceive lists are non-empty. + * @coverage vQueueDelete + */ +void test_vQueueDelete_assert_tasks_waiting_to_send_and_receive( void ) +{ + QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) ); + + /* Add a fake task to the WaitingToSend list */ + td_task_addFakeTaskWaitingToSendToQueue( xQueue ); + + /* Expect the assert to fire due to non-empty WaitingToSend list */ + EXPECT_ASSERT_BREAK( vQueueDelete( xQueue ) ); + + /* Clean up the fake task from the list */ + td_task_removeFakeTaskFromList(); + + /* Now add a fake task to WaitingToReceive and verify that assert fires too */ + td_task_addFakeTaskWaitingToReceiveFromQueue( xQueue ); + + EXPECT_ASSERT_BREAK( vQueueDelete( xQueue ) ); + + /* Clean up and delete */ + td_task_removeFakeTaskFromList(); + vQueueDelete( xQueue ); +} + +/** + * @brief Test vQueueDelete asserts when tasks are waiting to send only + * @details Verify that vQueueDelete triggers a configASSERT when the + * xTasksWaitingToSend list is non-empty. + * @coverage vQueueDelete + */ +void test_vQueueDelete_assert_tasks_waiting_to_send( void ) +{ + QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) ); + + /* Add a fake task to the WaitingToSend list */ + td_task_addFakeTaskWaitingToSendToQueue( xQueue ); + + /* Expect the assert to fire due to non-empty WaitingToSend list */ + EXPECT_ASSERT_BREAK( vQueueDelete( xQueue ) ); + + /* Clean up and delete */ + td_task_removeFakeTaskFromList(); + vQueueDelete( xQueue ); +} + +/** + * @brief Test vQueueDelete asserts when tasks are waiting to receive only + * @details Verify that vQueueDelete triggers a configASSERT when the + * xTasksWaitingToReceive list is non-empty. + * @coverage vQueueDelete + */ +void test_vQueueDelete_assert_tasks_waiting_to_receive( void ) +{ + QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) ); + + /* Add a fake task to the WaitingToReceive list */ + td_task_addFakeTaskWaitingToReceiveFromQueue( xQueue ); + + /* Expect the assert to fire due to non-empty WaitingToReceive list */ + EXPECT_ASSERT_BREAK( vQueueDelete( xQueue ) ); + + /* Clean up and delete */ + td_task_removeFakeTaskFromList(); + vQueueDelete( xQueue ); +} diff --git a/FreeRTOS/Test/CMock/queue/queue_utest_common.h b/FreeRTOS/Test/CMock/queue/queue_utest_common.h index bed06e0cc6..73d3400b57 100644 --- a/FreeRTOS/Test/CMock/queue/queue_utest_common.h +++ b/FreeRTOS/Test/CMock/queue/queue_utest_common.h @@ -326,6 +326,13 @@ void td_task_addFakeTaskWaitingToSendToQueue( QueueHandle_t xQueue ); */ void td_task_addFakeTaskWaitingToReceiveFromQueue( QueueHandle_t xQueue ); +/** + * @brief Remove the fake task from whatever waiting list it is currently in. + * @details This should be called before deleting a queue that has a fake task + * in one of its waiting lists (xTasksWaitingToSend or xTasksWaitingToReceive). + */ +void td_task_removeFakeTaskFromList( void ); + /** * @brief Test double for xTaskCheckForTimeOut */ diff --git a/FreeRTOS/Test/CMock/queue/semaphore/mutex_utest.c b/FreeRTOS/Test/CMock/queue/semaphore/mutex_utest.c index 89a9b02d2e..2dccad98f9 100644 --- a/FreeRTOS/Test/CMock/queue/semaphore/mutex_utest.c +++ b/FreeRTOS/Test/CMock/queue/semaphore/mutex_utest.c @@ -540,6 +540,9 @@ void test_macro_xSemaphoreTake_blocking_mutex_inherit_timeout_high_prio_waiting( TEST_ASSERT_EQUAL( TICKS_TO_WAIT + 1, td_task_getCount_YieldFromTaskResumeAll() ); + /* Remove the fake task from the waiting list before deleting the semaphore */ + td_task_removeFakeTaskFromList(); + vSemaphoreDelete( xSemaphore ); } diff --git a/FreeRTOS/Test/CMock/queue/td_task.c b/FreeRTOS/Test/CMock/queue/td_task.c index eff0cdc601..50bab55419 100644 --- a/FreeRTOS/Test/CMock/queue/td_task.c +++ b/FreeRTOS/Test/CMock/queue/td_task.c @@ -290,6 +290,14 @@ void td_task_addFakeTaskWaitingToReceiveFromQueue( QueueHandle_t xQueue ) vListInsert( pxTasksWaitingToReceive, &fakeTaskListItem ); } +void td_task_removeFakeTaskFromList( void ) +{ + if( listLIST_ITEM_CONTAINER( &fakeTaskListItem ) != NULL ) + { + uxListRemove( &fakeTaskListItem ); + } +} + TickType_t td_task_getFakeTaskPriority( void ) { return( configMAX_PRIORITIES - fakeTaskListItem.xItemValue ); diff --git a/manifest.yml b/manifest.yml index 4062621520..c135e044f6 100644 --- a/manifest.yml +++ b/manifest.yml @@ -5,7 +5,7 @@ license: "MIT" dependencies: - name: "FreeRTOS-Kernel" - version: "fcc6653" + version: "78069a7" repository: type: "git" url: "https://github.com/FreeRTOS/FreeRTOS-Kernel.git"