STM32 Duino *Loop *

AG123
Ср. 07 ноября 2018 г., 19:21
всем привет,

Я опубликовал петлю события для STM32Duino (на основе Libmaple Core)
(Обновил этот пост в ReadMe.MD на GitHub, отформатирован с помощью Marckdown)
https: // github.com/ag88/stm32duino-eventloop

Если у вас есть Windows, Java и другие подобные (GUI?) приложения раньше, вы были бы знакомы с петлей события, я.эн. Ваше приложение обрабатывает события, а петля Event Dispatching Events E.глин. Нажатие мыши, нажатие кнопок и т. Д

Попробуйте демо:
В каталоге BIN на GitHub я загрузил предварительно скомпилированное Flash Image STM32DUINO: bin/stm32duinoeventloop.бин
Это цель для Maple Mini (и клонов) (i.эн. Светодиодный штифт на выводе 33) и должен использовать загрузчик STM32Duino (i.эн. Код по телефону 0x8002000)
Вы можете установить его в Maple Mini, используя dfu-util -a 2 -RD STM32duinoEventloop.bin

Стивестронг
Ср. 07 ноября 2018 г., 20:24
HM, это выглядит немного сложно.
Вы когда -нибудь рассматривали Arduino Task Scheduler?

AG123
Ср. 07 ноября 2018 г. 20:32
Ну, я пошел со своей собственной петлей события, так как концепция мне более знакома :ржу не могу:
Обработчики событий казались немного отличными от простых задач, планировщиков. Понятие использует очередь / цикл событий
Это сделало бы его похоже на «оконные» дизайны графических интерфейсов, которые в значительной степени обусловлены событиями

Я изначально пробовал RTO, но я думаю, что у RTO есть некоторые недостатки в том, что задачи не являются обычными функциями, и, следовательно. Другая проблема с RTOS заключается в том, что дизайн несколько фрагмент очень ограниченный 20K SRAM, следовательно, MM/BP выходит из памяти слишком рано.
При использовании цикла событий или, возможно, кооперативного планировщика задач позволяет использовать обычные функции, в которых переменные размещены в стеке и развернуты до выполнения следующей задачи. Каждая из задач сохраняет государство только в определенных глобальных переменных. Это сохраняет много памяти и позволяет более сложным приложениям работать на MM/BP в SRAM 20K

Моду
Чт, 8 ноября 2018 г., 10:17 утра
Похоже, ты грязный руки, заставляя все это работать, как ты себе представлял. Надеюсь, это было весело : mrgreen:

Arkhipenko/Taskscheduler по -прежнему мой выбор, особенно когда я получаю свой запрос на привлечение, чтобы мы могли бесплатно иметь эту функцию сна 1 мс бесплатно.

Мне нравится ваш подход к событиям, где вы передаете хороший и эффективный переход для идентификатора. Собираюсь осмотреться немного больше.

AG123
Чт, 8 ноября 2018 г., 13:25
У меня на самом деле был ЖК -дисплей, SD -карта, эта мигающая демонстрация и серийный ввод USB (эта демонстрация), работающие на Maple Mini, используя этот цикл событий, следовательно, этот цикл событий «работает» !
Я предполагаю, что для хардкора можно взять ЖК -дисплей ILI9341, запрограммировать контроллер сенсорного экрана XPT2046 в качестве обработчика устройства, отправляя события прикосновения.
Затем постройте слой графического интерфейса, у вас есть отзывчивый контактный графический интерфейс на STM32 (Duino), меню, кнопки и все
: D

Рик Кимбалл
Чт, 8 ноября 2018 г., 15:46
Продолжайте идти, и вы попадаете в состояние искусства 1980 -е годы :) .. с драгоценными камнями и пальмами

AG123
Чт, 8 ноября 2018 г., 15:48
ржу не могу :ржу не могу:

Моду
Чт, 8 ноября 2018 г., 16:10
Для будущей ссылки я перестал реализовать круговые буферы, когда нашел это Шаблон буфера кольца C ++.

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

