Еще одно хобби - разработка проекта операционной системы реального времени для микроконтроллеров Atmel серии ATmega с лицензией GPL-3.0 и выше(опенсурс).
Сам проект выложен на гитхабе https://github.com/w5277c/core5277
Главное отличие моего проекта от других - это полная реализация проекта на ассемблере.
Здесь я придерживался похожей позиции как и в моем проекте автоматизации.
Ранее я разрабатывал прошивки своих конечных устройств на ассемблере, это дает некоторые преимущества. Основное из которых - это заметно сниженное потребление ресурсов, т.е. можно экономить на типе МК. Но в последние годы это уже не так актуально, с учетом доступности и не не высокой цены на STM8 и STM32. Хотя теперь, похоже, все изменится, и вероятно AVR микроконтроллеры(к примеру их Российские аналоги) могут стать популярными.
В общем я, ради удовольствия созидания, решил постепенно нарабатывать свои библиотеки. При этом все чаще приходилось пользоваться конечными автоматами. Ну и как итог, у меня есть Realtime OS реализованная на чистом ассемблере(AVRA).
И где-то последний год, все свои прошивки я реализую на ней. Даже для таких микроконтроллеров как ATtiny13a(конечно там не используется ядро ОС, но используются определения и некоторые процедуры).
ОС еще сырая, хотя все зависит от того, какие задачи необходимо решать.
На данный момент операционка поддерживает следующие микроконтроллеры: ATtiny45/85, ATmega8/88/16/168/328, AT90CAN32.
Благодаря унифицированной прослойки в виде процедур ядра и драйверов достигается независимость кода от конкретного железа и заметно уменьшает объем кода верхнего уровня. Я переносил свои проекты в 7-12КБ FLASH между чипами ATmega8,88,16,328 буквально изменяя только несколько строк кода.
Весь проект построен на подгрузке только задействованных библиотек, что сильно влияет на размер итоговой прошивки.
Режимы ОС:
- TS_MODE_NO - простое переключение, механизмы ядра для переключения задач отсутствуют
- TS_MODE_EVENT - кооперативная
- TS_MODE_TIME - вытесняющая многозадачность
*режим ОС также влияет на размер прошивки.
На текущий момент в ядре есть следующий функционал:
- Процедуры работы с динамической памятью
- Процедуры работы с задачами и драйверами
- Процедуры работы с программными и аппаратными таймерами
- Процедуры программного переопределения векторов прерываний
- Процедуры выдержки пауз различного диапазона
- Процедуры работы с диспетчером задач
- Процедуры работы с глобальными флагами(в том числе механизм блокировки)
- Процедуры работы с ресурсами(механизм блокировки)
- Процедуры логирования и механизмы ввода/вывода в консоль c буферизацией
- Пара процедур консольного UI
Драйвера с различной степенью реализации(некоторые требуют актуализации, некоторые имеют только часть функционала):
- Интерфейсы как аппаратные, так и программные: 1w, I2C, SPI, UART
- Устройства отображения: 7 сег. индикатор, HD44780(WH1602), MAX7219
- Датчики: AM2301, DS18B20, DHT11, DS1990a, MH-Z19B, MLX90614
- Связь: ESP8266, HC05
- SD карта
- АЦП, ШИМ, кнопки, счетчик, программные прерывания, бипер, дополнительное логирование.
Кроме этого есть часть процедур не имеющих отношения к ядру
- Конвертирование
- Дата/время
- Управление портами
- Математика
- Память
- Концепция работы с примитивами
- Строки
- Системные
В проекте есть примеры, которые позволят достаточно легко понять как оно все работает. И это тажке хороший инструмент для тестирования.
У меня есть множество идей как дальше развивать ОС. Есть идея реализовать свой эмулятор. Это позволит выполнять в фоне пользовательские программы без загрузки их во FLASH. При этом скорость выполнения сильно не пострадает, так как все основные процедуры будут вызываться из FLASH. Ну и для этого потребуется поддержка файловой системы. Также хочется сделать универсальную прослойку для работы с символьным и графическим выводом. А еще ввести поддержку драйверов способных отображать VGA картинку и проигрывать MP3 и lossless.
По поводу таймингов при переключении задачи:
Использовал ATmega328p на 16MHz, созданы 2 задачи с бесконечным циклом(т.е. в стеке только регистры).
При вытесняющей и кооперативной многозадачности расходуется 80 микросекунд(т.е. 0.000080c).
Разница есть, в тактах, но при 10-20 задач может быть в 3-5 микросекунд в вытесняющем больше.
Замер выполнен между началом работы диспетчера и переходом на код задачи.
*Во время работы диспетчера прерывания разрешены.
Более заметная разница в используемом FLASH'е
Целиком проект: вытесняющий - 2302 байта, кооперативный - 2054 байта.
В общем, это хобби, но есть вероятность, что это хобби кому-то из вас понравится, и может быть это перерастет во что-то большее.