Приоритет задачи FreeRTOS и размер стека - PullRequest
0 голосов
/ 06 мая 2019

У меня есть плата 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 */

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

Ответы [ 2 ]

3 голосов
/ 06 мая 2019

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

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

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

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

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

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

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

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

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

Ваш ответ подтвердил, что все работает правильно.

  1. Если я использую vTaskDelay () вместо HAL_Delay (), все задачи работают нормально.
  2. Я сделал стекРазмер как тестовый процесс и не будет использовать такой большой размер стека.Если я увеличу размер «configTOTAL_HEAP_SIZE» в коде FreeRTOS, то он будет работать нормально.Но я не изменяю этот размер.Я буду использовать правильный размер стека.

Большое спасибо за ваш ответ.

...