Изучаю FreeRTOS v.2, реализация STM. Микросонтроллер STM32F105. Необходимо применить EventFlags. При возникновении прерывания устанавливать флаг События, в то время, как Задача находится в ожидании установления флага События. Функция, устанавливающая флаг называется
Код:
osEventFlagsSet
Так вот, когда ее вызываешь из прерывания, флаг не устанавливается, функция возвращает какое-то запредельное число - ошибка. Может кто сталкивался, как с этим быть? В настройках ОС параметр
GARMIN, спасибо за ответ, но увы, мимо. osEventFlagsSetFromISR - нет такой функции в CMSIS V2. Может быть в CMSIS V1 это есть - не проверял, мне все равно нужен только второй.
GARMIN писал(а):
А потом ещё контекст переключать, как - в хедере написаны примеры.
Это что-то совсем не из этой оперы. Может быть в других реализациях как-то иначе, но в этой, от STM я такого не встречал.
Кроме того, ночью попробовал на STM32F072RB (ядро Cortex M0) - из прерывания флаги передаются корректно, за исключением одного но (несущественного) - функция osEventFlagsSet возвращает не флаги, которые были установлены, а ошибку - значение 4294967293 (0b11111111111111111111111111111101). А на Cortex M3 не работает. Буду пытаться разобраться, если найду причину или способ обхода - отпишусь здесь.
Судя по всему, это баг CMSIS. Попробуйте использовать FreeRTOS функции на прямую, без CMSIS. Тем более что, CMSIS на данный момент это просто обертка над FreeRTOS.
Судя по всему, это баг CMSIS. Попробуйте использовать FreeRTOS функции на прямую, без CMSIS. Тем более что, CMSIS на данный момент это просто обертка над FreeRTOS.
Спасибо. Я так и не понял, чей это баг, но из одних прерываний флаги устанавливаются нормально, а из других - нет. Использовать функции FreeRTOS мимо функций обертки считаю неправильным, это говнокод. Или тогда уж полностью CMSIS отключить и писать на функциях FreeRTOS. В любом случае спасибо, что откликнулись.
Итак, вернулся к флагам, рассказываю, что удалось выяснить. Не работают корректно флаги, когда устанавливаются из прерываний, возникающих часто/быстро (пока оставлю такую формулировку, если разведую точнее - уточню). Второе - флаги работают некорректно из-за ошибки в коде оболочки CMSIS-v2 Файл cmsis_os2.c начиная со строки №1125:
Код:
if (options & osFlagsWaitAll) { if ((flags & rflags) != flags) { // XXX Тут внесено исправление! Было if (flags != rflags) if (timeout > 0U) { rflags = (uint32_t)osErrorTimeout; } else { rflags = (uint32_t)osErrorResource; } } } else { if ((flags & rflags) == 0U) { if (timeout > 0U) { rflags = (uint32_t)osErrorTimeout; } else { rflags = (uint32_t)osErrorResource; } } }
Суть ошибки вот в чем. Когда мы ждем установки не одного, а нескольких флагов одновременно, срабатывание не происходило в тех случаях, когда кроме ожидаемых был установлен еще какой-либо флаг. Сформулировал косноязычно, зато правильно.
В CMSIS-OS на входе в функции проверяется откуда она вызвана, из контекста задачи, или из прерывания, поэтому и нет функций с суффиксом "fromISR" как в FreeRTOS. А вообще, этот Куб такое фигачит в настройки ОС, что не всё и не всегда работает как ждёшь. Причём, не все настройки он даёт менять. Выбрось ты эту фигню, пиши на API ОС, которую используешь и будет тебе Щастье.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения