Страница 1 из 1

FreeRTOS STM32 CubeIDE Cortex M3

Добавлено: Вт июл 12, 2022 19:59:10
Солнцеворот
Изучаю FreeRTOS v.2, реализация STM. Микросонтроллер STM32F105.
Необходимо применить EventFlags. При возникновении прерывания устанавливать флаг События, в то время, как Задача находится в ожидании установления флага События.
Функция, устанавливающая флаг называется

Код: Выделить всё

osEventFlagsSet
Так вот, когда ее вызываешь из прерывания, флаг не устанавливается, функция возвращает какое-то запредельное число - ошибка.
Может кто сталкивался, как с этим быть?
В настройках ОС параметр

Код: Выделить всё

xEventGroupSetBitFromISR
включен - Enabled.

Re: FreeRTOS STM32 CubeIDE Cortex M3

Добавлено: Ср июл 13, 2022 09:01:06
GARMIN
В прерывании нужно вызывать функцию типа
osEventFlagsSetFromISR

А потом ещё контекст переключать, как - в хедере написаны примеры.

Re: FreeRTOS STM32 CubeIDE Cortex M3

Добавлено: Ср июл 13, 2022 09:53:22
Солнцеворот
GARMIN, спасибо за ответ, но увы, мимо.
osEventFlagsSetFromISR - нет такой функции в CMSIS V2. Может быть в CMSIS V1 это есть - не проверял, мне все равно нужен только второй.
GARMIN писал(а):А потом ещё контекст переключать, как - в хедере написаны примеры.
Это что-то совсем не из этой оперы. Может быть в других реализациях как-то иначе, но в этой, от STM я такого не встречал.

Кроме того, ночью попробовал на STM32F072RB (ядро Cortex M0) - из прерывания флаги передаются корректно, за исключением одного но (несущественного) - функция osEventFlagsSet возвращает не флаги, которые были установлены, а ошибку - значение 4294967293 (0b11111111111111111111111111111101).
А на Cortex M3 не работает. Буду пытаться разобраться, если найду причину или способ обхода - отпишусь здесь.

Re: FreeRTOS STM32 CubeIDE Cortex M3

Добавлено: Ср июл 13, 2022 16:38:40
GARMIN
У меня в проекте с FreeRTOS Kernel V10.4.4 от 2021 года
вполне есть функция xEventGroupSetBitsFromISR()

Посмотри, в какие обёртки завернули функцию ядра в твоей osEventFlagsSet() и используй правильный вариант из ядра FreeRTOS.

Re: FreeRTOS STM32 CubeIDE Cortex M3

Добавлено: Ср июл 13, 2022 16:59:05
Солнцеворот
GARMIN, возможно дело в ядре. У меня версия 10.0.1

Re: FreeRTOS STM32 CubeIDE Cortex M3

Добавлено: Вс июл 24, 2022 12:19:24
4airy
Судя по всему, это баг 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)

Re: FreeRTOS STM32 CubeIDE Cortex M3

Добавлено: Пн июл 25, 2022 14:27:46
4airy
[uquote="4airy",url="/forum/viewtopic.php?p=4264505#p4264505"]Вам нужны будут функции: xEventGroupCreate, xEventGroupSetBitsFromISR, xEventGroupGetBits.[/uquote]
Соврал, для ожидания нужна функция xEventGroupWaitBits, а не xEventGroupGetBits.

Re: FreeRTOS STM32 CubeIDE Cortex M3

Добавлено: Пт авг 05, 2022 17:32:02
Солнцеворот
[uquote="4airy",url="/forum/viewtopic.php?p=4264505#p4264505"]Судя по всему, это баг CMSIS. Попробуйте использовать FreeRTOS функции на прямую, без CMSIS. Тем более что, CMSIS на данный момент это просто обертка над FreeRTOS.[/uquote]
Спасибо. Я так и не понял, чей это баг, но из одних прерываний флаги устанавливаются нормально, а из других - нет.
Использовать функции FreeRTOS мимо функций обертки считаю неправильным, это говнокод. Или тогда уж полностью CMSIS отключить и писать на функциях FreeRTOS.
В любом случае спасибо, что откликнулись.

Re: FreeRTOS STM32 CubeIDE Cortex M3

Добавлено: Ср окт 26, 2022 15:02:28
Солнцеворот
Итак, вернулся к флагам, рассказываю, что удалось выяснить.
Не работают корректно флаги, когда устанавливаются из прерываний, возникающих часто/быстро (пока оставлю такую формулировку, если разведую точнее - уточню).
Второе - флаги работают некорректно из-за ошибки в коде оболочки 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;
        }
      }
    }
Суть ошибки вот в чем. Когда мы ждем установки не одного, а нескольких флагов одновременно, срабатывание не происходило в тех случаях, когда кроме ожидаемых был установлен еще какой-либо флаг. Сформулировал косноязычно, зато правильно.

Re: FreeRTOS STM32 CubeIDE Cortex M3

Добавлено: Ср окт 26, 2022 15:23:49
tonyk
В CMSIS-OS на входе в функции проверяется откуда она вызвана, из контекста задачи, или из прерывания, поэтому и нет функций с суффиксом "fromISR" как в FreeRTOS.
А вообще, этот Куб такое фигачит в настройки ОС, что не всё и не всегда работает как ждёшь. Причём, не все настройки он даёт менять.
Выбрось ты эту фигню, пиши на API ОС, которую используешь и будет тебе Щастье.