Приоритет задач FreeRTOS и размер стека

У меня есть плата STM32F746ZG Nucleo-144pin, и я сгенерировал коды с помощью STMCubeMx. Я выбрал FreeRTOS версии 10.0.0, предлагаемой CubeMx, а набор инструментов - SW4STM32.

Я сделал две задачи, и вот моя функция. Мой код здесь:

void led1_task(void)
{
    while(1)
    {
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
        HAL_Delay(1000);
    }
}

void led2_task(void)
{
    while(1)
    {
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14);
        HAL_Delay(4100);
    }
}
  1. Приоритет задачи.

Я обнаружил, что если две задачи имеют одинаковый приоритет задачи, две задачи работают нормально, но если у них разный приоритет задачи, низкая задача не работает.

  xTaskCreate(led1_task, "led1_task", 1024, NULL, 2, NULL);  ==> Works fine.
  xTaskCreate(led2_task, "led2_task", 1024, NULL, 2, NULL);  ==> Works fine.

----------------------------------------------------------------------------

  xTaskCreate(led1_task, "led1_task", 1024, NULL, 2, NULL);  ==> This task is not working.
  xTaskCreate(led2_task, "led2_task", 1024, NULL, 3, NULL);  ==> Works fine.

  1. Размер стека задач.

Если размер стека двух задач в совокупности превышает 3 КБ, было подтверждено, что задача не работает правильно. Код ниже работает правильно.

  xTaskCreate(led1_task, "led1_task", 2048, NULL, 2, NULL);  ==> Works fine.
  xTaskCreate(led2_task, "led2_task", 1024, NULL, 2, NULL);  ==> Works fine.

Однако вторая задача не работает, если размер стека изменить следующим образом.

  xTaskCreate(led1_task, "led1_task", 2048, NULL, 2, NULL);  ==> Works fine.
  xTaskCreate(led2_task, "led2_task", 2048, NULL, 2, NULL);  ==> This task is not working.

Попытка изменить _Min_Stack_Size с 0x400 на 0x4000 в STM32F746ZGTx_FLASH.ld имеет ту же проблему.

/* Generate a link error if heap and stack don't fit into RAM */

_Min_Heap_Size = 0x200; /* required account of heap */

_Min_Stack_Size = 0x4000;  /* required account of stack */

Кто-нибудь может объяснить причину этого?


person Hans    schedule 06.05.2019    source источник


Ответы (1)


Чтобы ответить на ваши вопросы:

  1. Приоритет задачи

Ваша задача с более низким приоритетом не работает, потому что вы используете HAL_Delay. Эта функция выполняет «активную» блокировку, т.е. задача, вызывающая эту функцию, будет проверять внутренний счетчик тиков до тех пор, пока не будет выполнено условие. Другими словами - он не блокирует эту задачу в смысле RTOS. Вы должны использовать vTaskDelay вместо HAL_Delay.

  1. Размер стека задач

Здесь следует отметить несколько моментов.

а. Глубина стека, присвоенная xTaskCreate, указывается в словах, а не в байтах. В вашем примере объединенный размер стеков задач составляет `(2048 + 1024) * sizeof (uint32_t) 'байтов. В вашем случае это много, слишком много для того, чем вы занимаетесь сейчас.

б. Без отладки трудно с уверенностью сказать, почему ваша вторая задача не работает, но весьма вероятно, что вторая задача вообще не будет создана из-за того, что вы достигли некоторого предела, например превышает размер кучи RTOS. Это зависит от того, какую реализацию управления памятью FreeRTOS вы используете (heap_1, heap_2 и т. Д.). Вероятно, вы используете тот, который зависит от configTOTAL_HEAP_SIZE - это определение, которое вы должны проверить и увеличить соответственно.

c. _Min_Heap_Size и _Min_Stack_Size не имеют ничего общего с FreeRTOS (если вы не используете heap_3, который использует malloc внутри). Они соответствуют куче и стеку вне RTOS.

person Jacek Ślimok    schedule 06.05.2019