- Вложения
-
- ADC_Ext_Trig_Test.rar
- (223.29 КБ) 220 скачиваний
STM32 новичку в ARM что к чему
bezzabotna, может пригодится. Там на SPL сделано для теста (под 103 контроллер, но смысл тот же). Таймер по аппаратному триггеру запускает АЦП каждые 50мс. ДМА складывает это все в массив и после 20 семплов прерывание трансфер комплит.
Иван Сусанин - первый полупроводник 
- Реклама
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Спасибо. Не подскажите оптимальный размер буфера для дма?
У меня три канала, информацию по каждому из них нужно складывать в свой отдельный массив из общего буфера.
Можно сделать маленький дма буфер на 3 ячейки и в прерывании данные быстренько раскидать по массивам, или же долго копить данные в большом буфере и потом долго их сортировать, но прерывание вызывать редко. Или наверно какая-то середина между этими крайностями.
У меня три канала, информацию по каждому из них нужно складывать в свой отдельный массив из общего буфера.
Можно сделать маленький дма буфер на 3 ячейки и в прерывании данные быстренько раскидать по массивам, или же долго копить данные в большом буфере и потом долго их сортировать, но прерывание вызывать редко. Или наверно какая-то середина между этими крайностями.
Я конечно все понимаю, но этого я не понимаю.
- Сообщения: 1846
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[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, но в то же время и уменьшение скорости реакции системы на событие (уменьшение реалтаймовости обработки данных АЦП и отклика на них). И размер выбирается исходя из задачи. Если бы был какой-то один оптимальный на все случаи жизни размер, то он был бы константно зафиксирован в периферии.
Обычно стараются чтобы частота прерываний не превышала нескольких кГц. По возможности.
Значит я был прав: обработчик в таблице прерываний не был прописан и вызывался дефолтный кало-кубовский.
Добавлено after 4 minutes 11 seconds:
[uquote="bezzabotna",url="/forum/viewtopic.php?p=3451056#p3451056"]Спасибо. Не подскажите оптимальный размер буфера для дма?[/uquote]
Увеличение буфера -> уменьшение частоты прерываний -> уменьшение загрузки CPU, но в то же время и уменьшение скорости реакции системы на событие (уменьшение реалтаймовости обработки данных АЦП и отклика на них). И размер выбирается исходя из задачи. Если бы был какой-то один оптимальный на все случаи жизни размер, то он был бы константно зафиксирован в периферии.
Обычно стараются чтобы частота прерываний не превышала нескольких кГц. По возможности.
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Кубом я конкретно для ацп, дма и таймера не пользовалась, но 80% уже написано на HAL, так что менять библиотеку я естественно не буду.
Мне потом одни данные надо через цифровой фильтр пропускать, а другие прореживать.
Мне потом одни данные надо через цифровой фильтр пропускать, а другие прореживать.
Я конечно все понимаю, но этого я не понимаю.
bezzabotna, например в F4 контроллере 3 АЦП, которые можно настроить в TripleMode. В этом режиме контроллер делает 3 измерения одновременно с трех разных каналов, а ДМА автоматом складывает это все в 3 ячейки массива. Один раз запускаете старт измерения по триггеру от таймера, а в прерывании ДМА забираете разложенные по полочкам результаты.
Иван Сусанин - первый полупроводник 
- Реклама
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Вопрос не в этом, а в оптимальном соотношении размера буфера дма и частоты его прерывания по его заполнению.
Зачем включать 3 ацп?
Зачем включать 3 ацп?
Я конечно все понимаю, но этого я не понимаю.
TripleMode нужен если 3 измерения нужно сделать одновременно.
Иван Сусанин - первый полупроводник 
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Мне и режим сканирования вполне подойдет.
Я конечно все понимаю, но этого я не понимаю.
Кстати, а как в STM32 принято делать атомарный опрос флагов? Под флагом я понимаю переменную, которая либо равна нулю (флага нет), либо не равна нулю (флаг есть), а проверка нужна с одновременной очисткой - т.е. сам флаг по-любому должен быть сброшен, стоял он, или нет, а результатом проверки должно быть его значение перед сбросом. Вот и спрашивается, как правильно сделать это атомарно, чтобы никакая прерывающая программа не смогла вмешаться между снятием значения флага в результат и очисткой этого флага? На AVR это делалось методом "запросто" - закрыл прерывания [cli();], отманипулировал флагом и открыл прерывания [sei();]. А как быть здесь?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
- Сообщения: 3386
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Если флаг по любому должен быть сброшен, то сначала считываете, а потом сбрасываете.
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
- Сообщения: 1846
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="dosikus",url="/forum/viewtopic.php?p=3455672#p3455672"]Атомарные манипуляции с битами -читайте о Bit Banding.[/uquote]
А если судьба неблагосклонна и его нет?... Тогда читаем о командах эксклюзивного доступа LDREX/STREX.
Да и разве в вопросе прозвучало слово "бит"?
Добавлено after 3 minutes 37 seconds:
[uquote="afz",url="/forum/viewtopic.php?p=3455648#p3455648"]как правильно сделать это атомарно, чтобы никакая прерывающая программа не смогла вмешаться между снятием значения флага в результат и очисткой этого флага? На AVR это делалось методом "запросто" - закрыл прерывания [cli();], отманипулировал флагом и открыл прерывания [sei();]. А как быть здесь?[/uquote]
А "здесь" Вы думаете невозможно запретить прерывания?
Добавлено after 5 minutes 10 seconds:
[uquote="Мурик",url="/forum/viewtopic.php?p=3455663#p3455663"]Если флаг по любому должен быть сброшен, то сначала считываете, а потом сбрасываете.[/uquote]
Мсье видимо хочет атомарную операцию чтение-запись, а не две отдельных.
А если судьба неблагосклонна и его нет?... Тогда читаем о командах эксклюзивного доступа LDREX/STREX.
Да и разве в вопросе прозвучало слово "бит"?
Добавлено after 3 minutes 37 seconds:
[uquote="afz",url="/forum/viewtopic.php?p=3455648#p3455648"]как правильно сделать это атомарно, чтобы никакая прерывающая программа не смогла вмешаться между снятием значения флага в результат и очисткой этого флага? На AVR это делалось методом "запросто" - закрыл прерывания [cli();], отманипулировал флагом и открыл прерывания [sei();]. А как быть здесь?[/uquote]
А "здесь" Вы думаете невозможно запретить прерывания?
Добавлено after 5 minutes 10 seconds:
[uquote="Мурик",url="/forum/viewtopic.php?p=3455663#p3455663"]Если флаг по любому должен быть сброшен, то сначала считываете, а потом сбрасываете.[/uquote]
Мсье видимо хочет атомарную операцию чтение-запись, а не две отдельных.
- Сообщения: 3386
- Зарегистрирован: Пн окт 11, 2010 19:00:08
В данном случае в этом есть необходимость?jcxz писал(а):Мсье видимо хочет атомарную операцию чтение-запись, а не две отдельных.
Ага. Я его считываю. Ноль. В это время происходит прерывание, ставит его в единицу. Я, не зная об этом, сбрасываю. Приплыли.Мурик писал(а):Если флаг по любому должен быть сброшен, то сначала считываете, а потом сбрасываете.
Нет, конечно, если ноль, можно не сбрасывать, или, как вариант, можно в прерывании прибавлять единицу, а при обработке вычитать ее...
Но это все мелочи. А вот если, не найдя нужных флагов, я вздумаю "вздремнуть", то тут можно приплыть по-полной!..
"Там" это одна машинная команда. А "здесь", как минимум, это вызов чего-то из NVIC_xxx, да еще и параметры передавать.jcxz писал(а):А "здесь" Вы думаете невозможно запретить прерывания?
Неспешно размышляю на тему SVC...
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
- Сообщения: 1846
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="Мурик",url="/forum/viewtopic.php?p=3455735#p3455735"]
Вы меня спрашиваете? Я без понятия. Это же afz что-то нужно, о чём он не рассказывает.
Добавлено after 3 minutes 42 seconds:
[uquote="afz",url="/forum/viewtopic.php?p=3455738#p3455738"]Ага. Я его считываю. Ноль. В это время происходит прерывание, ставит его в единицу. Я, не зная об этом, сбрасываю. Приплыли.[/uquote]
Извините - а зачем Вы его "сбрасываете", если он и так ==0?
[uquote="afz",url="/forum/viewtopic.php?p=3455738#p3455738"]Но это все мелочи. А вот если, не найдя нужных флагов, я вздумаю "вздремнуть", то тут можно приплыть по-полной!..[/uquote]
Так не вздрёмывайте
[uquote="afz",url="/forum/viewtopic.php?p=3455738#p3455738"]"Там" это одна машинная команда. А "здесь", как минимум, это вызов чего-то из NVIC_xxx, да еще и параметры передавать.[/uquote]
И здесь аналогичная команда. Учите матчасть.
В данном случае в этом есть необходимость?[/uquote]jcxz писал(а):Мсье видимо хочет атомарную операцию чтение-запись, а не две отдельных.
Вы меня спрашиваете? Я без понятия. Это же afz что-то нужно, о чём он не рассказывает.
Добавлено after 3 minutes 42 seconds:
[uquote="afz",url="/forum/viewtopic.php?p=3455738#p3455738"]Ага. Я его считываю. Ноль. В это время происходит прерывание, ставит его в единицу. Я, не зная об этом, сбрасываю. Приплыли.[/uquote]
Извините - а зачем Вы его "сбрасываете", если он и так ==0?
[uquote="afz",url="/forum/viewtopic.php?p=3455738#p3455738"]Но это все мелочи. А вот если, не найдя нужных флагов, я вздумаю "вздремнуть", то тут можно приплыть по-полной!..[/uquote]
Так не вздрёмывайте
[uquote="afz",url="/forum/viewtopic.php?p=3455738#p3455738"]"Там" это одна машинная команда. А "здесь", как минимум, это вызов чего-то из NVIC_xxx, да еще и параметры передавать.[/uquote]
И здесь аналогичная команда. Учите матчасть.
А батарейку как экономить?jcxz писал(а):Так не вздрёмывайте
А подсказать по-быстрому не ку?jcxz писал(а):И здесь аналогичная команда. Учите матчасть.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
- Сообщения: 1846
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[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
Тогда научитесь это делать правильно.
Если задача/ISR, ставящая флаг, сначала ставит флаг, а потом пингует задачу, которая флаг проверяет, то никто не уснёт навеки.
Подумайте сами почему.
[uquote="afz",url="/forum/viewtopic.php?p=3455753#p3455753"]А подсказать по-быстрому не ку?[/uquote]
CPSID I / CPSIE I
- Сообщения: 3386
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Маловероятно. Сбрасывайте через BitBanding (если флаг это один бит в переменной) если установлен.afz писал(а):Я его считываю. Ноль. В это время происходит прерывание, ставит его в единицу. Я, не зная об этом, сбрасываю.
afz писал(а):"Там" это одна машинная команда. А "здесь", как минимум, это вызов чего-то из NVIC_xxx, да еще и параметры передавать.
Код: Выделить всё
__disable_irq();
__enable_irq();- Сообщения: 1846
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="Мурик",url="/forum/viewtopic.php?p=3455956#p3455956"]Маловероятно. Сбрасывайте через BitBanding (если флаг это один бит в переменной) если установлен.[/uquote]
А смысл? Проверка-сброс бита в плане атомарности ничем не отличается от проверки-сброса переменной. И то и другое - неатомарные операции. Автор же хочет атомарную операцию проверка-сброс.
А смысл? Проверка-сброс бита в плане атомарности ничем не отличается от проверки-сброса переменной. И то и другое - неатомарные операции. Автор же хочет атомарную операцию проверка-сброс.
- Сообщения: 3386
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Напишите ему как ее сделать.jcxz писал(а): Автор же хочет атомарную операцию проверка-сброс.


