TOG 0 8 июня, 2022 Опубликовано 8 июня, 2022 · Жалоба Друзья, имеется микроконтроллер STM32H743, TouchGFX, FreeRTOS и несколько задач. Чтобы задачи без дела не съедали процессорное время я ненужные задачи в данный момент отключаю - vTaskSuspend(UartTaskHandle). Потом у меня в "main.c" срабатывает прерывание по приему данных из UART. И я хочу активировать задачу обработчик данных, вызываю vTaskResume(UartTaskHandle). В результате все намертво виснет, черный экран. Не могу понять, что я делаю не так ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 8 июня, 2022 Опубликовано 8 июня, 2022 · Жалоба Всё так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 8 июня, 2022 Опубликовано 8 июня, 2022 · Жалоба On 6/8/2022 at 5:32 PM, TOG said: vTaskSuspend(UartTaskHandle). ИМХО, это грубый подход. В лоб. Используйте семафоры и очереди, возможно - флаги событий. Всё это предназначено для того, чтобы задачу загнать в сон, пока она ждёт события из другой задачи или прерывания. Почитайте какой-нибудь цикл статей про ОСРВ, не обязательно про FreeRTOS. Эта базовая теория годится для всех систем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 8 июня, 2022 Опубликовано 8 июня, 2022 · Жалоба On 6/8/2022 at 12:44 PM, haker_fox said: грубый подход Это еще мягко сказано, скорее будет "вандализм" )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tgruzd 11 8 июня, 2022 Опубликовано 8 июня, 2022 · Жалоба xTaskResumeFromISR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gridinp 3 8 июня, 2022 Опубликовано 8 июня, 2022 · Жалоба Можно так: сделайте небольшую очередь для данных из порта с помощью xQueueCreate в задаче ожидайте данных с помощью xQueueReceive в обработчике поместите данные в очередь с помощью xQueueSendToBackFromISR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 9 июня, 2022 Опубликовано 9 июня, 2022 · Жалоба On 6/8/2022 at 4:32 PM, TOG said: Потом у меня в "main.c" срабатывает прерывание по приему данных из UART. И я хочу активировать задачу обработчик данных, вызываю vTaskResume(UartTaskHandle). Прямо в обработчике прерывания вызываете? Тогда не удивительно что виснет. Для вызова из прерываний есть специальное подмножество функций с суффиксом FromISR. Почитайте тут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ДЕЙЛ 32 7 июля, 2022 Опубликовано 7 июля, 2022 · Жалоба Насчёт вызываемых из прерываний функций всё правильно сказали, но я не стал бы останавливать задачу, а ставил бы её на ожидание семафора. Это нужно на перспективу, если придётся запускать задачу из разных мест. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KARLSON 1 21 июля, 2022 Опубликовано 21 июля, 2022 · Жалоба По поводу FromISR. В последних версиях появился файл cmsis_os2.c. Там например забрать семафор можно вызвать osSemaphoreAcquire, которой всё равно от куда вызывать из прерывания или нет. Она сама автоматом определяет. Кстати нашёл и osThreadResume, но она не вызывает xTaskResumeFromISR если из прерывания. Просто выходит с ошибкой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться