Например TDA7294

Форум РадиоКот :: Просмотр темы - FreeRTOS STM32 CubeIDE Cortex M3
Форум РадиоКот
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/