AG123
Чт, 8 ноября 2018 г., 16:24
Спасибо, моду
реализация Ringbuffer, используемое в моем EventLoop, от https: // github.com/anderskaloer/кольцевой буфер
Библиотека обратного вызова хороша и может найти хорошее использование.

Что касается моего цикла событий, я разработал это после того, как у меня не хватало памяти 20K на MM с использованием RTO, память фрагментирована из -за структуры VTASKS, контекстов и различных проблем RTOS. Получается, что цикл событий - это концепция, с которой я знаком, а не замена ОС, я попытался разработать его, и вот она : D

Я думаю, что это, вероятно, является частью «двигателя» различных дисплеев с графическим интерфейсом (Windows и т. Д.) и что, вероятно, означает, что это может быть возможно разработать в интерактивную систему графического интерфейса на основе Widget на STM32 (Duino), i.эн. Эти панели, кнопки, меню и т. Д. Я еще не готов исследовать это, но в то же время этот цикл событий был полезным, с которым я играл.

Обратите внимание, что вы можете опубликовать событие в очередь событий из рутины обработчика прерываний

Рик Кимбалл
Чт, 8 ноября 2018 г., 16:24
Я заметил с обеими этими LIB, ни один из них не определяет индекс головы и хвоста как летучие. С использованием One Ag123 он прокомментировал разблокировку Mutex Lock с упомянутым модуром, я не вижу атомных вызовов. Как эти вещи работают должным образом при использовании внутри прерывания?

AG123
Чт, 8 ноября 2018 г., 16:31
Я подумал, что в потоке нормального выполнения STM32 на самом деле нет нескольких потоков, чередующиеся потоки выполнения на самом деле являются самими потоками обработчиков прерываний. В этом смысле какой -то мутекс может быть достигнут путем включения / отключения прерываний

всего 2 цента

Рик Кимбалл
Чт, 8 ноября 2018 г., 16:41
Вы должны думать о прерывании как о отдельном потоке. Возьмите это, например:
/** * Returns whether a ring buffer is full. * @param buffer The buffer for which it should be returned whether it is full. * @return 1 if full; 0 otherwise. */ inline uint8_t ring_buffer_is_full(ring_buffer_t *buffer) { return ((buffer->head_index - buffer->tail_index) & RING_BUFFER_MASK) == RING_BUFFER_MASK; }

Стивестронг
Чт, 8 ноября 2018 г., 16:49
Все переменные, используемые в ísrs, должны быть нестабильными, иначе вы столкнетесь с проблемами, рано или поздно.

Может быть, интересно: реализация сигнала/слота на основе Дон Клугстон’S самые быстрые делегаты C ++.

AG123
Чт, 8 ноября 2018 г., 16:55
Я думаю, что я сделал в коде цикла событий, я отключаю прерывания при публикации и выходе из событий из очереди
https: // github.com/ag88/stm32duino-evon ... доклада.CPP#161 int8_t CEventLoop::post(Event& event) { noInterrupts(); if(m_eventbuffer->is_full()) return -1; m_eventbuffer->push(event); // Serial.print("post:"); // uint16_t ev = static_cast(event.event); // Serial.println(ev); interrupts(); return 0; }

Рик Кимбалл
Чт, 8 ноября 2018 г., 17:00
Кажется, драконовский отключает все прерывания. Вы делаете это каждое место, где используется кольцевой буфер? Вид убийств. Если вы начнете делать печатные операторы, когда прерывания заблокированы, вы, вероятно, пропустите входящие данные.

Моду
Чт, 8 ноября 2018 г., 17:36
[Рик Кимбалл - Чт, 8 ноября 2018 г., 16:24] - (...) с упомянутым модуром я не вижу атомных звонков. Как эти вещи работают должным образом при использовании внутри прерывания?
Очень хороший момент! В случае библиотеки Wizard97 волшебный соус библиотека портативных атомных операций.

