Я работаю с Nucleo-STm32F767 и сгенерировал код с CubeMX, включая FreeRTOS 9.
В моем коде 5 заданий, и у каждого задания есть цикл, в котором задание приостанавливается на каждой итерации.
while( 1 )
{
//Do something
osDelay(TASK_MAIN_DELAY_MS);
}
На данный момент моя система работает хорошо.
Теперь я добавил задачу, которая обрабатывает связь с сетевым контроллером SPI. Сетевой контроллер имеет свое промежуточное программное обеспечение, написанное на C.
Теперь каждый раз, когда я пытаюсь приостановить задачу (с помощью osDelay), мой код помещается в prvCheckTasksWaitingTermination и моя система блокируется навсегда.
static void prvCheckTasksWaitingTermination( void )
{
/** THIS FUNCTION IS CALLED FROM THE RTOS IDLE TASK **/
#if ( INCLUDE_vTaskDelete == 1 )
{
BaseType_t xListIsEmpty;
/* ucTasksDeleted is used to prevent vTaskSuspendAll() being called
too often in the idle task. */
while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U )
{
vTaskSuspendAll();
{
xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination );
}
( void ) xTaskResumeAll();
if( xListIsEmpty == pdFALSE )
{
TCB_t *pxTCB;
taskENTER_CRITICAL();
{
pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) );
( void ) uxListRemove( &( pxTCB->xStateListItem ) );
--uxCurrentNumberOfTasks;
--uxDeletedTasksWaitingCleanUp;
}
taskEXIT_CRITICAL();
prvDeleteTCB( pxTCB );
}
else
{
mtCOVERAGE_TEST_MARKER();
}
}
}
#endif /* INCLUDE_vTaskDelete */
В частности, выполнение здесь останавливается: while (uxDeletedTasksWaitingCleanUp> (UBaseType_t) 0U) потому что uxDeletedTasksWaitingCleanUp равно 0.
Я не знаю, как решить эту проблему: (
Кто-нибудь может мне помочь?
Спасибо и всего наилучшего,
Federico