Easyelectronics.ru

Электроника для всех
Текущее время: 26 фев 2021, 03:57

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



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: stm32f429 FreeRTOS и DMA
СообщениеДобавлено: 31 окт 2018, 18:24 
Заглядывает иногда

Зарегистрирован: 17 ноя 2014, 10:37
Сообщения: 54
Появился вопрос ....
FreeRTOS V8.2.1
Делаю так.
1. Делаю инициализацию периферии вывод буфера в SPI через DMA запускаю вывод HAL_SPI_Transmit_DMA и зацикливаю в HAL_SPI_TxCpltCallback ... опять HAL_SPI_Transmit_DMA..
2. Делаю инициализацию чтения ADC нескольких каналов по DMA в память.. тоже зациклил..
и остальную периферию, прерывания .. и код который выполняется несколько секунд...
3. Создаю очереди , мютексы и задачи для FreeRTOS..
4. Запускаю шедулер RTOS...
Дальше все нормально работает.. SPI, ADC... и остальное...

Но мне необходимо поменять порядок ... п.3 переставить перед п.1...
1. Создаю очереди , мютексы и задачи для FreeRTOS..
2. Делаю инициализацию периферии вывод буфера в SPI через DMA запускаю вывод HAL_SPI_Transmit_DMA и зацикливаю в HAL_SPI_TxCpltCallback ... опять HAL_SPI_Transmit_DMA..
3. Делаю инициализацию чтения ADC нескольких каналов по DMA в память.. тоже зациклил..
и остальную периферию, прерывания .. и код который выполняется несколько секунд...
4. Запускаю шедулер RTOS...

И тут проблема в том что работа DMA в п.2 и п.3. не запускается пока нет запуска шедулера...
но если после п.1 вставил portENABLE_INTERRUPTS();
то DMA сразу запускается и для SPI и ADC... и дальше все задачи работают нормально...
возможны эти проблемы в FreeRTOS?
корректны такие мои действия с portENABLE_INTERRUPTS? или так нельзя делать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f429 FreeRTOS и DMA
СообщениеДобавлено: 02 ноя 2018, 13:06 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 ноя 2010, 20:11
Сообщения: 117
Откуда: Омск
Сразу после сброса контроллера все прерывания разрешены.
Лично у меня DMA обрабатывает USART (системную консоль), которая работает как ДО RTOS, так и совместно с RTOS, не ломаясь.
Проверяйте код.
В исходниках FreeRTOS данная команда фактически выполняет BASEPRI = 0, то есть возвращает уровень выполнения в ноль. При значениях выше нуля, прерывания меньшего приоритета не будут выполняться.
Проверьте, не происходит ли запись в него во время начальных настроек (пункт 1-2).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f429 FreeRTOS и DMA
СообщениеДобавлено: 02 ноя 2018, 13:43 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Вообще-то, они запрещены. Запрещены как векторы прерываний, так и сами запросы прерываний от периферии. Разрешены только высокоприоритетные исключения ядра, которые выключаются ассемблерной инструкцией cpsid.

Что касается темы темы, то ошибка в том, что используя HAL, вы разрешаете работу периферии еще до того, как запустится планировщик задач. По-хорошему, нужно делать инициализацию периферии, но не включать ее. Особенно такую, как АЦП, прием по интерфейсам. Чтобы не было непоняток, типа данные уже готовы, а система еще даже и не запущена. Таким образом, первая задача после запуска планировщика и запускает все инициализованные модули. Ни один периферийный модуль, явно или косвенно использующий API RTOS, не должен быть запущен в работу раньше, чем будет запущен планировщик задач RTOS.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f429 FreeRTOS и DMA
СообщениеДобавлено: 04 ноя 2018, 21:56 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 ноя 2010, 20:11
Сообщения: 117
Откуда: Омск
BusMaster писал(а):
Вообще-то, они запрещены. Запрещены как векторы прерываний, так и сами запросы прерываний от периферии. Разрешены только высокоприоритетные исключения ядра, которые выключаются ассемблерной инструкцией cpsid.


Прерывания запрещены, но нет их глобального запрета (в частности, с базовым приоритетом исполнения), который мешает ТС.
У меня код обычно выглядит следующим образом:
<Настройка тактирования>
<Настройка периферии>
<Разрешаем минимально необходимые прерывания>
NVIC_EnableIRQ(DMA1_Channel3_IRQn); <- чаще всего так.
<Продолжаем выполнение уже с прерываниями, если нужно>

ТС: Рекомендую проверить отладчиком перед вызовом portENABLE_INTERRUPTS() состояние регистра BASEPRI, если есть такая возможность.
Если он НЕ нулевой - ищите, что его меняет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f429 FreeRTOS и DMA
СообщениеДобавлено: 06 ноя 2018, 12:34 
Заглядывает иногда

Зарегистрирован: 17 ноя 2014, 10:37
Сообщения: 54
-Alan- писал(а):
ТС: Рекомендую проверить отладчиком перед вызовом portENABLE_INTERRUPTS() состояние регистра BASEPRI, если есть такая возможность.
Если он НЕ нулевой - ищите, что его меняет.


