Организация программ. Конечные автоматы. Программные таймеры.

Сначала я хотел написать статью об очередной реализации программных таймеров. Попутно хотел поднять одну тему и понял, что программные таймеры — составная часть это темы. Тема касается организации программ, взаимодействия программных модулей и затрагивает автоматное программирование, то есть конечные автоматы.

В большинстве случаев изучение, освоение микроконтроллеров и программирования идет примерно по одному и тому же сценарию: поэтапное изучение архитектуры, периферии МК, создание пробных проектов, которые, как правило, малозадачны и выполняют строго определенные функции. Постепенно возрастают требования к проектируемым устройствам, соответственно, программы становятся сложнее. На этом этапе программист сталкивается с несколькими важными проблемами. Нет устоявшегося стиля программирования, нет никакого представления об организации программ и взаимодействия программных модулей. Итог:
а) Трудночитаемый код, который трудно поддерживать и вносить какие-либо изменения.
б) Так как аппаратных таймеров мало, обычно это один, два таймера, это сбивает начинающих с толку, в случае, если требуется отслеживать несколько временных параметров.
в) Нет представления, как добиться параллельной работы программных модулей.

В последнее время я крайне занят, поэтому буду добавлять материал по мере возможности.

Этот вариант реализации программных таймеров я использую в своих проектах уже несколько лет. До этого я перебрал кучу вариантов. Все они чем-нибудь да не устраивали. В конце концов я составил подробное ТЗ. Требования были следующие:

Системный тик 1 мс. 10 мс.
Однократный запуск.
Периодический запуск.
Отложенное исполнение.
Немедленное исполнение.

В итоге получилось следующее:


Читать дальше

"Идеальный" триггер

Хочу поделиться с решением, которое я назвал «идеальный триггер». Всем известен RS-триггер. И его запрещенное состояние, когда на оба входа одновременно подается активный уровень. На выходе в этом случае также будут активные уровни. Если со входов также одновременно снять активный уровень, то на выходах будет неопределенный результат. Это запрещенное состояние инженеры того времени так и не смогли решить. И обошли эту проблему созданием новых видов триггеров. D-триггер и JK-триггер.


Читать дальше

Очередной диспетчер. AVR. Си

Edit. Ну прямо азарт у меня появился. Очередная версия диспетчера. Возможности:
однократное выполнение,
отложенное однократное выполнение.

многократное выполнение без задержек и периодичности,
отложенное многократное выполнение, без задержек и периодичности.
отложенное многократное выполнение, с периодичностью.

Сразу же попробовал перенести на диспетчер свой один проект для проверки.

Примечание, у меня диспетчер работает только в основном цикле. Установка, удаление задач тоже в основном цикле. Обработчики прерываний должны быть максимально быстрыми. Нужно добавить\удалить задачу, ставьте флаги, в основном цикле по флагам делайте, что нужно.


Читать дальше

Преобразование беззнакового целого числа в строку и обратно. Первый опыт.

На си начал писать недавно. Со стандартными библиотеками еще не сталкивался. Вдобавок постоянно видел в сети нарекания на эти библиотеки в плане ресурсоемкости. Так что решил отложить стандартные библиотеки до лучших времен.
Сейчас выполняю один проект. И столкнулся с преобразованием чисел в строку и обратно. Сначала я наткнулся на один сайт, взял оттуда пример. Этот пример мне не совсем понравился, но работает. Потом зашел на один ирк-канал. Тамошние участники меня убеждали использовать стандартные либы и ссылку подкинули. И как я на нее не наткнулся? Мне подошел способ со степенями 10. Тем более, что сам это делал на асме. Код поправил под себя. Выкладываю:

Читать дальше