FreeRTOS STM32 CubeIDE Cortex M3

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
Солнцеворот
Встал на лапы
Сообщения: 141
Зарегистрирован: Вт июн 03, 2008 01:39:47

FreeRTOS STM32 CubeIDE Cortex M3

Сообщение Солнцеворот »

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

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

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

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

xEventGroupSetBitFromISR
включен - Enabled.
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 952
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

Re: FreeRTOS STM32 CubeIDE Cortex M3

Сообщение GARMIN »

В прерывании нужно вызывать функцию типа
osEventFlagsSetFromISR

А потом ещё контекст переключать, как - в хедере написаны примеры.
Аватара пользователя
Солнцеворот
Встал на лапы
Сообщения: 141
Зарегистрирован: Вт июн 03, 2008 01:39:47

Re: FreeRTOS STM32 CubeIDE Cortex M3

Сообщение Солнцеворот »

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

Кроме того, ночью попробовал на STM32F072RB (ядро Cortex M0) - из прерывания флаги передаются корректно, за исключением одного но (несущественного) - функция osEventFlagsSet возвращает не флаги, которые были установлены, а ошибку - значение 4294967293 (0b11111111111111111111111111111101).
А на Cortex M3 не работает. Буду пытаться разобраться, если найду причину или способ обхода - отпишусь здесь.
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 952
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

Re: FreeRTOS STM32 CubeIDE Cortex M3

Сообщение GARMIN »

У меня в проекте с FreeRTOS Kernel V10.4.4 от 2021 года
вполне есть функция xEventGroupSetBitsFromISR()

Посмотри, в какие обёртки завернули функцию ядра в твоей osEventFlagsSet() и используй правильный вариант из ядра FreeRTOS.
Аватара пользователя
Солнцеворот
Встал на лапы
Сообщения: 141
Зарегистрирован: Вт июн 03, 2008 01:39:47

Re: FreeRTOS STM32 CubeIDE Cortex M3

Сообщение Солнцеворот »

GARMIN, возможно дело в ядре. У меня версия 10.0.1
Аватара пользователя
4airy
Родился
Сообщения: 7
Зарегистрирован: Вс июл 24, 2022 11:42:22

Re: FreeRTOS STM32 CubeIDE Cortex M3

Сообщение 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)
Аватара пользователя
4airy
Родился
Сообщения: 7
Зарегистрирован: Вс июл 24, 2022 11:42:22

Re: FreeRTOS STM32 CubeIDE Cortex M3

Сообщение 4airy »

[uquote="4airy",url="/forum/viewtopic.php?p=4264505#p4264505"]Вам нужны будут функции: xEventGroupCreate, xEventGroupSetBitsFromISR, xEventGroupGetBits.[/uquote]
Соврал, для ожидания нужна функция xEventGroupWaitBits, а не xEventGroupGetBits.
Аватара пользователя
Солнцеворот
Встал на лапы
Сообщения: 141
Зарегистрирован: Вт июн 03, 2008 01:39:47

Re: FreeRTOS STM32 CubeIDE Cortex M3

Сообщение Солнцеворот »

[uquote="4airy",url="/forum/viewtopic.php?p=4264505#p4264505"]Судя по всему, это баг CMSIS. Попробуйте использовать FreeRTOS функции на прямую, без CMSIS. Тем более что, CMSIS на данный момент это просто обертка над FreeRTOS.[/uquote]
Спасибо. Я так и не понял, чей это баг, но из одних прерываний флаги устанавливаются нормально, а из других - нет.
Использовать функции FreeRTOS мимо функций обертки считаю неправильным, это говнокод. Или тогда уж полностью CMSIS отключить и писать на функциях FreeRTOS.
В любом случае спасибо, что откликнулись.
Аватара пользователя
Солнцеворот
Встал на лапы
Сообщения: 141
Зарегистрирован: Вт июн 03, 2008 01:39:47

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
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: FreeRTOS STM32 CubeIDE Cortex M3

Сообщение tonyk »

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

Вернуться в «ARM»