AG123
Чт, 8 ноября 2018 г., 17:45
[Моду - Чт, 8 ноября 2018 г., 17:36] -
[Рик Кимбалл - Чт, 8 ноября 2018 г., 16:24] - (...) с упомянутым модуром я не вижу атомных звонков. Как эти вещи работают должным образом при использовании внутри прерывания?
Очень хороший момент! В случае библиотеки Wizard97 волшебный соус библиотека портативных атомных операций.
Из любопытства я посмотрел на секретный соус, я увидел
https: // github.com/wizard97/simplyatomi ... стер/рука.час __asm__ __volatile__ ("cpsie i" ::);

Рик Кимбалл
Чт, 8 ноября 2018 г. 18:03
[Моду - Чт, 8 ноября 2018 г., 17:36] - Очень хороший момент! В случае библиотеки Wizard97 волшебный соус библиотека портативных атомных операций.
Если вы не изменили заголовок Ringbuffer, он не использует это:

https: // github.com/wizard97/arduinoring ... Gbuf.H#L48

И это предупреждение также зловещее:

https: // github.com/wizard97/arduinoring ... Gbuf.H#L57

AG123
Чт, 8 ноября 2018 г., 18:32
Я думаю, что в Cortex-M / STM32 можно отключить прерывания в определенных группах (приоритеты? маски?)
https: // Сообщество.рука.com/iot/ulcedded/ ... приоритеты
Поскольку мы имеем дело с общими переменными в реализации Ringbuffer, которая не безопасна
Мои мысли в том, чтобы использовать маски и таковые, чтобы только перерывы, которые вызывают коды манипуляции с кольцами, были отключены.
Другие прерывания, которые не вмешиваются в (тот же) кольцевой подтяжкой, можно было избавиться
На данный момент noEversrupts (); и прерывания () являются общими, включающими и отключают все механизмы прерываний, которые достигнут производительности.
Для выполнения мелкого контроля зерна может потребоваться больше, чем существующие коды, доступные в ядре, но улучшит производительность, сохраняя при этом некоторый уровень безопасности потоков при работе с кольцевым буфером
всего 2 цента
может посмотреть на это в другой раз
:ржу не могу:

Рик Кимбалл
Чт, 8 ноября 2018 г., 21:27
Вот мой взгляд на безопасное кольцо:

https: // Gist.GitHub.com/rickkimball/8f6 ... 44B83D96D0

Мой подход состоит в том, чтобы использовать союз, который позволяет вам получить доступ к головой и хвосту в одной инструкции ASM или доступа к каждому независимо. Я загружаю использование оба члена профсоюза в регистр временного работы и только записываю головы или хвост. Этот подход, кажется, работает без отключения прерываний, когда у вас есть один читатель и один писатель.

Моду
Пт, 09 ноября 2018 г., 10:17 утра
[Рик Кимбалл - Чт, 8 ноября 2018 г. 18:03] - Если вы не изменили заголовок Ringbuffer, он не использует:

https: // github.com/wizard97/arduinoring ... Gbuf.H#L48

И это предупреждение также зловещее:

https: // github.com/wizard97/arduinoring ... Gbuf.H#L57
Вы правы, я забыл, что я так долго использую филиал Dev. Основной филиал не поддерживает все доски, только те, которые адресованы в #Defines. Точка использования атомной библиотеки состоит в том, чтобы удалить все, что #ifdef crufft.

https: // github.com/wizard97/arduinoring ... Gbuf.C#165


Тем не менее, проверю ваше решение.

Mrburnette
Пт 09 ноября 2018 г., 16:51
[AG123 - Ср. 07 ноября 2018 г. 19:21] - всем привет,

Я опубликовал петлю события для STM32Duino (на основе Libmaple Core)
(Обновил этот пост в ReadMe.MD на GitHub, отформатирован с помощью Marckdown)
https: // github.com/ag88/stm32duino-eventloop
...
Хороший.

Но есть некоторые накладные расходы, связанные с реализацией... Я не запустил сеанс, чтобы изучить специфики, но для участников форума, которые царапают головы и несколько потеряны Основной код, чтобы сохранить свои мысли прямо. Ваш Loop () будет выглядеть как -то вроде: void loop( void) { function1(); function2(); function3(); }

