STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Мучитель микросхем
Аватара пользователя
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Сообщение Myp3ik »

bezzabotna, может пригодится. Там на SPL сделано для теста (под 103 контроллер, но смысл тот же). Таймер по аппаратному триггеру запускает АЦП каждые 50мс. ДМА складывает это все в массив и после 20 семплов прерывание трансфер комплит.
Вложения
ADC_Ext_Trig_Test.rar
(223.29 КБ) 220 скачиваний
Иван Сусанин - первый полупроводник :solder:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 134
Зарегистрирован: Пн ноя 07, 2016 12:14:14

Сообщение bezzabotna »

Спасибо. Не подскажите оптимальный размер буфера для дма?
У меня три канала, информацию по каждому из них нужно складывать в свой отдельный массив из общего буфера.
Можно сделать маленький дма буфер на 3 ячейки и в прерывании данные быстренько раскидать по массивам, или же долго копить данные в большом буфере и потом долго их сортировать, но прерывание вызывать редко. Или наверно какая-то середина между этими крайностями.
Я конечно все понимаю, но этого я не понимаю.
Реклама
Мудрый кот
Сообщения: 1846
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="bezzabotna",url="/forum/viewtopic.php?p=3450988#p3450988"]Все, проблема решилась. Ошибка в названии обработчика.[/uquote]
Значит я был прав: обработчик в таблице прерываний не был прописан и вызывался дефолтный кало-кубовский. :)

Добавлено after 4 minutes 11 seconds:
[uquote="bezzabotna",url="/forum/viewtopic.php?p=3451056#p3451056"]Спасибо. Не подскажите оптимальный размер буфера для дма?[/uquote]
Увеличение буфера -> уменьшение частоты прерываний -> уменьшение загрузки CPU, но в то же время и уменьшение скорости реакции системы на событие (уменьшение реалтаймовости обработки данных АЦП и отклика на них). И размер выбирается исходя из задачи. Если бы был какой-то один оптимальный на все случаи жизни размер, то он был бы константно зафиксирован в периферии.
Обычно стараются чтобы частота прерываний не превышала нескольких кГц. По возможности.
Встал на лапы
Аватара пользователя
Сообщения: 134
Зарегистрирован: Пн ноя 07, 2016 12:14:14

Сообщение bezzabotna »

Кубом я конкретно для ацп, дма и таймера не пользовалась, но 80% уже написано на HAL, так что менять библиотеку я естественно не буду.
Мне потом одни данные надо через цифровой фильтр пропускать, а другие прореживать.
Я конечно все понимаю, но этого я не понимаю.
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Аватара пользователя
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Сообщение Myp3ik »

bezzabotna, например в F4 контроллере 3 АЦП, которые можно настроить в TripleMode. В этом режиме контроллер делает 3 измерения одновременно с трех разных каналов, а ДМА автоматом складывает это все в 3 ячейки массива. Один раз запускаете старт измерения по триггеру от таймера, а в прерывании ДМА забираете разложенные по полочкам результаты.
Иван Сусанин - первый полупроводник :solder:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 134
Зарегистрирован: Пн ноя 07, 2016 12:14:14

Сообщение bezzabotna »

Вопрос не в этом, а в оптимальном соотношении размера буфера дма и частоты его прерывания по его заполнению.
Зачем включать 3 ацп? :shock:
Я конечно все понимаю, но этого я не понимаю.
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Сообщение Myp3ik »

TripleMode нужен если 3 измерения нужно сделать одновременно.
Иван Сусанин - первый полупроводник :solder:
Встал на лапы
Аватара пользователя
Сообщения: 134
Зарегистрирован: Пн ноя 07, 2016 12:14:14

Сообщение bezzabotna »

Мне и режим сканирования вполне подойдет.
Я конечно все понимаю, но этого я не понимаю.
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

Кстати, а как в STM32 принято делать атомарный опрос флагов? Под флагом я понимаю переменную, которая либо равна нулю (флага нет), либо не равна нулю (флаг есть), а проверка нужна с одновременной очисткой - т.е. сам флаг по-любому должен быть сброшен, стоял он, или нет, а результатом проверки должно быть его значение перед сбросом. Вот и спрашивается, как правильно сделать это атомарно, чтобы никакая прерывающая программа не смогла вмешаться между снятием значения флага в результат и очисткой этого флага? На AVR это делалось методом "запросто" - закрыл прерывания [cli();], отманипулировал флагом и открыл прерывания [sei();]. А как быть здесь?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Если флаг по любому должен быть сброшен, то сначала считываете, а потом сбрасываете.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Атомарные манипуляции с битами -читайте о Bit Banding.
Мудрый кот
Сообщения: 1846
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="dosikus",url="/forum/viewtopic.php?p=3455672#p3455672"]Атомарные манипуляции с битами -читайте о Bit Banding.[/uquote]
А если судьба неблагосклонна и его нет?... Тогда читаем о командах эксклюзивного доступа LDREX/STREX. :)
Да и разве в вопросе прозвучало слово "бит"? :shock:

