我正在使用Nucleo-STm32F767,并且已经使用包括FreeRTOS 9的CubeMX生成了代码。
我的代码有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。
我不知道如何解决此问题:(
有人可以帮助我吗?
感谢和问候, 费德里科
答案 0 :(得分:0)
prvCheckTaskWaitingTermination只是空闲任务的一部分。除非您正在运行无滴答操作,否则只要没有更高优先级的任务能够运行,它就会一直执行。在您的情况下,我将猜测SPI驱动程序正在做一些停止或屏蔽滴答中断的操作,因此时间不会改变,因此延迟永远不会结束。只是一个猜测而已。