LINUX.ORG.RU

Простой event loop для STM32

 


0

4

Всем привет!

Изучаю разработку под STM32. Более-менее понял базовые вещи про прерывания и работу с периферией. Задумался над тем, как бы организовать простенький event-loop, типа libev.

Одна из идей завести битовую маску событий, которые выставляются в прерываниях, а внутри event-loop'a анализируются и вызывают соответсвующие колбеки. Но хочется, чтобы event-loop «спал», пока в эту битовую маску что-нибудь не запишут - пока не нашел, как это сделать.

Другая идея - использовать низкоприоритетное прерывания для event-loop'a. Т.е., когда срабатывает какое-то прерывание - оно пишет бит-событие и генерирует низко-приоритетное прерывание. Даже нашел вроде бы такую штуку - PendSV называется.

Но может уже существуют готовые event-loop'ы для большинства случаев или из которых можно сделать то, что нужно? А может это вообще неверный подход при работе с STM32?

★★

Извращения вроде libev нужны только в операционках «нереального времени». А на МК у тебя операционки нет и все крутится в более-менее реальном времени. Что угодно можно сделать: хочешь, сразу в прерывании все обрабатывай, хочешь — в прерывании только флаг ставь, а в основном цикле проверяй флаги и обрабатывай (именно этот вариант мне и нравится больше всего).

Eddy_Em ☆☆☆☆☆
()

Все внешние сигналы вешаешь на прерывания и там же, в прерываниях пишешь их обработку и выдачу результата. В главном цикле одна команда - для загона процессора в спячку.

Если нужно что-то периодически считать или следить за временем - настраиваешь таймер и на его прерывание вешаешь твой периодический обсчёт - часики там, или ещё чего.

Собственно event loop не нужен - у тебя его функции будет выполнять заложенная в железе логика прерываний.

В большинстве случаев, если не нужно разделение на пользователей с разными привилегиями и всё такое - всё достаточно легко укладывается тупо в функции обработки прерываний, а в «главном цикле» процессор просто спит.

Stanson ★★★★★
()
Ответ на: комментарий от Eddy_Em

именно этот вариант мне и нравится больше всего

Потому что с глобальными переменными, да?

anonymous
()
Ответ на: комментарий от anonymous

Ну глобальные, и чо? Зато конфликтов прерываний нет.

aiqu6Ait ★★★★
()

Но хочется, чтобы event-loop «спал», пока в эту битовую маску что-нибудь не запишут - пока не нашел, как это сделать.

См на __WFI() из CMSIS.
А Вообще, выше уже ответили. Есть два пути:


  • Выставлять флаги в прерываниях, и что-то делать в главном цикле.
  • Обрабатывать все события сразу в прерываниях


А что из этого лучше/хуже, нужно смотреть уже конкретную задачу и её требования.

joy4eg ★★★★★
()
Ответ на: комментарий от joy4eg

В свое время пользовался еще такой штукой. Довольно легко портируется куда хочешь. И далее можно дергать uos_task_event_send и uos_task_event_recv, работает вполне ОК.

joy4eg ★★★★★
()

Если ресурсы позволяют, может заюзать mbed.org, там есть понятие очереди (Queue.PutIrq). Либо любую другую ОС с готовыми очередями, например ChibiOS.

true_admin ★★★★★
()
Ответ на: комментарий от joy4eg

Спасибо. Что-то видел про WFI, но в тот момент не осознал, что это. Вроде сейчас понял, что это именно то, что нужно для первого варианта.

Обрабатывать все в прерываниях мне кажется неправильным. Т.к. прерывания нужно как можно быстрее обрабатывать, чтобы все успели поработать. И сложность кода, имхо, возрастет. Вот простой пример. Хочу что-нибудь послать в UART (или SPI). Пишу эти данные в очередь, а в прерывании перекладываю из очереди в нужные регистры. Но в этом случае нужно будет разруливать конфликты доступа к очереди.

kulti ★★
() автор топика
Последнее исправление: kulti (всего исправлений: 1)
Ответ на: комментарий от kulti

Начет UART'a, Я бы сразу советовал использовать DMA. И быстрей, и проще :)
А так, смотрите как Вам удобней.

joy4eg ★★★★★
()

[оффтоп немного] Приветствую! Автор, а как бы вот начать понимать в этой железке? Можешь посоветовать какую плату прикупить, что почитать? [/оффтоп немного]

ossa ★★
()
Ответ на: комментарий от ossa

Ищи на ибее STM32F103 devboard, цена — где-то 8-10 баксов за штучку.

Читать даташиты.

Для простоты лучше воспользоваться библиотекой opencm3, но все равно многие вещи придется напрямую регистрами городить.

Всякое дерьмище вроде SPL/HAL/Cube и километровой палкой не трогай — это для рукожопых мышкотыкательных вантузятников.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от ossa

P.S. Посмотри мои «сниппеты».

P.P.S. Для прошивки еще надо за доллар купить переходничок USB<->UART. Шьется через бутлодыря, поэтому в своих железяках лучше вешать кнопки и на RESET, и на BOOT, а в случае девборды просто вешаешь кнопочку через разъемчик.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от kulti

Угу, я при помощи DMA и таймера забульбенил практически аппаратный 1-wire.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от ossa

На алиэкспресе менее чем за 5 баксов брал http://www.aliexpress.com/item/1pcs-Arm-cortex-m3-stm32f103c8t6-stm32-core-bo...

Как начать - вопрос сложный =) Я читал, искал примеры моргания светодиодом и разбирался со всем этим добрищем.

Существуют всякие IDE и прочее, но я фигачу на SPL и cmake. Если интересует именно такая связка, то могу подробнее написать.

kulti ★★
() автор топика
Ответ на: комментарий от Eddy_Em

Отлично. Интересный проект. Аж самому что-то навернуть захотелось, пойду пока книжку покурю.

Тут у коллеги по случаю бесхозная STM32F3DISCOVERY нашлась, которую он мне в пользование сможет одолжить пока свою не прикуплю.

ossa ★★
()
Ответ на: комментарий от ossa

Ну, насчет сущностей - это как посмотреть. Я использую следующий набор: 1. arm-none-eabi toolchain - без этого, понятное дело, никак 2. stlink - использую для прошивки (это железка за 2-3 бакса + утилитка st-flash https://github.com/texane/stlink). Можно шить через UART и bootloader, как Эдди делает, тогда по идее ничего дополнительно не понадобится. 3. SPL - стандартная библитека для работы периферией. Ее делает производитель чипов. Эдди предлагает использовать библиотеку, которую разрабатывает сообщество. Никаких особых преимуществ у нее нет, т.к. периферию инициализируют один раз и пофиг как ты это будешь делать. Можно вообще без библиотек - самому во все регистры нужные писать. У ST есть тула графическая, где ставишь галочки, какая периферия нужна, и она тебе генерит инициализационный код. Я этой тулой пока не пользовался и не уверен, есть ли он под Linux.

Я пока экспериментирую. Вот мой непричесанный cmake http://pastebin.com/cwNegznD, который я запускаю с toolchain-файлом http://pastebin.com/xpQVGzjt

kulti ★★
() автор топика

software interrupt еще есть: записал маску - вызвал swi

zudwa
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.