Femto OS весьма нетребовательная к ресурсам операционная система реального времени (ОСРВ, RTOS), которая предоставляет планировщик задач с вытеснением по приоритетам (preemptive) для микроконтроллеров, у которых ограниченный объем оперативной памяти (RAM) и памяти программ (FLASH). Например, Femto OS может работать на 128 .. 1024 байтах RAM и 2 .. 16 килобайтах FLASH. Основная целевая архитектура - Atmel AVR (в настоящее время уже Microchip), такие как ATtiny или младшие ATmega. Также возможна работа и на более продвинутых MCU (см. врезку далее). Система написана на C, для портирования применяется отдельный файл на языке ассемблера. В настоящий момент портирование реализовано для 44 типов микроконтроллеров AVR.
Типовой расход памяти программ может быть от 1 до 4 килобайт FLASH, в зависимости от необходимых функций RTOS, для типовых приложений часто бывает достаточно 2 килобайта. Система берет для себя от 10 до 20 байт RAM, задачи могут потреблять меньше 6 байт RAM, однако для реалистичных задач требуется примерно от 20 до 40 байт RAM под стек и локальные переменные задачи. К примеру, можно легко запустить 4 или большее количество задач на ATtiny261, без отдельной задачи ожидания (idle task). Большинство API-функций запускаются в пространстве OS. При необходимости в течение большого интервала процессорного времени работа OS может быть прервана. Есть инструменты для отслеживания использования стека задачами и его защиты от переполнения.
Код Femto OS отлично документирован и поставляется с примерами приложений (которые документированы по минимуму, но их код говорит сам за себя). Demo-приложения работают на всех MCU, для которых существует порт. Большинство демок работают из коробки на платах STK500/STK501/STK503, некоторые требуют дополнительного (очень простого) оборудования. Femto OS распространяется под лицензией GPLv3, однако существует коммерческая лицензия и техническая поддержка.
Кратко о возможностях Femto OS:
Максимальное количество задач: 16 Максимальное количество приоритетов: 8 Максимальное количество блокировок: 15 Минимальный размер TCB(1) в стеке: 2 байта Минимальный размер стека задачи: 4 байта Минимальный размер стека OS: 9 байт Минимальное дополнительное использование RAM: 3 байта Самое маленькое приложение: 258 байт
Примечание (1): аббревиатура TCB означает Task Control Block. Это память, необходимая для управления состоянием задачи.
Femto OS специально создавалась под маломощные встраиваемые системы. Например, самое маленькое приложение для неё называется "Bare", оно скомпилировано для ATmega8. В нем запущен только 16-разрядный счетчик для светодиода на функции перехвата задачи ожидания (idle task hook), расходуется 258 байт FLASH и 10 байт RAM. Femto OS разрабатывалась для компиляции под управлением gcc, и генерируемый исполняемый код зависит от обработки препроцессора компилятора. По этой причине Femto OS привязана к вышеописанным ограничениям. Если требуется запустить больше 16 задач, или нужно больше примитивов синхронизации между задачами, то Вам нужно использовать другую OS, такую как FreeRTOS [2].
Планы на будущее. В настоящий момент функционал OS довольно полный, хотя всегда стоит стремиться к лучшему. Однако автор не намерен добавлять какой-либо код, который привел бы к увеличению размера ядра OS. Может быть принято во внимание добавление опционального функционала (т. е. который можно при необходимости можно исключить параметрами конфигурации). Пока что в планах создать простой менеджер кучи.
Самое важное в разработке - добиться максимальной стабильности в работе OS. У автора есть реализация версии 0.82 на ATtiny861, которая непрерывно, без сбоев работает с апреля 2008 года! Затем вероятно работа будет продолжена с IPv2, чтобы соединить друг с другом несколько AVR, и это может быть стек IP (Femto IP).
Демо-приложения Femto OS. Ниже в таблице приведен расход FLASH и RAM (в байтах) для нескольких демонстрационных приложений (включая расходы на OS), работающих на ATtiny861. Более подробную информацию по примерам см. на страничке "examples" сайта [1].
Приложение
FLASH
RAM
задач
Краткое описание
Bare
270
10
0
Счетчики со светодиодами в задаче ожидания idle task.
Minimal
590
29
2
Копирование состояния переключателей в светодиоды.
FlashLeds
1004
47
8
Независимое мигание восемью светодиодами.
Watchdog
1762
184
10
Сторожевой таймер перехватывает сбой в задаче.
Rendezvous
1366
210
9
Примеры синхронизации (обмена данными) между задачами.
Queues
1866
116
3
Перекачка данных через очередь.
Sleep
1242
76
3
Вход в режим пониженного потребления энергии (sleep) между миганиями светодиодом.
Hooks
794
35
1
Как использовать перехват системных событий (system hooks).
Interrupt
2466
264
4
Демонстрация различных режимов прерываний.
Shell
6874
373
10
8 светодиодами можно управлять из командной оболочки (консоль).
Passon
1914
293
10
Тест использования одновременных мьютексов.
Remember
2632
368
5
Стресс-тест файловой системы.
HelloWorld
960
48
2
Отображение Hello World в ASCII.
Имейте в виду, что для разных портов показанные выше расходы памяти могут незначительно отличаться. Обычно чем меньше MCU, тем получается меньше расход памяти. Кроме приложений Bare, Minimal и FlashLeds, показанные выше примеры не разрабатывались максимально нетребовательными к ресурсам. Обратите внимание, что приложение FlashLeds использует RAM по минимуму. TCB на 2 байта больше минимума из-за информации о задержке. Это приложение использует общий стек для всех задач, с минимальным размером 4 байт, т. е. 4 уходит на каждую задачу, 8 + 3 = 11 байт для OS, 4 байта для одного общего стека, итого получается 4x8 +11 + 4 = 47 байт.
Мотивация в разработке Femto OS. Работа над проектом Femto OS (который был изначально проектом "свободного времени") началась с августа 2007. Система целиком была написана с нуля. Источником вдохновения была FreeRTOS (это отличная система, но она слишком велика для MCU наподобие ATtiny), однако от неё Femto OS полностью отличается. Имя Femto OS означает, что OS действительно очень маленькая, значительно меньше чем pico]OS [5].