FreeRTOS卡在prvCheckTasksWaitingTermination

时间:2019-05-11 23:26:52

标签: delay stm32 freertos

我正在使用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。

我不知道如何解决此问题:(

有人可以帮助我吗?

感谢和问候, 费德里科

1 个答案:

答案 0 :(得分:0)

prvCheckTaskWaitingTermination只是空闲任务的一部分。除非您正在运行无滴答操作,否则只要没有更高优先级的任务能够运行,它就会一直执行。在您的情况下,我将猜测SPI驱动程序正在做一些停止或屏蔽滴答中断的操作,因此时间不会改变,因此延迟永远不会结束。只是一个猜测而已。