Моду
Пт, 09 ноября 2018 г., 17:31
Для моих более простых проектов я следую совету Рэя. Например, я сделал Tiny85 в качестве контроллера для H-Bridge с сервоприводом Servo Swm.

Основная петля выглядит так:
if(millis() - LastUpdated1) { LastUpdated1 = millis(); Update1(); } else if(millis() - LastUpdated2) { LastUpdated2 = millis(); Update2(); }else { SleepFor1Millisecond(); }

AG123
Пт 09 ноября 2018 г., 17:34
Спасибо, Рэй, ИМХО, петля событий немного отличается от того, чтобы сказать, что вы называете функцию после другой.
Хотя я согласен, что вызов одной функции за другой и в основном сохранение состояния в каждой функции приведет к более слабым реализациям и, следовательно, сохранению памяти.
На форуме Arduino кто -то разместил этот демонстрационный код для нескольких вещей одновременно
https: // форум.Ардуино.CC/INDEX.PHP?Тема = 223286.0
Что я думаю, приведет к гораздо более слабой реализации при сохранении состояния в каждой функции

Цикл события - это абстракция, которая смоделирована после очереди сообщений, в попытке найти хорошую диаграмму, я наткнулся на узел.JS, о котором я не знаю, но в нем есть цикл событий.
https: // www.Учебное пособие.com/nodejs/n ... t_loop.htm
Изображение
https: // en.Википедия.org/wiki/event_loop
Я думаю, что абстракция цикла событий, тем не менее, полезна, в определенном смысле из -за использования очереди событий, события становятся последовательными, а не одновременными. Это может помочь упростить некоторые сценарии, e.глин. Прерывания могут также «публиковать события» в очередь, так что вещи обрабатываются последовательно.
Но как это происходит, это «асинхрон» я.эн. Не в реальном времени, частично из -за использования очереди событий и т. Д

Mrburnette
Сб 10 ноября 2018 г., 4:32
[AG123 - Пт, 09 ноября 2018 г., 17:34] - Спасибо, Рэй, ИМХО, петля событий немного отличается от того, чтобы сказать, что вы называете функцию после другой.
...
Я думаю, что абстракция цикла событий, тем не менее, полезна, в определенном смысле из -за использования очереди событий, события становятся последовательными, а не одновременными. Это может помочь упростить некоторые сценарии, e.глин. Прерывания могут также «публиковать события» в очередь, так что вещи обрабатываются последовательно.
Но как это происходит, это «асинхрон» я.эн. Не в реальном времени, частично из -за использования очереди событий и т. Д
Я знаком с циклами событий, обратными вызовами, Lambda функциями и 30 -летними идеями ООП. Но существует правило от 80% до 20%, что большинство проблем в области компьютерных наук можно решить с помощью прямого встроенного функционального кодирования. Я предполагаю, что только 10% участников этого форума действительно понимают вашу реализацию. 20% - это отличная причина продолжить свой логический путь мышления.

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

Моя точка зрения в том, что если читатели не понимают, что вы делаете и почему они не должны чувствовать, что их оставляют; Большинство их проектов могут быть реализованы с прямыми встроенными вызовами функций.

Луча

AG123
Сб 10 ноября 2018 г. 11:24
Спасибо, Рэй,
Я подумал с этим циклом события, все, вероятно, всего в нескольких хмеле от графического интерфейса, просто я еще не знаю, как собрать это вместе.
В некотором смысле скажем, что позволяет разделить ЖК -дисплей 320x240 на дисплей и, возможно, справа на несколько «кнопок» (которые будут выглядеть как меню), который мог бы сделать простой графический интерфейс.
Тогда мне все равно нужно выяснить, как перевести нажатия на «прямоугольники», представляющие кнопки в события, и, возможно, даже анимировать кнопки.
и пользователи могут расширить этот графический интерфейс с помощью собственного обработчика событий, ответив на события.
казалось, что это довольно близко к тому, чтобы сделать это возможным :)
Но дело в STM32F103C {8, B} все еще имеет только 20K SRAM, он чувствует себя слишком амбициозным, чтобы создать отзывчивый графический интерфейс вокруг BP/MM
:ржу не могу:

