FreeRTOS застрял в osDelay - PullRequest
       171

FreeRTOS застрял в osDelay

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

Я работаю над проектом, использующим STM32F446 с образцом, созданным с помощью STM32CubeMX (для инициализации периферийных устройств и промежуточного программного обеспечения, такого как FreeRTOS с интерфейсом CMSIS-V1).У меня есть два потока, которые общаются с помощью почтовых ящиков, но я столкнулся с проблемой: один из потоков -

void StartDispatcherTask(void const * argument)
{
    mailCommand *commandData = NULL;
    mailCommandResponse *commandResponse = NULL;
    osEvent event;
    for(;;)
    {       
        event = osMailGet(commandMailHandle, osWaitForever);
        commandData = (mailCommand *)event.value.p;

        // Here is the problem
        osDelay(5000);
    }
}

Он задерживается, но никогда не выходит.Есть ли проблема с использованием почтового ящика и задержкой в ​​одном потоке?Я попытался также перенести задержку до for(;;), и она работает.

РЕДАКТИРОВАТЬ: я думаю, я могу попытаться добавить более подробную информацию к проблеме.Первый поток отправляет почту определенного типа, а затем ожидает почту другого типа;поток, в котором я получаю проблему, получает почту, идет первым типом и выполняет некоторый код, основанный на том, что он получает, и затем отправляет результат как письмо второго типа;иногда приходится ждать, используя osDelay, и там он перестает работать, но не вдаваясь в обработчик ошибок

Ответы [ 2 ]

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

osStatus osDelay (uint32_t millisec)

Значение в миллисекундах определяет количество тактов таймера.

Точная задержка зависит от фактического времени, прошедшего с момента последнего такта таймера.

При значении 1 система ожидает, пока следующий таймер не произойдет .

=> Вы должны проверить, работает ли таймер или нет.

проверить эту ссылку

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

Я бы предпочел использовать стандартный API FreeRTOS.Оболочка ARM CMSIS является мусором.

Кстати, я скорее подозреваю, osMailGet(commandMailHandle, osWaitForever);

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

Если есть еще предположения:

  1. Вы приземлились на HF
  2. Вы сложены в переключателе контекста (неправильные приоритеты прерываний)

используйте ваш отладчик и посмотрите, что происходит.

...