FreeRTOS застрял на prvCheckTasksWaitingTermination - PullRequest
0 голосов
/ 12 мая 2019

Я работаю с 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

1 Ответ

0 голосов
/ 12 мая 2019

prvCheckTaskWaitingTermination - это только часть бездействующей задачи.Если вы не запускаете тиканье, оно будет продолжаться до тех пор, пока не будут выполнены задачи с более высоким приоритетом.В вашем случае я собираюсь предположить, что драйвер SPI делает что-то, что останавливает или маскирует тиковое прерывание, чтобы время не менялось, поэтому задержки никогда не заканчивались.Просто предположение, хотя.

...