Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

В прерывании нужно вызывать функцию типа
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

У меня в проекте с 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

Судя по всему, это баг 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

Вам нужны будут функции: xEventGroupCreate, xEventGroupSetBitsFromISR, xEventGroupGetBits.

Соврал, для ожидания нужна функция xEventGroupWaitBits, а не xEventGroupGetBits.

Re: FreeRTOS STM32 CubeIDE Cortex M3

Пт авг 05, 2022 17:32:02

Судя по всему, это баг CMSIS. Попробуйте использовать FreeRTOS функции на прямую, без CMSIS. Тем более что, CMSIS на данный момент это просто обертка над FreeRTOS.

Спасибо. Я так и не понял, чей это баг, но из одних прерываний флаги устанавливаются нормально, а из других - нет.
Использовать функции 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

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