до создания очередей , мютексов и задач для FreeRTOS BASEPRI=0...
и после первого вызова xQueueCreate BASEPRI=0x50...
и только portENABLE_INTERRUPTS() после всех xQueueCreate, xSemaphoreCreateMutex,xTaskCreate сбрасывает BASEPRI=0.
дальше инициализация и запуск всей периферии и запуск FreeRTOS ... дальше все нормально..
Пока оставлю как есть.... Потом последую совету BusMaster... перенесу инициализацию периферии и прерываний в начало первой задачи....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f429 FreeRTOS и DMA
СообщениеДобавлено: 06 ноя 2018, 20:46 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 ноя 2010, 20:11
Сообщения: 117
Откуда: Омск
Интересное поведение. Хотя, в принципе, я могу понять логику работы.
Работа с внутренними структурами RTOS - высокоприоритетная задача, которую нежелательно перебивать.
Мой код работает несколько иначе.
Эдакий скелетик main():
<начало main и определение переменных>
<начальная настройка периферии>
<сообщения консоли>
<определение подключеной периферии>
<инициализация внешней периферии, если есть>
<создание очередей, мьютексов, задач>
<Передача управления шедулеру ОС>

То есть, у меня очереди и всё относящееся с RTOS происходит в самый последний момент, и до этого все прерывания работают.
Можете попробовать перенести инициализацию периферии ДО начала работы с объектами ОС, либо перенести инициализацию какой-то периферии в поток, работающий с этим оборудованием.
У меня так сетевой интерфейс и его мучения были полностью вынесены в поток.
Думаю, как заставить работать аналогичным образом поток с картой памяти и корректно обмениваться данными с другими нитями.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f429 FreeRTOS и DMA
СообщениеДобавлено: 07 ноя 2018, 16:27 
Заглядывает иногда

Зарегистрирован: 17 ноя 2014, 10:37
Сообщения: 54
-Alan- писал(а):
Интересное поведение. Хотя, в принципе, я могу понять логику работы.
Работа с внутренними структурами RTOS - высокоприоритетная задача, которую нежелательно перебивать.
Мой код работает несколько иначе.
Эдакий скелетик main():
<начало main и определение переменных>
<начальная настройка периферии>
<сообщения консоли>
<определение подключеной периферии>
<инициализация внешней периферии, если есть>
<создание очередей, мьютексов, задач>
<Передача управления шедулеру ОС>

То есть, у меня очереди и всё относящееся с RTOS происходит в самый последний момент, и до этого все прерывания работают.
Можете попробовать перенести инициализацию периферии ДО начала работы с объектами ОС, либо перенести инициализацию какой-то периферии в поток, работающий с этим оборудованием.
У меня так сетевой интерфейс и его мучения были полностью вынесены в поток.
Думаю, как заставить работать аналогичным образом поток с картой памяти и корректно обмениваться данными с другими нитями.

Я так и делал... Но мне нужно после включения питания до старта шедулера в некоторые очереди передать данные ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f429 FreeRTOS и DMA
СообщениеДобавлено: 09 ноя 2018, 22:08 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 ноя 2010, 20:11
Сообщения: 117
Откуда: Омск
До старта шедулера лучше ничего такого не делать. Максимум - подготовить объекты.
Хорошим тоном считается минимальная инициализация до запуска ОС и откуп остального уже процессам.

Конечно, можно сделать так:
Show Псевдокод

Естественно, потребуется объявить глобальные переменные потоков.
Show Пример переменных


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f429 FreeRTOS и DMA
СообщениеДобавлено: 22 июл 2020, 15:07 
Старожил

Зарегистрирован: 06 окт 2014, 20:14
Сообщения: 1076
Ну Вы даете. FreeRTOS никого не заставляет следовать ее правилам, когда Вам этого не хочется, это сто-пятьсот раз упомянуто https://www.freertos.org.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f429 FreeRTOS и DMA
СообщениеДобавлено: 22 июл 2020, 18:31 
Старожил

Зарегистрирован: 08 июл 2013, 17:00
Сообщения: 863
AstraHard писал(а):
Ну Вы даете. FreeRTOS никого не заставляет следовать ее правилам, когда Вам этого не хочется, это сто-пятьсот раз упомянуто https://www.freertos.org.

Наивный. Сразу видно отсутствие опыта разработки многопоточных приложений, тем более взаимодействующих с аппаратурой через прерывания.
Даже просто, диалектически: в любую программную и/или аппаратную систему сущностей изначально закладывается порядок использования сущностей, из которых состоит система, значит, используя эту систему тебе придётся соблюдать эти правила. Соблюдение правил упрощает твоё использование системой и делает её применение полезной для тебя, а несоблюдение правил ведёт к напрасным потерям сил на борьбу с системой и делает её использование несоблюдающим правила безполезным.
Посему- учите матчасть!


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


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


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB