| Форум РадиоКот https://radiokot.ru/forum/ |
|
| FreeRTOS STM32 CubeIDE Cortex M3 https://radiokot.ru/forum/viewtopic.php?f=59&t=183642 |
Страница 1 из 1 |
| Автор: | Солнцеворот [ Вт июл 12, 2022 19:59:10 ] |
| Заголовок сообщения: | FreeRTOS STM32 CubeIDE Cortex M3 |
Изучаю FreeRTOS v.2, реализация STM. Микросонтроллер STM32F105. Необходимо применить EventFlags. При возникновении прерывания устанавливать флаг События, в то время, как Задача находится в ожидании установления флага События. Функция, устанавливающая флаг называется Код: osEventFlagsSet Так вот, когда ее вызываешь из прерывания, флаг не устанавливается, функция возвращает какое-то запредельное число - ошибка. Может кто сталкивался, как с этим быть? В настройках ОС параметр Код: xEventGroupSetBitFromISR включен - Enabled.
|
|
| Автор: | GARMIN [ Ср июл 13, 2022 09:01:06 ] |
| Заголовок сообщения: | Re: FreeRTOS STM32 CubeIDE Cortex M3 |
В прерывании нужно вызывать функцию типа osEventFlagsSetFromISR А потом ещё контекст переключать, как - в хедере написаны примеры. |
|
| Автор: | Солнцеворот [ Ср июл 13, 2022 09:53:22 ] |
| Заголовок сообщения: | Re: FreeRTOS STM32 CubeIDE Cortex M3 |
GARMIN, спасибо за ответ, но увы, мимо. osEventFlagsSetFromISR - нет такой функции в CMSIS V2. Может быть в CMSIS V1 это есть - не проверял, мне все равно нужен только второй. GARMIN писал(а): А потом ещё контекст переключать, как - в хедере написаны примеры. Это что-то совсем не из этой оперы. Может быть в других реализациях как-то иначе, но в этой, от STM я такого не встречал. Кроме того, ночью попробовал на STM32F072RB (ядро Cortex M0) - из прерывания флаги передаются корректно, за исключением одного но (несущественного) - функция osEventFlagsSet возвращает не флаги, которые были установлены, а ошибку - значение 4294967293 (0b11111111111111111111111111111101). А на Cortex M3 не работает. Буду пытаться разобраться, если найду причину или способ обхода - отпишусь здесь. |
|
| Автор: | GARMIN [ Ср июл 13, 2022 16:38:40 ] |
| Заголовок сообщения: | Re: FreeRTOS STM32 CubeIDE Cortex M3 |
У меня в проекте с FreeRTOS Kernel V10.4.4 от 2021 года вполне есть функция xEventGroupSetBitsFromISR() Посмотри, в какие обёртки завернули функцию ядра в твоей osEventFlagsSet() и используй правильный вариант из ядра FreeRTOS. |
|
| Автор: | Солнцеворот [ Ср июл 13, 2022 16:59:05 ] |
| Заголовок сообщения: | Re: FreeRTOS STM32 CubeIDE Cortex M3 |
GARMIN, возможно дело в ядре. У меня версия 10.0.1 |
|
| Автор: | 4airy [ Вс июл 24, 2022 12:19:24 ] |
| Заголовок сообщения: | Re: FreeRTOS STM32 CubeIDE Cortex M3 |
Судя по всему, это баг CMSIS. Попробуйте использовать FreeRTOS функции на прямую, без CMSIS. Тем более что, CMSIS на данный момент это просто обертка над FreeRTOS. Подключите заголовочные файлы FreeRTOS: Код: #include "FreeRTOS.h" #include "event_groups.h" А дальше сделайте по примерам от сюда: https://www.freertos.org/event-groups-API.html Вам нужны будут функции: xEventGroupCreate, xEventGroupSetBitsFromISR, xEventGroupGetBits. P.s. Так же возможно, задачу в которой ожидается событие, так же придеться средствами FreeRTOS (https://www.freertos.org/a00019.html) |
|
| Автор: | 4airy [ Пн июл 25, 2022 14:27:46 ] |
| Заголовок сообщения: | Re: FreeRTOS STM32 CubeIDE Cortex M3 |
Вам нужны будут функции: xEventGroupCreate, xEventGroupSetBitsFromISR, xEventGroupGetBits. Соврал, для ожидания нужна функция xEventGroupWaitBits, а не xEventGroupGetBits. |
|
| Автор: | Солнцеворот [ Пт авг 05, 2022 17:32:02 ] |
| Заголовок сообщения: | Re: FreeRTOS STM32 CubeIDE Cortex M3 |
Судя по всему, это баг CMSIS. Попробуйте использовать FreeRTOS функции на прямую, без CMSIS. Тем более что, CMSIS на данный момент это просто обертка над FreeRTOS. Спасибо. Я так и не понял, чей это баг, но из одних прерываний флаги устанавливаются нормально, а из других - нет. Использовать функции FreeRTOS мимо функций обертки считаю неправильным, это говнокод. Или тогда уж полностью CMSIS отключить и писать на функциях FreeRTOS. В любом случае спасибо, что откликнулись. |
|
| Автор: | Солнцеворот [ Ср окт 26, 2022 15:02:28 ] |
| Заголовок сообщения: | Re: FreeRTOS STM32 CubeIDE Cortex M3 |
Итак, вернулся к флагам, рассказываю, что удалось выяснить. Не работают корректно флаги, когда устанавливаются из прерываний, возникающих часто/быстро (пока оставлю такую формулировку, если разведую точнее - уточню). Второе - флаги работают некорректно из-за ошибки в коде оболочки 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; } } } Суть ошибки вот в чем. Когда мы ждем установки не одного, а нескольких флагов одновременно, срабатывание не происходило в тех случаях, когда кроме ожидаемых был установлен еще какой-либо флаг. Сформулировал косноязычно, зато правильно. |
|
| Автор: | tonyk [ Ср окт 26, 2022 15:23:49 ] |
| Заголовок сообщения: | Re: FreeRTOS STM32 CubeIDE Cortex M3 |
В CMSIS-OS на входе в функции проверяется откуда она вызвана, из контекста задачи, или из прерывания, поэтому и нет функций с суффиксом "fromISR" как в FreeRTOS. А вообще, этот Куб такое фигачит в настройки ОС, что не всё и не всегда работает как ждёшь. Причём, не все настройки он даёт менять. Выбрось ты эту фигню, пиши на API ОС, которую используешь и будет тебе Щастье. |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


