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

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

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

Сообщение Myp3ik »

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

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

Сообщение bezzabotna »

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

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

Сообщение afz »

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

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

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

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

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

Сообщение dosikus »

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

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

Сообщение 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]
Мсье видимо хочет атомарную операцию чтение-запись, а не две отдельных.
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

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

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

Сообщение afz »

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

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

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

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

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

Сообщение 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
Откуда: Караганда, Казахстан

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

Сообщение afz »

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

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

Сообщение 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
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

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

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

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

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

Сообщение jcxz »

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

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

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

jcxz писал(а): Автор же хочет атомарную операцию проверка-сброс.
Напишите ему как ее сделать.
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

[uquote="Мурик",url="/forum/viewtopic.php?p=3455976#p3455976"]Напишите ему как ее сделать.[/uquote]
LDREX/STREX чем не устраивает?
Аватара пользователя
afz
Опытный кот
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

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

Сообщение afz »

[uquote="jcxz",url="/forum/viewtopic.php?p=3455975#p3455975"][uquote="Мурик",url="/forum/viewtopic.php?p=3455956#p3455956"]Маловероятно. Сбрасывайте через BitBanding (если флаг это один бит в переменной) если установлен.[/uquote]
А смысл? Проверка-сброс бита в плане атомарности ничем не отличается от проверки-сброса переменной. И то и другое - неатомарные операции. Автор же хочет атомарную операцию проверка-сброс.[/uquote] Может я неудачно выразился...

Еще со времен PDP-11 я решал задачи управления чем-либо в реальном времени так: основная программа - своего рода диспетчер задач - в своем основном цикле проверяет флажки готовности задач, при появлении кого-то из них очищает его и вызывает короткую подпрограмму действий по этому флажку. Взводятся же эти флажки в программах обслуживания прерываний. Они вообще предельно короткие: сняли байт данных с регистра аппаратуры (если надо, конечно), взвели флажок, что этот байт поступил, и RTI.

Из-за особенностей команды ожидания PDP-11 при такой организации главного цикла переводить процессор в состояние ожидания было нельзя. Да, в общем-то это было и неактуально - и Э-60, и ДВК жрали электричество, как свинья помои, о батарейном питании можно было и не мечтать. Позже, на АВР, я добавил в этот нехитрый алгоритм примитивной многозадачки ожидание - если ни одной активной задачи не найдено, sleep(). Естественно, дОлжным образом манипулируя разрешениями и запрещениями прерываний, где надо.

Сейчас я планирую нечто подобное развернуть на STM32, вот и спрашиваю.

Ставить "взрослую" RTOS смысла не вижу - предстоящие задачи достаточно примитивны. Как-то специально использовать доступную многоуровневость системы прерываний тоже не собираюсь, из тех же соображений.

Так, что мне нужно простейшее действие - пробежавшись по таблице задач и не найдя готовой, грамотно заснуть.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

[uquote="afz",url="/forum/viewtopic.php?p=3456644#p3456644"]проверяет флажки готовности задач, при появлении кого-то из них очищает его[/uquote]
На вопрос ответьте, пожалуйста.
ПростоНуб писал(а):LDREX/STREX чем не устраивает?
Этот механизм в STM32 именно для таких задач и заточен.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="afz",url="/forum/viewtopic.php?p=3456644#p3456644"]Так, что мне нужно простейшее действие - пробежавшись по таблице задач и не найдя готовой, грамотно заснуть.[/uquote]
Для такой задачи атомарность установки-сброса флажков не нужна. Bit-band нужен только если эти флажки сделать битовыми, но это имеет смысл только если задач большое количество (тогда можно быстрее обнаруживать установленный бит считав 32-битное слово и воспользовавшись командой CLZ). Если без ОС, то процесс, ждущий флажков, лучше оформить в виде ISR возбуждаемого программно. Приоритет этого прерывания должен быть ниже любого из прерываний, устанавливающих флажки. Собственно так получается аналог ОС, но с одной задачей (ISR диспетчера).
Процесс, ждущий флажков, можно конечно сделать и простым бесконечным циклом.
В ISR-ах, устанавливающих флажки, установка флажка должна сопровождаться программным возбуждением прерывания (через NVIC).
Примерно так:
Спойлер

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

