Найти в Дзене
5277

Операционная система для микроконтроллеров ATmega

Еще одно хобби - разработка проекта операционной системы реального времени для микроконтроллеров 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 байта.

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