Перейти к содержанию
    

Как во FreeRTOS остановить и запустить задачу ?

Друзья,

имеется микроконтроллер STM32H743, TouchGFX, FreeRTOS и несколько задач.

Чтобы задачи без дела не съедали процессорное время я ненужные задачи в данный момент отключаю -  vTaskSuspend(UartTaskHandle).

Потом у меня в "main.c" срабатывает прерывание по приему данных из UART.

И я хочу активировать задачу обработчик данных, вызываю vTaskResume(UartTaskHandle). В результате все намертво виснет, черный экран.

Не могу понять, что я делаю не так ? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/8/2022 at 5:32 PM, TOG said:

vTaskSuspend(UartTaskHandle).

ИМХО, это грубый подход. В лоб. Используйте семафоры и очереди, возможно - флаги событий. Всё это предназначено для того, чтобы задачу загнать в сон, пока она ждёт события из другой задачи или прерывания. Почитайте какой-нибудь цикл статей про ОСРВ, не обязательно про FreeRTOS. Эта базовая теория годится для всех систем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/8/2022 at 12:44 PM, haker_fox said:

 грубый подход

Это еще мягко сказано, скорее будет "вандализм" ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно так:

сделайте небольшую очередь для данных из порта с помощью xQueueCreate

в задаче ожидайте данных с помощью xQueueReceive

в обработчике поместите данные в очередь с помощью xQueueSendToBackFromISR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/8/2022 at 4:32 PM, TOG said:

Потом у меня в "main.c" срабатывает прерывание по приему данных из UART.

И я хочу активировать задачу обработчик данных, вызываю vTaskResume(UartTaskHandle).

Прямо в обработчике прерывания вызываете? Тогда не удивительно что виснет. Для вызова из прерываний есть специальное подмножество функций с суффиксом FromISR.

Почитайте тут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насчёт вызываемых из прерываний функций всё правильно сказали, но я не стал бы останавливать задачу, а ставил бы её на ожидание семафора. Это нужно на перспективу, если придётся запускать задачу из разных мест. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По поводу FromISR. В последних версиях появился файл cmsis_os2.c. Там например забрать семафор можно вызвать osSemaphoreAcquire, которой всё равно от куда вызывать из прерывания или нет. Она сама автоматом определяет.

Кстати нашёл и osThreadResume, но она не вызывает xTaskResumeFromISR если из прерывания. Просто выходит с ошибкой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...