Компактная ОС для ARM процессоров
По теме изучения программирования встроенных систем, ОС реального времени, Ассемблера и С позвольте представить очень простую операционную систему StartOS.
— если вам необходимо создать устройство, начинающее работать через 1-2 секунды после включения питания и способное реагировать на сигналы из внешнего мира в течение микросекунд; — для быстрого создания систем управления объектами с выводом данных в Интернет; — отработка идей, алгоритмов, изготовлении прототипов устройств; — приобретение опыта программирования встроенных систем на языках C и Assembler; — получение полного доступа к «железу» компьютерного устройства, например, для разработки самомодифицирующихся программ.
Некоторые свойства системы:
Время готовности после включения питания: < 1 сек Объем двоичного кода программы: < 40 kB Система занимает небольшой объем в верхних адресах ОЗУ, предоставляя пользователю стандартную загрузку программ в нижние адреса ОЗУ. Автостарт программы пользователя присутствует, если система обнаруживает на карте памяти файл START.BIN, то он запускается автоматически.
Основные функции системы:
Инициализация SoC (System on Chip, системы на чипе) и других внешних устройств. Загрузка программ пользователя в память и предоставление им интерфейса к системным функциям:
— работа с LCD в текстовом и графическом режимах (вывод текста, пикселей, линий, BMP картинок, сохранение / восстановление области экрана…); — ввод координат X,Y пера с сенсорного экрана; — работа с часами реального времени (RTC); — чтение данных из аналого-цифровых преобразователей (ADC); — чтение данных из цифровых портов; — чтение / запись символов и строк в COM порт; — вывод на широтно-импульсные модуляторы (ШИМ, PWM) и пьезодинамик; — ввод-вывод пакетов сети Ethernet с использованием встроенного контроллера; — чтение и запись файлов; — сервер-клиент для Интернета; — работа с видеокамерой.
Система реализована на платах разработчиков фирмы Samsung или FriendlyARM с процессорами Samsung. На эти процессоры и платы имеется полная документация.
Итак, немного понагляднее. Лучше один раз увидеть, поэтому ссылка на видео:
Система немного посложнее, для ARM Cortex-A8:
И, конечно, код «Hello, World!» (с бегущей строкой к тому же):
Это же на Ассемблере:
Предыстория создания системы такова. Автор отдает себе отчет, что написание «домашних» операционных систем — дело очень ответственное, рискованное (и не сулит создателям ничего, кроме критики). Но, как говорится, жизнь заставила. Так как же это получилось?
Дело было так: была найдена плата для разработчиков FriendlyARM Mini2440, очень дешевая и с большим выбором периферии. После применения контроллеров Atmel AVR в аппликаторе самоклеящихся этикеток, хотелось продолжить развитие последнего.
На тот момент (2010 год) плата Mini2440 стоила $80, примерно 2400 рублей, что было сравнимо со стоимостью датчиков в аппликаторе. Mini2440 была продемонстрирована руководителю одной фирмы, который одобрил ее применение и заверил, что «в случае успеха в ее программировании, мы будем делать заказы». Успех в программировании подразумевал использование устройства в реальном времени, когда сигналы от датчиков обрабатываются за микросекунды, и не заставил себя долго ждать. Через 2 месяца программа, зашитая в NAND память успешно управляла шаговым двигателем и загружалась за 1 секунду после включения питания. Но тут, как это бывает, уже руководитель впал в ступор и просто замолчал. Пока он молчал, время шло, и автор решил использовать момент для некоторого развития.
Чтобы каждый раз не вставлять в проект код инициализации, было решено сделать это раз и навсегда, а прикладные программы загружать в память с SD карты непосредственно в память и оттуда запускать.
Существует подход, например, в ARM7 контроллерах STM32, когда программа пользователя компилируется вместе с фирменной библиотекой для работы с внешними устройствами. При этом, фирма не разглашает свой проприетарный исходный код, программа пользователя вызывает фирменные подпрограммы по адресам в памяти.
В то же время, автор знал «внутренности» операционных систем, таких как RT-11 фирмы DEC, у нас применялись на «Электронике-60», ДВК-2. 4 и других. Еще были хорошо изучены BIOS IBM PC AT, MS DOS, Palm OS. Во всех этих системах применялся классический подход — применение программных прерываний. То есть, ОС расположена в верхних адресах памяти, а программа пользователя — с начала памяти и вызывала подпрограммы операционной системы, передавая номер программного прерывания в команде, собственно приводящей к прерыванию.
Таким образом, в разработанной системе применен механизм программных прерываний через команду SWI (SVC). Код системы находится в вехних адресах, а программы пользователя загружаются непосредственно в начало памяти и запускаются. Не будем сравнивать с существующими системами, достаточно сказать что система получилась с минимальным объемом, максимально возможным быстродействием и «жестким» реальным временем. Мы всегда очень точно можем знать, в какой момент времени какая команда выполняется и что происходит.
Название системы было задумано как система начального уровня, стартовая. После поиска в Google выбор пал на StartOS и это имя было зарегистрировано (печально, что некоторое время спустя некий клон Linux на некоторой части планеты был тоже переименован в StartOS).
По просьбам пользователей, в систему был добавлен TCP IP Stack и сделаны Сервер и Клиент. И еще добавлена программа для работы с видеокамерой. Кстати, после подачи питания на плату, секунды через две на экране уже появляется картинка с камеры.
Примеры программ представлены для работы почти со всеми внешними устройствами, смонтированными на плате. Создавать программы можно в средах ADS1.2 (Metrowerks CodeWarrior), IAR, Keil и других.
Документацию, примеры и прочее можно посмотреть здесь и здесь.
Так как плата разработчика FriendlyARM Mini2440 уже устарела (хотя и годится для многих проектов), автор портировал систему на более современную плату Mini210s. Кстати сказать, многие пользователи применяли StartOS на платах фирмы Samsung и успешно.