Добавлено after 3 minutes 37 seconds:
[uquote="afz",url="/forum/viewtopic.php?p=3455648#p3455648"]как правильно сделать это атомарно, чтобы никакая прерывающая программа не смогла вмешаться между снятием значения флага в результат и очисткой этого флага? На AVR это делалось методом "запросто" - закрыл прерывания [cli();], отманипулировал флагом и открыл прерывания [sei();]. А как быть здесь?[/uquote]
А "здесь" Вы думаете невозможно запретить прерывания? :shock:

Добавлено after 5 minutes 10 seconds:
[uquote="Мурик",url="/forum/viewtopic.php?p=3455663#p3455663"]Если флаг по любому должен быть сброшен, то сначала считываете, а потом сбрасываете.[/uquote]
Мсье видимо хочет атомарную операцию чтение-запись, а не две отдельных.
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

jcxz писал(а):Мсье видимо хочет атомарную операцию чтение-запись, а не две отдельных.
В данном случае в этом есть необходимость?
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

Мурик писал(а):Если флаг по любому должен быть сброшен, то сначала считываете, а потом сбрасываете.
Ага. Я его считываю. Ноль. В это время происходит прерывание, ставит его в единицу. Я, не зная об этом, сбрасываю. Приплыли.

Нет, конечно, если ноль, можно не сбрасывать, или, как вариант, можно в прерывании прибавлять единицу, а при обработке вычитать ее...

Но это все мелочи. А вот если, не найдя нужных флагов, я вздумаю "вздремнуть", то тут можно приплыть по-полной!..
jcxz писал(а):А "здесь" Вы думаете невозможно запретить прерывания?
"Там" это одна машинная команда. А "здесь", как минимум, это вызов чего-то из NVIC_xxx, да еще и параметры передавать.

Неспешно размышляю на тему SVC...
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Мудрый кот
Сообщения: 1846
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="Мурик",url="/forum/viewtopic.php?p=3455735#p3455735"]
jcxz писал(а):Мсье видимо хочет атомарную операцию чтение-запись, а не две отдельных.
В данном случае в этом есть необходимость?[/uquote]
Вы меня спрашиваете? Я без понятия. Это же afz что-то нужно, о чём он не рассказывает.

Добавлено after 3 minutes 42 seconds:
[uquote="afz",url="/forum/viewtopic.php?p=3455738#p3455738"]Ага. Я его считываю. Ноль. В это время происходит прерывание, ставит его в единицу. Я, не зная об этом, сбрасываю. Приплыли.[/uquote]
Извините - а зачем Вы его "сбрасываете", если он и так ==0? :shock:

[uquote="afz",url="/forum/viewtopic.php?p=3455738#p3455738"]Но это все мелочи. А вот если, не найдя нужных флагов, я вздумаю "вздремнуть", то тут можно приплыть по-полной!..[/uquote]
Так не вздрёмывайте 8)

[uquote="afz",url="/forum/viewtopic.php?p=3455738#p3455738"]"Там" это одна машинная команда. А "здесь", как минимум, это вызов чего-то из NVIC_xxx, да еще и параметры передавать.[/uquote]
И здесь аналогичная команда. Учите матчасть.
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

jcxz писал(а):Так не вздрёмывайте
А батарейку как экономить?
jcxz писал(а):И здесь аналогичная команда. Учите матчасть.
А подсказать по-быстрому не ку?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Мудрый кот
Сообщения: 1846
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="afz",url="/forum/viewtopic.php?p=3455753#p3455753"]А батарейку как экономить?[/uquote]
Тогда научитесь это делать правильно.
Если задача/ISR, ставящая флаг, сначала ставит флаг, а потом пингует задачу, которая флаг проверяет, то никто не уснёт навеки.
Подумайте сами почему.

[uquote="afz",url="/forum/viewtopic.php?p=3455753#p3455753"]А подсказать по-быстрому не ку?[/uquote]
CPSID I / CPSIE I
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

afz писал(а):Я его считываю. Ноль. В это время происходит прерывание, ставит его в единицу. Я, не зная об этом, сбрасываю.
Маловероятно. Сбрасывайте через BitBanding (если флаг это один бит в переменной) если установлен.
afz писал(а):"Там" это одна машинная команда. А "здесь", как минимум, это вызов чего-то из NVIC_xxx, да еще и параметры передавать.

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

__disable_irq();
__enable_irq();
Мудрый кот
Сообщения: 1846
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="Мурик",url="/forum/viewtopic.php?p=3455956#p3455956"]Маловероятно. Сбрасывайте через BitBanding (если флаг это один бит в переменной) если установлен.[/uquote]
А смысл? Проверка-сброс бита в плане атомарности ничем не отличается от проверки-сброса переменной. И то и другое - неатомарные операции. Автор же хочет атомарную операцию проверка-сброс.
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

jcxz писал(а): Автор же хочет атомарную операцию проверка-сброс.
Напишите ему как ее сделать.
Ответить

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