Mrburnette
Сб 10 ноября 2018 г., 17:13
[AG123 - Сб 10 ноября 2018 г. 11:24] - ...
Но дело в STM32F103C {8, B} по -прежнему имеет только 20K SRAM, он чувствует себя слишком амбициозным, чтобы построить отзывчивый GUI вокруг BP/MM
:ржу не могу:
Вы всегда можете хранить объекты в Flash и обмен на SRAM, который содержит видео буфер. Движения памяти эффективны, а размещение объекта - это всего лишь вопрос смещений... Вот как отображается текст GUI: Just Bitmaps.

Но это не главное: даже при 72 МГц у вас есть только один (1) блок обработки, и нет ОС для создания псевдо-трудных. Конечная полоса пропускания обработки UC быстро уступит архитектуре программного обеспечения более высокого уровня. Поскольку не существует выделенного графического процессора с видео оперативной памяти, современные методы графического интерфейса не применимы. Но, библиотеки Arduino Dis Dibraries от Adafruit Arduino Display Dibraries выполняют сенсорные панели, поэтому возможны элементарные объекты и очередь событий.

Творчество программного обеспечения иногда может сделать замечательный квантовый скачок. Кто бы мог подумать, что веб-браузер может быть написан и размещен Arduino Uno?
https: // chackaday.IO/Project/3116-PIP-AR ... EB-Browser

Луча

Рик Кимбалл
Сб 10 ноября 2018 г., 17:37
[Mrburnette - Сб 10 ноября 2018 г., 17:13] - Но это не главное: даже при 72 МГц у вас есть только один (1) блок обработки, и нет ОС для создания псевдо-трудных. ...
Это был тот момент, когда я пытался сделать с моим ранним постом, говоря о воссоздании состояния искусства в начале 1980 -х годов.

Ранние окна были построены так. У большинства компьютерных машин только был только один процессор, а Windows использовала очередь событий, чтобы сделать все. Это была в основном кооперативные многозадачные. Одна ошибочная программа может заблокировать машину, если она затянут процессор.

Palm OS, Digtial Research Gem и все эти оконные системы на 6502 и Classic Mac OS. Все они использовали очередь событий, питаемые внешними событиями в кооперативном многозадачном непреспективном мире прерываний.

Это, безусловно, возможно, но почему ? Лучшее использование маленького MCU на 72 МГц-это сделать материал в режиме реального времени. Если этот проект не является одним из них, я делаю это, потому что я могу, вы можете оставить системы оконных систем на что -то вроде Raspberry Pi или его клонов. Настоящая сила приходит, когда вы увеличиваете эти системы Linux с помощью чертежа, чтобы сделать материал в реальном времени, чтобы подобрать, где борется RPI.

Mrburnette
Сб 10 ноября 2018 г. 18:45
[Рик Кимбалл - Сб 10 ноября 2018 г., 17:37] - ...
Настоящая сила приходит, когда вы увеличиваете эти системы Linux с помощью чертежа, чтобы сделать материал в реальном времени, чтобы подобрать, где борется RPI.
И в качестве примера я недавно опубликовал интернет -радио RPI 3B, используя доску Google AIY. Maple Mini "Talks" в серийную консоль более 115 КБ последовательно и дает инструкции MPC: фронт для MPD. MPC затем повторяет метаданные по серийной ссылке на Maple Mini, который затем анализирует ее и отображает песню и артист на Nokia Mono LCD (потому что у меня слишком много из этих проклятых вещей, которые лежат вокруг.)

https: // www.хакерс.io/rayburne/Joysti ... Y-PI-RADIO

Обратите внимание на петлю "события":
void loop(void) { IsMute(); AdjustVolume(); ChangeChannel(); SerialInput(); ForceUpdate(); }

