Компактная ОС для ARM процессоров

в 4:58, , рубрики: ARM Assembler, C, embedded, rtos, scada, метки:

“Кажется, что совершенство достигается не тогда, когда нечего более добавить, а тогда, когда нечего больше убрать."

(Антуан де Сент-Экзюпери)

image

По теме изучения программирования встроенных систем, ОС реального времени, Ассемблера и С позвольте представить очень простую операционную систему 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!» (с бегущей строкой к тому же):

char	txt [ ]={"Hello"};	

void Main(void)
{	int	i;
	for	( i = 134; i > 8; --i )
	{
			//	X	 Y		 String
		Print_String (	i,	150, "Hello, World!");
		Print_String (	i,	170, txt);
	
		Delay	(20);		// Delay 20 mS	
	}
	Exit	();				// Exit to OS
}

Это же на Ассемблере:


; Нужен только один файл, Hello.s.  Двоичный код занимает ровно 100 Байт (!)

; номера системных вызовов взяты из файла StartOS.c
_Exit       EQU	  7		; SysTrap _Exit 
_Delay    EQU	 10		; SysTrap _Delay
_Print_String EQU	122	; SysTrap _Print_String

 	PRESERVE8	  ; выравнивание до 8 Байтов

	AREA    INIT, CODE, READONLY	 ; инициал. секция, содержит код
	ENTRY						 ; точка входа программы

;______ нужно для работы ОС __________
	LDR	r0, =0x33ffff08		; просьба не редактировать
	LDR	r1, [r0,#0xE8]		;
	STR	r1, [r0]			;
; если Вам нужны прерывания, включите след. 4 строки
;	MRS	r0,cpsr
;	BIC	r0,r0,#0xDF
;	ORR	r1,r0,#0x13
;	MSR	cpsr_cxsf,r1
 
;___ Программа пользователя начинается здесь
;	напечатаем строки текста... 
; только-то и нужно поместить параметры в регистры и вызвать системные вызовы

;----	первый способ
	LDR      r2, text1	; загружаем адрес текста 1 в регистр r2
	MOV      r1,#30	; помещаем Y строки на экране в r1
	MOV      r0,#25	; помщаем X на экране в r0
	SWI		_Print_String ; вызываем систему (Print_String(25,30,text1))

;----	Другой способ  ----
	ADR      r2, text2	; помещаем адрес строки text 2 в r2
	MOV      r1,#70	; Y в r1
	MOV      r0,#25	; X вr0
	SWI	_Print_String ; прерывание (Print_String(25,70,"Hello, ARM Assembler!"))
 		
	LDR      r0, millis	; загружаем  адрес ячейки с числом 5000 в r0
					; в случае малых задержек (скажем, 500ms) можно так: MOV r0,#500
	SWI	_Delay	; вызов (Delay 5s)
	
	SWI	_Exit		;   вызов выхода из программы в ОС, параметры не нужны

text1	DCD	txt		; содержит адрес "Hello"

text2	DCB	 "Hello, ARM Assembler!",0	; байты с нулем на конце
	DCB	 0,0		; простое выравнивание до 32-бит адреса (*4 байта)

millis	DCD 5000 ; равно  5000 мС или 5 секунд
	DCB	 0,0	  ; выравнивание

txt	DCB	 "Hello",0	; содержит буквы H, e, l, l, o и 0

	END		; и это - всё!

Предыстория создания системы такова. Автор отдает себе отчет, что написание «домашних» операционных систем — дело очень ответственное, рискованное (и не сулит создателям ничего, кроме критики). Но, как говорится, жизнь заставила. Так как же это получилось?

Дело было так: была найдена плата для разработчиков 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 и успешно.

С уважением к сообществу,
Анатолий Бесплеменнов, инженер

P.S.: Прошу относиться к системам реального времени серьезно, например, если система, управляющая поездом «зависнет», сработает сторожевой таймер, она перезапустится и будет опять работать через 1 секунду. Не даром марсоход Curiosity бороздит просторы Марса под управлением RT системы uCOS фирмы Micrium.

Автор: longtolik

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js