我正在使用Nucleo-STm32F767,我已经用CubeMX (包括FreeRTOS 9 )生成了代码。
我的代码有5个任务,每个任务都有一个循环,任务在每次迭代时挂起。
while( 1 )
{
//Do something
osDelay(TASK_MAIN_DELAY_MS);
}
在这一点上,我的系统运行良好。
现在,我添加了一个任务来处理与SPI网络控制器的通信。网络控制器使用C语言编写了自己的中间件。
现在,每当我尝试挂起一个任务(使用prvCheckTasksWaitingTermination )时,我的代码就会被塞进osDelay中,并且我的系统将永远被阻塞。
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 */
特别是,在这里停止了执行:而( uxDeletedTasksWaitingCleanUp >( UBaseType_t ) 0U ),因为uxDeletedTasksWaitingCleanUp等于0。
我不知道如何解决这个问题
有人能帮我吗?
谢谢并致以最良好的问候,费德里科
发布于 2022-07-19 19:05:30
我不知道这是否会对你的问题有所帮助,但我遇到了同样的问题,并能够克服它。
在我的freertos.cpp文件中,我连续执行了几个任务。但是,第二个任务正在执行,但每次都会失败,因为它试图使用的外围设备不能正常工作。看来,既然我对此没有兴趣,它就很难跳出任务。
一旦我修复了外围设备(在我的例子中,是一个试图连接到不可访问服务器的蜂窝调制解调器),程序就会正常执行,并且不会卡在这个prvCheckTasksWaitingTermination函数中。
因此,在您的情况下,这可能表明您的SPI配置存在需要注意的问题。
我希望这能帮到你。
https://stackoverflow.com/questions/56095025
复制相似问题