Асинхронные библиотеки Arduino
- Войдите на сайт для отправки комментариев
Пт, 22/07/2016 - 06:17
Подскажите, а какие есть нормальные библиотеки для Arduino для запуска множества асинхронных заданий БЕЗ использования аппаратных таймеров?
То есть чтобы например мигать несколькими светодиодами с разной частотой, при этом вращать несколько сервоприводов с разной скоростью и т.д.?
Я нашел например вот такое: http://robotic-controls.com/learn/arduino/kernel-event-driven-delays-and-intervals
По идее это как раз то, что нужно. Фактически это аналог функций из Javascript: setInterval, setTimeout, clearInterval
Но проблема в том, что она работает неправильно: функции setInterval и setTimeout работают как предполагается, но clearInterval, который должен останавливать работу только конкретного интервала почему-то останавливает все интервалы. Может я как-то не так пользуюсь им?
#include "kernel.h" Kernel kernel; int thcounter = 0; int p1; int p2; void setup() { Serial.begin(9600); p1 = kernel.setInterval(1000000UL, test); p2 = kernel.setInterval(2000000UL, test2); } void loop() { kernel.runNext(); } void test() { Serial.println(1000); thcounter++; if(thcounter>10) { kernel.clearInterval(p2); //вот эта строчка по идее должна останавливать только выполнение функции test2 но останавливает выполнение и test тоже } } void test2() { Serial.println(2000); }
Также я нашел целый список подобных библиотек
Но по описанию именно не работающий Kernel именно то, что я ищу:)
Кто-то чем-то из них пользовался? Что из них позволит реализовать то же самое?
Выяснилось, что плата вообще зависает, если повторно вызывать clearInterval для несуществующего объекта
поэтому надо проверять не был ли он очищен и если да - повторно не вызвать, тогда всё работает
Цитата: мигать несколькими светодиодами с разной частотой, при этом вращать несколько сервоприводов с разной скоростью и т.д.
Решается 2 путями: 1)На каждый сервопривод вешается свой контроллер, который уже связан с ЦП.
2) Создается своя ОС, с драйверами на каждый подключающий модуль и система поддерживающая события и обработчика событий.
Разумеется, я такое на ардуине не встречал, да и не потяну. Что-то похожее я питаюсь придумать. Фича-"горизонтальное программирование". Но там надо мощная теоретическая база и куча практических примеров. Так что скорее всего так и останется не до конца реализованой.
Почему всё виснет.
В библиотеке бага: файл QueueList.h, строка 290:
А на самом деле возврат из функции T QueueList<T>::pop () не происходит, и чуть ниже:
А у нас - isEmpty вернуло true, т.е. очередь пустая. Со всеми вытекающими, т.к. head == NULL. Пруф:
Реализация exit ничего никуда не бросает:
Очередная корявая "библиотека" для ардуины с претензией на "умение" применять шаблоны. Реализация очень похожа на пример из книжки для начинающих в С++, раздел "шаблонные реализации популярных контейнеров".
Действительно - лучше сто раз проверять любой код, прежде чем ставить его в продакшн. И свой, и сторонний.
З.Ы. Чтобы опять не обвинили в несуществующем (мол, опять всё обосрал) - да, сам говнокодю. Но! В "библиотеке" реально баг.
А чё, обвиняли уже? Странно. Библиотека - это программа, а программ без ошибок не бывает - закон Брукса даже наша госдума отменить не в состоянии.
То что С это не один язык , а три вложеные друг в друга, вам скорее понятно. Обычный С меня со своими поинтерами ставит в тупик. С с классами. Если еще приплюсовать шаблоны. Про визуал говорить не буду. В Ардуине их пока нет. Но скоро будет и такое, когда мышь к Ардуине прикрутят .
Это все к тому, что я пытаюсь оптимизировать алгоритм, а потом уже писать программу. Поэтому мой подход режет глаза обычных Сишников.
А теперь по теме: Или писать надо свою Ось под даную задачу. Я это не умею. Или искать новую среду разработки по Ардуино. Но нет гарантии, что она или демо, или кривая, или наполовину написаная.
Еще добавлю "Вертикальное "программирование это программирование по задаче, которую можно изобразить блок-схемой, причем одной. А вот "горизонтальное"(как я называю) это схемой (событие-обработка - событие). Вот вам надо как раз какая среда, библиотека, язык . Ну где-то так.
Цитата: мигать несколькими светодиодами с разной частотой, при этом вращать несколько сервоприводов с разной скоростью и т.д.
Решается 2 путями: 1)На каждый сервопривод вешается свой контроллер, который уже связан с ЦП.
Из пушки по воробьям.
2) Создается своя ОС, с драйверами на каждый подключающий модуль и система поддерживающая события и обработчика событий.
Из пушки по воробьям.
Разумеется, я такое на ардуине не встречал, да и не потяну. Что-то похожее я питаюсь придумать. Фича-"горизонтальное программирование". Но там надо мощная теоретическая база и куча практических примеров. Так что скорее всего так и останется не до конца реализованой.
Вся "мощная" теоретическая база изложена здесь: http://arduino.ru/tutorials/BlinkWithoutDelay
Больше ничего не надо. Можно, конечно, обернуть все это в классы. И даже, если планируется управлять более чем 2-3 устройствами, причем разнородными, это имеет смысл сделать.
Для каждого устройства пишется функция инициализации, вызываемая из begin(), и функция циклического опроса, получающая с датчика информацию и реагирующую на изменения, вызываемая из loop(). В принципе можно вместо одной последней функции написать две: отдельно опрос и отдельно реакция. Естественно, при этом недопустимо использование блокирующих функция типа delay. Применение функций типа puleIn() или Serial.parseInt() желательно ограничить, а если применять, - только с совсем небольшим таймаутом.
andriano Вот вы поняли мою мысль. А теперь изложите свою в коде. Там еще надо блинкер на светодиоде 13 сделать. Что бы внешне определять, что не подвисла программа. А еще реализовать механизм стабилизирующий длительность цикла.
Посмотрите в сторону этих библ. http://robotsbigdata.com/index.html