AG123
Солнце 11 ноября 2018 г. 8:24
На более простых примечаниях, цикл событий по -прежнему полезен для различных вещей, включая общение «междача».
Например, задача отправителя ключей фактически использует событие для передачи клавишных на даночикам других обработчиков событий
https: // github.com/ag88/stm32duino-evon ... скандал.CPP#L49 event.handle_id = EHandleID::BroadCast; event.event = EventID::KeyEvent; event.param1 = c; EventLoop.post(event);

Mrburnette
Солнце 11 ноября 2018 г. 13:37
[AG123 - Солнце 11 ноября 2018 г. 8:24] - ...
IMHO Цикл событий полезен, если вы в основном ждете вещи
:ржу не могу:
+1
Вы прибили его к последнему заявлению, и я согласен с резюме. В мире ESP Delay () выпускает псевдо-трюк Arduino и возвращает контроль в основной (RF) потоке... Это реализуется в Loop () автоматически, так что в конце каждого элемента управления LOOP () передается. Конечно, в ESP8266 эти псевдо-потоки создаются экземпляры с помощью переключателя не OS Propritary Task Switcher. В мире ESP32 Freertos управляет общими задачами, так как ESP32 является двухъядерной архитектурой.

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

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

Луча

Беннебой
Вт 18 декабря 2018 г. 12:04
[Mrburnette - Пт, 09 ноября 2018 г., 16:51] - С комплексом Reather, системой мониторинга Dual-Oled дисплея для ротаса с температурой головки цилиндров (2), температурой выхлопного газа (2), температурой охлаждающей жидкости, вольт, усилителей и т. Д. Время петли по -прежнему составляет 1000 мс с использованием AVR Mega 16 МГц.
OT: Это ваш проект, который вы имеете в виду Рэй? Хотел бы увидеть код (читайте это как идеи кражи), как это звучит очень похоже на то, что я делаю.

Mrburnette
Вт 18 декабря 2018 г. 16:51
[Беннебой - Вт 18 декабря 2018 г. 12:04 -
[Mrburnette - Пт, 09 ноября 2018 г., 16:51] - С комплексом Reather, системой мониторинга Dual-Oled дисплея для ротаса с температурой головки цилиндров (2), температурой выхлопного газа (2), температурой охлаждающей жидкости, вольт, усилителей и т. Д. Время петли по -прежнему составляет 1000 мс с использованием AVR Mega 16 МГц.
OT: Это ваш проект, который вы имеете в виду Рэй? Хотел бы увидеть код (читайте это как идеи кражи), как это звучит очень похоже на то, что я делаю.
Europa_multitab.png
Europa_multitab.PNG (14.02 киб) просмотрено 223 раза

Беннебой
Вт 18 декабря 2018 г., 17:26
Спасибо, любезно.

Беннебой
Вторник 18 декабря 2018 г., 23:26
Кстати, проверьте это -> http: // chocoos.орг/

Mrburnette
Ср 19 декабря 2018 г. 1:36 утра
[Беннебой - Вторник 18 декабря 2018 г., 23:26] - Кстати, проверьте это -> http: // chocoos.орг/
Напоминает мне о Java или старом предварительно скомпилированном базовом наложении Microsoft. Или, может быть, даже Picaxe Basic. Ммммм,
Может быть Битлаш

Я не против техники, но не настоящий фанат, либо.

Луча

Беннебой
Ср 19 декабря 2018 г., 7:57 утра
[Mrburnette - Ср 19 декабря 2018 г. 1:36] -
Я не против техники, но не настоящий фанат, либо.
Да, это кажется упражнением в «потому что мы можем» для таких небольших систем. Все еще интересно, и я думаю, в подобном контексте этой темы (извините AG123!).

AG123
Ср 19 декабря 2018 г., 11:25
Интересный проект от Рэя, я также посмотрел на Шокота, IMHO STM32DUINO (S) в значительной степени является собственной «ОС», и несколько модульных вы можете подключить кусочки, которые вам нужны E.глин. RTOS, этот цикл событий или просто используйте Arduino Loop () : D