Например TDA7294

Форум РадиоКот • Просмотр темы - FreeRTOS STM32 CubeIDE Cortex M3
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вс дек 21, 2025 17:01:09

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: FreeRTOS STM32 CubeIDE Cortex M3
СообщениеДобавлено: Вт июл 12, 2022 19:59:10 
Встал на лапы
Аватар пользователя

Карма: 3
Рейтинг сообщений: 8
Зарегистрирован: Вт июн 03, 2008 01:39:47
Сообщений: 141
Рейтинг сообщения: 0
Изучаю FreeRTOS v.2, реализация STM. Микросонтроллер STM32F105.
Необходимо применить EventFlags. При возникновении прерывания устанавливать флаг События, в то время, как Задача находится в ожидании установления флага События.
Функция, устанавливающая флаг называется
Код:
osEventFlagsSet

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FreeRTOS STM32 CubeIDE Cortex M3
СообщениеДобавлено: Ср июл 13, 2022 09:01:06 
Держит паяльник хвостом
Аватар пользователя

Карма: 16
Рейтинг сообщений: 205
Зарегистрирован: Вс дек 02, 2012 16:58:33
Сообщений: 936
Откуда: от туда
Рейтинг сообщения: 0
В прерывании нужно вызывать функцию типа
osEventFlagsSetFromISR

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FreeRTOS STM32 CubeIDE Cortex M3
СообщениеДобавлено: Ср июл 13, 2022 09:53:22 
Встал на лапы
Аватар пользователя

Карма: 3
Рейтинг сообщений: 8
Зарегистрирован: Вт июн 03, 2008 01:39:47
Сообщений: 141
Рейтинг сообщения: 0
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 
Держит паяльник хвостом
Аватар пользователя

Карма: 16
Рейтинг сообщений: 205
Зарегистрирован: Вс дек 02, 2012 16:58:33
Сообщений: 936
Откуда: от туда
Рейтинг сообщения: 0
У меня в проекте с FreeRTOS Kernel V10.4.4 от 2021 года
вполне есть функция xEventGroupSetBitsFromISR()

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


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: FreeRTOS STM32 CubeIDE Cortex M3
СообщениеДобавлено: Ср июл 13, 2022 16:59:05 
Встал на лапы
Аватар пользователя

Карма: 3
Рейтинг сообщений: 8
Зарегистрирован: Вт июн 03, 2008 01:39:47
Сообщений: 141
Рейтинг сообщения: 0
GARMIN, возможно дело в ядре. У меня версия 10.0.1


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FreeRTOS STM32 CubeIDE Cortex M3
СообщениеДобавлено: Вс июл 24, 2022 12:19:24 
Родился
Аватар пользователя

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

Зарегистрирован: Вс июл 24, 2022 11:42:22
Сообщений: 7
Рейтинг сообщения: 0
Вам нужны будут функции: xEventGroupCreate, xEventGroupSetBitsFromISR, xEventGroupGetBits.

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FreeRTOS STM32 CubeIDE Cortex M3
СообщениеДобавлено: Пт авг 05, 2022 17:32:02 
Встал на лапы
Аватар пользователя

Карма: 3
Рейтинг сообщений: 8
Зарегистрирован: Вт июн 03, 2008 01:39:47
Сообщений: 141
Рейтинг сообщения: 0
Судя по всему, это баг CMSIS. Попробуйте использовать FreeRTOS функции на прямую, без CMSIS. Тем более что, CMSIS на данный момент это просто обертка над FreeRTOS.

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: FreeRTOS STM32 CubeIDE Cortex M3
СообщениеДобавлено: Ср окт 26, 2022 15:02:28 
Встал на лапы
Аватар пользователя

Карма: 3
Рейтинг сообщений: 8
Зарегистрирован: Вт июн 03, 2008 01:39:47
Сообщений: 141
Рейтинг сообщения: 0
Итак, вернулся к флагам, рассказываю, что удалось выяснить.
Не работают корректно флаги, когда устанавливаются из прерываний, возникающих часто/быстро (пока оставлю такую формулировку, если разведую точнее - уточню).
Второе - флаги работают некорректно из-за ошибки в коде оболочки 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 
Сверлит текстолит когтями

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


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: jcxz и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y