Задача блокировки с помощью флагов событий останавливает программу - PullRequest
0 голосов
/ 08 марта 2020

Я интегрирую FreeRTOS cmsis_v2 на свой STM32F303VCx и сталкиваюсь с определенной проблемой, а затем использую флаги событий при блокировке задачи, чтобы дождаться подтверждения операции от другой задачи.

Если задача выполняет следующий код, все другие задачи получают минимальное время выполнения (понятно, потому что ОС постоянно проверяет evt_flg):

for(;;)
{       
    flag = osEventFlagsWait (evt_flg, EventOccured, osFlagsWaitAny, 0);
    if (flag == EventOccured)
    {
      /* Task main route */
      osEventFlagsClear (evt_flg,EventOccured);
    }
 }

Но если установить таймаут на osWaitForver: osEventFlagsWait (evt_flg, EventOccured, osFlagsWaitAny, osWaitForver ), вся программа перейдет в HardFault.

Каково лучшее решение для такого поведения? Мне нужна задача, чтобы дождаться флага и не блокировать запуск других, таких как чтение ввода терминала.

1 Ответ

0 голосов
/ 15 апреля 2020

Код задачи, который задает вопрос, постоянно занят, опрашивая событие RTOS. Это антипаттерн дизайна, практически всегда лучше иметь блок задач, пока не сработает источник события. Единственное исключение, при котором вызов osEventFlagsWait() с нулевым тайм-аутом может иметь больше смысла, если вам приходится отслеживать несколько разных источников событий / данных, для которых нет общего API-интерфейса RTOS, которого можно ждать (и даже тогда это только «запасной выход»). Следовательно, следует использовать osWaitForver.

Далее следует искать причину HardFault. В одиночку в этом коде задачи я не вижу причины для этого - источник HardFault, вероятно, где-то еще. Когда из зоны может появиться HardFault, это может стоить нового вопроса (или уже исправленного). Удачи!

...