#define BITBAND_RAM_ALIAS_BASE  0x22000000 //0x22000000-0x2234FFFF
#define BITBAND_RAM_REGION_BASE 0x20000000 //0x20000000-0x2006FFFF
#define BITBAND_IO_ALIAS_BASE   0x42000000 //0x42000000-0x43FFFFFF
#define BITBAND_IO_REGION_BASE  0x40000000 //0x40000000-0x400FFFFF

#define BITBAND(addr, bit, R, A) \
  ((u32 *)((u32)(addr) - (R) + ((A) >> 5) << 5) + (bit))
#define BITBAND_IO(addr, bit) \
  BITBAND(addr, bit, BITBAND_IO_REGION_BASE, BITBAND_IO_ALIAS_BASE)
#define BITBAND_RAM(addr, bit) \
  BITBAND(addr, bit, BITBAND_RAM_REGION_BASE, BITBAND_RAM_ALIAS_BASE)

//Установка состояния ожидания для прерывания num
#define IntSet(num) { NVIC.SETPEND[(num) >> 5] = 1u << ((num) & 0x1F); }

enum { //флаги задач; приоритет обработки уменьшается с ростом номера флага, TASK0 - максимальный приоритет
  TASK0, TASK1, TASK2, ..., TASK_n}; //TASK_n должно быть <=32
u32 volatile tasksPend @ ".BITBAND_RAM" = 0; //секцию .BITBAND_RAM с помощью командного файла компоновщика расположить в области ОЗУ, поддерживающей bit-band

extern "C" void isrDispetcher() //ISR диспетчера
{
  u32 j;
  while (j = tasksPend) {
    uint i = __CLZ(__RBIT(j)); //получаем номер наиболее приоритетного из установленных флагов задач
    BITBAND_RAM(tasksPend, i) = 0; //сбросим этот флаг
    switch (i) {
      case TASK0: /* обработка для TASK0 */ break;
      case TASK1: /* обработка для TASK1 */ break;
      case TASK2: /* обработка для TASK2 */ break;
    }
  }
}

extern "C" void isrTask0()
{
  BITBAND_RAM(tasksPend, TASK0) = 1; //установим свой флаг
  IntSet(NVIC_VECTOR_FOR_DISPETCHER);
  //сделаем полезную работу
}
Если в Вашем МК не реализован bit-band, то можно этот код переделать под вариант на LDREX/STREX или на критических секциях (запретах прерываний).
Также, если задач - малое количество, можно перейти на char-флаги, вместо битовых как тут.

При этом в фоновом процессе (функция main()) после инициализации всей этой системы просто зацикливаетесь в цикле: while (1) __WFE();
Или установив бит SLEEPONEXIT в System Control Register ядра Cortex-M можно избавиться от этого цикла.
А также фоновый процесс (main()) можно использовать для измерения загрузки CPU: бесконечно инкрементировать счётчик, защёлкивая его через равные промежутки времени и находя отношение защёлкнутого значения к значению для случая когда процессор простаивает (измеряется предварительной калибровкой).
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="jcxz",url="/forum/viewtopic.php?p=3456724#p3456724"]Если без ОС, то процесс, ждущий флажков, лучше оформить в виде ISR возбуждаемого программно. Приоритет этого прерывания должен быть ниже любого из прерываний, устанавливающих флажки. Собственно так получается аналог ОС, но с одной задачей (ISR диспетчера).
Процесс, ждущий флажков, можно конечно сделать и простым бесконечным циклом.
В ISR-ах, устанавливающих флажки, установка флажка должна сопровождаться программным возбуждением прерывания (через NVIC).[/uquote]
В кортексах есть PendSV - это как раз прерывание генерируемое программно, для чего нужно включить соответствующий бит:

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

SCB->ICSR = SCB_ICSR_PENDSVSET_Msk;
Фактически можно в основном цикле проверять низкоприоритетные флаги, обработчики которых могут занимать длительное время, при этом периодически в прерывании таймера(и/или в обработчиках других прерываний) генерить PendSV и в нем запускать более приоритетные задачи, причем в самом прерывании таймера можно обрабатывать задачи с приоритетов выше тех, которые выполняются в PendSV, т.е. уже получилось 3 приоритета, если не считать полтора десятка приоритетов всех остальных прерываний.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

[uquote="Reflector",url="/forum/viewtopic.php?p=3456760#p3456760"]Фактически можно в основном цикле проверять низкоприоритетные флаги, обработчики которых могут занимать длительное время[/uquote]
Каким-то полингом попахивает. :)
Ответить

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