Как стать автором
Обновить

Комментарии 40

Забавно монитор ориентирован в первом видио.
Ну это не забавы ради, а листингов длинных для. А так же для манов и даташитов. У меня второй монитор на машине точно так же установлен. Очень удобно скажу я Вам.
Кстати да, когда мне приходилось писать на ассемблере, то его код по ширине был не велик, а вот высоты экрана реально не хватало (приходилось изменять текстовый режим). Какое отношение сторон у вашего монитора на видео? Вообще, этот момент по созданию удобной рабочей интересен, если будет время, напишите чуть подробней.
Ээээ… не я автор топика, но если интересно, то у меня 2 монитора: основной — 23" 16х10, вспомогательный (вертикально установленный) 19" 16х9.
Субъективно на видео мне показалось, что соотношение сторон больше, чем 2х1
16:9
а вот строк помещается около 130 при высоте шрифта 8 пунктов (в зависимости от среды программирования)
Скажите, заведется ли StartOS на Atmel'овских чипах (ARM Cortex-M7)?
Возможно, но надо будет ее портировать. Скорее всего, в Atmel другая организация памяти, регистров внешних устройств и пр. Даже в Samsung у разных процессоров всё по-разному. В общем, если есть документация и исходный код на процессор, например, в Keil, для инициализации SoC, еще известно, как организована память на плате, ее параметры, то можно. Но пока всё есть для ARM9 и ARM Cortex-A8. Это непростая работа…
Понятно, все равно, большое спасибо за труд :)
Это Вам спасибо за внимание.
очень интересно, плюсую, пошел смотреть исходники
(написал чтобы потом иметь возможность комментировать)
Исходники есть на все примеры, работу с прерываниями, с видеокамерой, но не на саму систему (пока, во всяком случае). Для плат Mini2440 есть DVD с WinCE 6, Linux, Qt, uCOS и test2440. Вот последние два позволяют понять, как сделать программу, не заваисящую от ОС, (Non-OS, bare metal). Позже, исходники для таких программ перестали выкладывать, для Mini210s с процессором S5PV210 (ARM Cortex-A8, aka Exynos-3), пришлось все делать самому на основе документации от Samsung исходных кодов драйцверов Linux и еще — кода инициализации от Texas Instruments для Cortex-A8.
В StartOS ноу-хау является драйвер для программных прерываний и всего-то. Почему-то классические программные прерывания не применяются на практике (не видел). А сама технология подробно расписана на сайте холдинга ARM, но, как водится, их примеры не работоспособны. Что бы стать разработчиком, как я понял, надо ехать к ним на платные курсы.
FriendlyARM вообще сделала проприетарные экраны с обменом по одному проводу, пришлось их протокол просто тупо хакнуть.
:-(((

жаль…
интересна сама система!
Почему-то классические программные прерывания не применяются на практике (не видел).

На software interrupts почти во всех ОС для ARM сисколы сделаны. Так что, ноу-хау ваше сомнительно. )
Сами программные прерывания — никакое не ноу-хау, подробно описаны.
Под ноу-хау подразумевалось то, что удалось заставить их работать.
Это было ноу-хау, Карл, ноу-хау.
Когда механизм вызова через EMT применялся в реализации Basic для DEC микрокомпов, это было оправданно, поскольку позволяло сэкономить до 12% (на мой взгляд, цифра несколько завышена), что при объеме ПЗУ в 4КБ было вполне существенным. Но в наше время, на А8, применять подобное и называть это ноу-хау…
У меня просто нет слов.

И Бога ради, не надо выкладывать исходников на саму систему, это могут увидеть дети, мне более чем хватило исходников на примеры. Магические константы в каждой строке (в каждой строке, Карл), стандартные типы не применяются ввиду их фатального недостатка и создаются свои, полнейшее пренебрежение элементарными правилами структурирования кода, goto как замена while (это, наверное, тоже ноу-хау?), и это в примерах применения, мне страшно представить, как будет реализованна работа с регистрами периферии в самой системе.

Резюмируя, категорически не рекомендую использовать данный продукт с его ноу-хау для
изучения программирования встроенных систем, ОС реального времени, Ассемблера и С
— ничему хорошему не научитесь.
Мой знакомый говорит: «умных много, а работать — некому».

Сделайте, пожалуйста, что-то подобное, снабдите правильными примерами, без goto, хорошо структурированными, а мы — поучимся и даже критиковать не будем, только поапплодируем.

Еще так говорят: «отрицая — предлагай!». Подскажите, что применить для вызова системных подпрограмм из программы пользователя, когда разница в адресах больше 26 МБайт (больше в коде команды перехода не помещается, там ведь еще и код команды кроме адреса).

Современный подход мне не нравится, программы надо предустанавливать, вместо того, чтобы загружать в память и выполнять. Windows, Linux, Android занимают с добрую половину памяти, работают медленно, не в реальном времени, а программу пользователя отодвигают на второй план.

Пользователи бывают очень разные, кому-то понятнее goto (while тоже в примерах есть). Тут уж, как говорится, «дурак не заметит, а умный поймет».

Стандартный оператор printf занимает очень много памяти, еще и сбоит в работе, поэтому в платах Samsung для Linux его переписали, заменив своим.

Кстати, насчет «корявости» кода, просмотрев множество текстов для Linux и фирменных Samsung, вот тут уж — слов нету просто. StartOS содержит порядка 6000 строк кода, компилируется в загрузочный файл менее 32 КБайт (вполне себе эффективно), и главное — работает.
Еще посмотрите исходные коды на TCP IP Stack, там то байты, то 16-тиричные константы, то 32-битные слова, вот его покритикуйте…

Насчет «нерекомендования», боюсь, Вы опоздали, люди всё это уже используют (да еще и хвалят). И порекомендуйте своё, что-нибудь хорошее.

Напоследок, я — инженер-электрик по специальности «электропривод и автоматизация промышленных установок», в 1983 году столкнулся с применением микропроцессоров. Кстати, чего плохого в DEC? Реентерабельность, реккурентные вызовы подпрограмм, сопрограммы, трюки на ассбемблере, где они все сейчас, среди перлов и питонов?

Но это не помешало мне стать лауреатом Первого всесоюзного конкурса самодеятельных программистов СССР со своим «Программным синтезатором речи». Это я насчет давления авторитетом.

Хочу — сделаю себе ОС, хочу — свои библиотеки и свой компилятор текста в двоичный код, назову операторы тоже как хочу, кто мне запретит.

Самомодифицирующиеся программы — вот моя цель, и для этого нужен полный контроль над железом, а не работа в песочнице, к чему нас подталкивают.

Извините за длинный ответ Чемберлену, вопрос тоже не был коротким.

А вообще, это здорово, что такая критика и обсуждение, всем — успехов!
а может быть сделаете статью про написание ОС для арм процессоров?

интересует привилегированный и обычный режимы процессора, минимальные функции и т.д.
Наверное, сделаю. Так, чтобы не умничать, а людям польза бы была, не натыкаться на известные грабли. Вообще, затея делать ОС — на грани помешательства.

Вкратце, для S3C2440A (Mini2440) были сложности, программа стартовала в режиме пользователя (User), система вызывалась в режиме SVC (привилегированном), прерывания из программы пользователя не работали, пришлось менять режим в программе обработки. Потом другая проблема, системные вызовы в одном варианте работали, в другом -не работали в пользовательской программе обработки аппаратных прерываний.

Пришлось применить стандартный подход, такой, что подпрограмма обработки прерывания должна быть короткой, она устанавливает флаги, о том, что произошло и выходит. Потом программа пользователя в спокойной обстановке анализирует флаги, приоритет событий и предпринимает нужные действия.

Для S5PV210 (Mini210s) всё проще, система в режиме User, программа позьзователя в режиме User, вызовы системы в режиме SVC. Мощная система векторных прерываний позволяет устанавливать адреса тремя способами.
Другая проблема, что адреса Reset, IRQ (FIQ) возможно менять легко, а вот поменять адрес SWI было непросто весьма и весьма.

Но, практика — критерий истины, работают прерывания и от таймеров, и от портов, и от другого.
Вот пример — вывод звука через таймер и ШИМ. Программа обработки сама все делает, независимо от основной, (вроде, как в учебнике).


Ну по пунктам

Сделайте, пожалуйста, что-то подобное, снабдите правильными примерами, без goto, хорошо структурированными, а мы — поучимся и даже критиковать не будем, только поапплодируем.
uc/OS, FreeRTOS, esOS и т.д — хорошо структурированные, без goto — качайте, смотрите, учитесь (комментированы слабовато, но уж тут что есть, у Вас не лучше).

Подскажите, что применить для вызова системных подпрограмм из программы пользователя, когда разница в адресах больше 26 МБайт (больше в коде команды перехода не помещается, там ведь еще и код команды кроме адреса).
эта проблема решается линкерами (что, на мой взгляд, не есть хорошо) путем создания промежуточной команды длинного перехода, также существует, причем условная, команда длиного перехода по регистру. В любом случае это будет в разы быстрее, чем диспетчер вызовов.

Современный подход мне не нравится, программы надо предустанавливать, вместо того, чтобы загружать в память и выполнять
Мы вообще о встроенных системах говорим?

Пользователи бывают очень разные, кому-то понятнее goto (while тоже в примерах есть)
Не знаю, как Вас, но меня люди, не способные понять while, просто не интересуют, им не место в современном программировании. Я хорошо разбираюсь в ассемблере и прекрасно знаю, что в машинных командах нет (ну или почти нет) команд непосредственной организации цикла и внутри прячется переход, но любой язык программирования — это повышение уровня абстракции и не следует идти в обратном направлении.

Стандартный оператор printf занимает очень много памяти, еще и сбоит в работе, поэтому в платах Samsung для Linux его переписали, заменив своим
Я про него ничего не говорил, но, вообще то, в современных компиляторах есть возможность существенно уменьшить объем, занимаемый реализацией даного оператора, сбоев в работе лично я не наблюдал (наверное, везло, а может быть, Вы просто не умеете его готовить?), и если стандартный оператор вылизан годами интенсивной эксплуатации, то про реализацию Самсунга ничего сказать нельзя.

Кстати, насчет «корявости» кода, просмотрев множество текстов для Linux и фирменных Samsung, вот тут уж — слов нету просто. StartOS содержит порядка 6000 строк кода, компилируется в загрузочный файл менее 32 КБайт (вполне себе эффективно), и главное — работает
Как говорится, «указав другому на грязные плавники, Вы не станете плавать быстрее». Да, многие коды лично мне было бы стыдно выкладывать на всеобщее обозрение, но у авторов могут быть свое мнение по данному поводу. Размер загрузочного файла не имеет ни малейшего отношения к правильности оформления кода и соблюдения принципов структурирного программирования. Есть еще одно прекрасное выражение «Мы пишем программы не для компиляторов, а для других людей» и если мы можем, не уменьшая эффективности, сделать код более понятным и читаемым, то мы это сделать обязаны. Ну а последний аргумент — «главное, работает» просто приводит в изумление.

Насчет «нерекомендования», боюсь, Вы опоздали, люди всё это уже используют (да еще и хвалят). И порекомендуйте своё, что-нибудь хорошее.
И это просто пугает, то есть люди начинают думать, что так можно писать программы, а потом будут ссылаться — ну у них же не хуже, чем в Ваших примерах, а их похвалили. То есть мы стремимся ускорить деградацию качества программного продукта. Простите, но я не верю, что человек, не способный правильно (то есть понятно) расставить скобки в операторе if, может иметь какие-то глубокие мысли относительно содержательной части данных операторов. Для себя, для какой-то быстрой поделки — пожалуйста, но выкладывать такое на всеобщее обозрение — сильно. Многие хорошие программисты вообще рекомендуют, что всегда нужно писать так, чтобы не стыдно было показать код другим, это дисциплинирует.

Кстати, чего плохого в DEC? Реентерабельность, реккурентные вызовы подпрограмм, сопрограммы, трюки на ассбемблере, где они все сейчас, среди перлов и питонов?
Где я что-то плохое сказал про DEC? Это была превосходная (для своего времени) разработка, я на ней учился и многие вещи считаю эталоном. Просто хотелось бы заметить, что системные вызовы не были реентрабельными, это прямо указывалось в документации, сопрограммы легко реализовывались путем учета особенностей команды вызова, но не особо рекомендовались, а трюки на ассемблере — надо понимать, что они росли из необходимости вводить код руками через клавиатурный монитор или панель с клавишами, и применять их в наше время нет никаких оснований.

Хочу — сделаю себе ОС, хочу — свои библиотеки и свой компилятор текста в двоичный код, назову операторы тоже как хочу, кто мне запретит.
Да Бога ради, просто для того, чтобы назвать опереаторы по своему, нужно быть твердо уверенным в том, что неудобства, связанные с необходимостью переучиваться на новые названия, не превысят выигрыша от подобного переименования, то есть надо быть настолько уверенным в гениальности своих предложений, что простого звания лауреата
Первого всесоюзного конкурса самодеятельных программистов СССР
будет явно недостаточно.

Получилось совсем не коротко, но резюмирую — есть два способа реакции на критику — первый, подумать, а может быть есть в ней рациональное зерно, и попытаться привести свои коды в приемлемый вид, и второй — встать в позу «я художник, я так вижу» и вообще «не доросли вы еще до моей музыки». Мне, почему то, показалось, что Вы не выбрали первый способ.
Во-первых, здравствуйте!

(А у Вас отсутствуют операторы приветствия и прощания, не обижайтесь).

Если серьезно, то за критику — спасибо, говорят, что в науке отрицательный результат — тоже результат, а уж отрицательные отзывы всегда полезнее положительных.

Я хотел помочь заинтересованным людям, если кому пригодится, а мне-то ничего на надо. Дарёному коню в зубы ведь не смотрят.

Насчет оператора goto — примерно так я и думал, что будет такое отношение, но хотелось показать, что его тоже можно применить, наряду с while. И еще — в операционной системе Unix (или Linux?) все-таки констатировали применение хотя бы одного оператора goto (причем, с таким сожалением, как будто преступление совершили). Получается, Unix — плохой, написан ужасно…

Искал подтверждение, нашел статью про goto тут, на Хабре: habrahabr.ru/post/114211

Много пользователей из Индии, Колумбии, Пакистана и т.д. Для них goto понятнее, а потом они переходят на while.

Вот пример (один из них), вроде тут и структуривать особо нечего:
// RT-210s (StartOS) K1...K4 Interrupt Example Sketch

#define	U32	unsigned int
#define	U16	unsigned short
#define	U8	unsigned char
////////////////////////////

// VIC
#define VIC0RAWINTR	 (*(U32 *)0xF2000008)
#define VIC0IRQSTATUS (*(U32 *)0xF2000000)
#define VIC0FIQSTATUS	 (*(U32 *)0xF2000004)
#define VIC0INTENABLE	 (*(U32 *)0xF2000010)
#define VIC0INTSELECT	 (*(U32 *)0xF200000C)

#define VIC0VECTADDR16 (*(U32 *)0xF2000140)
#define VIC0VECTADDR17 (*(U32 *)0xF2000144)
#define VIC0VECTADDR18 (*(U32 *)0xF2000148)
#define VIC0VECTADDR19 (*(U32 *)0xF200014C)
#define VIC0ADDRESS	    (*(U32 *)0xF2000F00)
#define EXT_INT_1_CON	 (*(U32 *)0xE0200E04) // EXT_INT[8]...EXT_INT[15]	
#define EXT_INT_1_MASK (*(U32 *)0xE0200F04)
#define EXT_INT_1_PEND (*(U32 *)0xE0200F44)
#define EXT_INT_2_CON	 (*(U32 *)0xE0200E08) //EXT_INT[16]...EXT_INT[23]
#define EXT_INT_2_MASK (*(U32 *)0xE0200F08)
#define EXT_INT_2_PEND (*(U32 *)0xE0200F48)
#define GPH2CON (*(U32 *)0xE0200C40)
#define GPH2DAT (*(U32 *)0xE0200C44)

void Isr_Init ( void );
void K_EINT16 (void);

int i;
int addr, num;

Main	(void)
{
  Isr_Init ( );
  while (1)
  {
    if ( num )
    {
	Printf ( 10, 20,"Key ISR, Addr = %8x", addr );
	Printf ( 10, 30,"Key Status = %8x", num );
	Buzz ( num*1000, 20 );
	num = 0;
	addr = 0;
    } 
    i++;
    Printf (10,10,"Counter Value  = %8d", i );
    Delay ( 50 );
  }	
}
//////////////////////////////////////////
void	Isr_Init ( void )
{
 VIC0VECTADDR16 = (U32)K_EINT16;

 GPH2CON |= ( 0xF << 0 ); // Pin function 1111: EXT_INT[16]
 GPH2CON |= ( 0xF << 4 ); // Pin function 1111: EXT_INT[17]
 GPH2CON |= ( 0xF << 8 ); // Pin function 1111: EXT_INT[18]
 GPH2CON |= ( 0xF << 12 ); // Pin function 1111: EXT_INT[19]
	
 EXT_INT_2_CON  &=~( 0xF << 0 );
 EXT_INT_2_CON  |= ( 2 << 0 );  // Edge 010 = Falling, 011 = Rising
 EXT_INT_2_MASK &= ~( 1 << 0);	// EXT_INT_2_MASK for EXT_INT[16]

 EXT_INT_2_CON  &=~( 0xF << 4 );
 EXT_INT_2_CON  |= ( 2 << 4 );//Edge 010 = Falling, 011 = Rising
 EXT_INT_2_MASK &= ~( 1 << 1);//EXT_INT_2_MASK for EXT_INT[17]
	
 EXT_INT_2_CON  &=~( 0xF << 8 );
 EXT_INT_2_CON  |= ( 2 << 8 );//Edge 010 = Falling, 011 = Rising
 EXT_INT_2_MASK &= ~( 1 << 2);//EXT_INT_2_MASK for EXT_INT[18]
	
 EXT_INT_2_CON  &=~( 0xF << 12 );
 EXT_INT_2_CON  |= ( 2 << 12 );//Edge 010 = Falling, 011 = Rising
 EXT_INT_2_MASK &= ~( 1 << 3);//EXT_INT_2_MASK for EXT_INT[19]

 VIC0INTSELECT &= ~(1<<16);//Set Mode bit: IRQ and not FIQ
 VIC0INTENABLE |= (1<<16);//Enable EINT[16]

 VIC0ADDRESS = 0;//Clear VIC0ADDRESS

}


void K_EINT16 (void)
{
 num = EXT_INT_2_PEND;
 addr = VIC0ADDRESS;
 EXT_INT_2_PEND |= num;//Reset reason of interrupt
}


Если кто-то захочет, просто редактирует на свой вкус и всё.

Теперь мне понятно, зачем некоторые хотели купить исходные коды — они собирались уничтожить этот ужас! Вместе с примененными структурами, указателями, адресами в стеках FAT32, TCP IP и т.д.

Про расставление скобок в операторе if написано в книге «Совершенный код», в Android Studio в настройках редактора можно указать, как их ставить.

О плюсах и минусах современного программирования можно прочесть здесь:

code.google.com/archive/p/startos/wikis/Education_of_engineers.wiki

и здесь:

www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html

Жаль, что они на английском, но суть там такова, что мы теряем программистов и инженеров, а программирование стало бизнесом (в тревожном смысле).

А вообще, путь пользователя такой — сталкивается со сложностями в инициализации ARM, начинает гуглить, находит стартос, пишет первые программы, добавляет код инициализации, получает Non-OS программу.

Вот один из примеров применения:

www.cttestset.com/PageA.htm

— человек был совсем начинающим в ARM, начал со StartOS, потом сделал специализированное устройство и продает свой аппарат, ему — 74 (!) года, в 1963 году получил диплом о высшем образовании и до сих пор творит.

Еще раз спасибо за науку, с уважением и успехов Вам во всём.
Анатолий

Конечно же, здравствуйте, извините, если чем-то обидел.

Ни в коей мере на претендовал на статус гуру, поэтому за науку благодарить не следует.
И тем не менее, если можно сделать хорошо и правильно, ЗАЧЕМ делать коряво?

Например, в приведенном Вами листинге, почему не поставить тексты функций (нициализации и обработчик) выше main? Например, я, как и многие, читаю программу сверху вниз и мне удобнее увидеть функцию обработки прерывания ДО того, как ее адрес будет присвоен вектору, ну просто удобнее и все. Я не вижу оснований запихать ее ниже точки использования, то есть ухудшить читаемость в угоду чему?

И почему не оформить 4 однотипных фрагмента со настройкой источников прерывания в виде макроса и использовать его? От этого понятность программы возрастет (и даже размер несколько уменьшится исходного текста), а эффективность нисколько не пострадает — опять таки, во имя каких выгод Вы этого не сделали?

Мне просто непонятно нежелание делать красиво из неясных соображений, ни в коей мере не посягая на сами решения. Как говорят, красиво сделанная машина и ездит лучше, а для программ это еще более правильно.

Ну и замечание по существу — а разве переменные num и addr не следовало пометить как volatile? А переменную i превратить из глобальной в локальную для функции main? И присвоить им начальные нулевые значения, не полагаясь на инициализацию по умолчанию? Опять таки на конечный код это никак не повлияет, а ясности в исходный текст добавит. Вот из таких мелочей и вырастают проблемы.

И, конечно, успехов и Вам во всем.
Игорь.
Здравствуйте, Игорь.

Не буду долго Вас отвлекать от дел.

Теперь я понял суть и целиком согласен с доводами.
Да, есть там, что подправить.

Переменные нужно делать локальными, но там она одна и только для индикации, что программа работает, но при этом наступают прерывания (в других примерах локальные переменные показаны, некоторые инициализированы, но иногда и инициализация не помогает, надо записывать значение в теле программы, на практике сталкивался).

По поводу, что main() должна быть внизу — частенько вообще всё бывает в отдельных файлах.
Если однотипностей всего 4 штуки, то, возможно, проще их друг за другом привести. Например, иногда, можно проще написать: val[1]=2; val[2]=3; val[3]=4; val[4]=5;, если их 4 штуки, чем делать цикл

volatile — это правильно, а к «addr» еще и const, и unsigned добавить, особенно это существенно в случае микроконтроллеров, чтобы компилятор знал, кого — в ROM, а кому — RAM подавай. (В данном случае, они всё равно все в RAM попадут).

Можно еще написать: static void K_EINT16 (void)…

У нас был преподаватель по начерталке, профессор Рылов. Как-то он поставил на доске мелом точку, потом стер её. Сказал: «точку ставить не будем, затемняет чертёж!».

Все эти примеры нисколько не претендуют на образцовость, это — «скелетоны», чтобы все поняли, как применить вызов или обратиться к устройству. А вот сложная конструкция может отпугнуть новичка, тем более не программиста, а инженера.

Но я, конечно же, учту эти замечания, спасибо.

С уважением,
Анатолий

Операционные системы на Ассемблере удивительно быстро работают. Я где-то год назад узнал о Kolibri OS, загрузил через kvm и… не понял, что произошло — 1 секунда, и я вижу рабочий стол.

Недавно, нашел еще проект системы- gr8
https://code.google.com/archive/p/gr8os/
Который, кстати, разрабатывал мой родственник.

Хотелось бы верить, что однажды такие системы можно будет устанавливать на пользовательские компьютеры.
Спасибо за статью.
Спасибо, но она не на ассемблере, только небольшие части.
Но там такой код на С, что переписать на ассемблер не сложно, одни записи/чтения регистров, пересылки, и немного вычислений.
Код из текста на С получается очень компактный, это хорошо видно, если какой-то файл программы дизассемблировать.
Я не анализировал. Тут просто история такая: я решил поискать то, чем занимался мой двоюродный племянник — Great, он тут есть на Хабре, я только знал, что он бывает на wasm-e, практикует ассемблер и что-то пишет.
И вот спустя несколько лет узнал, чем он занимался, оказывается, один из его проектов — это ОС.

Я полистал описание, это учебная однопоточная система, но я сам такими вещами никогда не занимался, поэтому мне сложно понять.
Я был бы очень рад, если бы система кому-то пригодилась для учебных или иных целей, может, как прототип для написания более полной ОС.
И хотелось бы, конечно, чтобы труд Ильи не канул в лету, так как его самого уже нет с нами.

Автор русский? «Программы», прям гордость взяла.
Русский, а сарказм не понятен…
Я имею ввиду автор ОС. Вы?
Это маленькая ОС. (Хотя, MS-DOS тоже была однозадачной). Да, вот так получилось, ненароком. Я о слове программы в кавычках подумал, что сарказм.
У меня есть старые журналы «Микропроцессорные средства и системы», там, к примеру, были статьи о том, что «на кафедре мединститута была создана ОС...». И это был не единичный случай. И ОС была с потоками, семафорами и т.д.
Создавать программы можно в средах ADS1.2 (Metrowerks CodeWarrior), IAR, Keil и других

Что из бесплатных/опенсорсных?
GCC под Linux или с эмуляторами под Windows. Только я с этим не работал, но есть документация ведь. Там надо в опциях указать ARM920T в качестве процессора, адрес загрузки и старта программы задать 0x20000000, это для платы Mini2440.

Подробнее можно узнать на форуме FriendlyARM
www.friendlyarm.net
С ADS1.2 тоже интересно, она идет в комлекте с платой на диске, люди интересовались, как ее получить легально, но так и не нашли ответа. Но она очень удобная.
Если программы небольшие, то, кажется, до 32 кБайт IAR (или Keil тоже) позволяют бесплатно использовать.
Мне кажется, что это не совсем OS, а скорее библиотека (удобных) сервисных функций и/или драйверов, заточенных на конкретное железо. Мне кажется, что ядро (RT)OS — это прежде всего: a) поддержка механизма многопоточности, б) поддержка синхронизационных примитивов и механизмов межпоточного обмена данными, в) управление памятью, г) поддержка периферии (втч через драйверы). Для RTOS, в отличие от OS, критически важна поддержка алгоритмов переключения контекста по аппаратным событиям в детермитированное время, втч «быстрые» обработчики прерываний.

Мне также кажется, что тот факт, что в данном решении такая частная задача, как вызов сервисных функций, решена через механизм программных прерываний, не делает систему ни лучше, ни хуже — это все равно, что спорить о том, какой способ передачи параметров лучше при вызове подпрограмм в модифицируемой памяти — класть их в стек или «под себя».

Для сравнения можно взять ChibiOS и посмотреть, например, на ее краткую документацию (даже не на код) — идеологию, организацию модулей, API итд
Она делает свое дело, экономит время, запускает программы и предоставляет им API.

Конечно, ее можно наворотить при желании и наличи времени.

А если я делаю конкретный аппарат и многопоточность мне не нужна?

Кроме того, всегда можно (даже на уровне программы пользователя) включить свое многозадачное ядро, например, как в uC/OS и переключать задачи, как захочется.

Можно даже uC/OS запустить с карты памяти как программу пользователя, проверял.

А ОС бывают и однозадачные. Не так ведь давно был анонс, что «iOS теперь работает в настоящем многозадачном режиме, може даже выводить несколько окон на экран и все они будут работать».
Хотя железо ARM процессоров уже давно позволяет использовать до 32 (кажется) программ по 1 Мегабайту каждая одновременно, причем, они могут быть скомпилированы для работы, скажем, в адресе 0x20000000 каждая, а загружены в разные адреса, менеджер памяти сделает так, что программы и не будут подозревать, где они находятся.

Пока я не видел таких систем. Настоящих.

Анатолий, я же не говорю, что Ваш продукт — плохой. Я говорю, что он больше похож на оболочку, чем на ОС.

Насчет «многозадачность мне не нужна» — если Вам нужны прерывания — вам в 99% случаев нужна и многозадачность. Вопрос в парадигме реализации обработки системой асинхронных событий (а физический мир всегда асинхронен по отношению к работающей МК системе) — то есть если нет встроенных средств поддержки многозадачности ИЛИ нужна оперативная реакция на прерывания с лимитированным временем ответа и джиттером — тогда да, ограничиваемся просто обработчиком.
Если же ядро такие средства имеет, и величина латентности/джиттера допустима — строим на основе потоков и обмена сообщениями.

Последний способ гораздо менее привязан к конкретной аппаратуре, и соответственно, более понятен, гибок, переносим. Заметьте, что подавляющее большинство периферийных устройств современных SoC имеют встроенные аппаратныее средства, как раз позволяющие работать с ними с заметной латентностью.

Насчет iOS — имеется в виду «пользовательская» однозадачность — то есть в один момент времени только одно приложение может иметь интерактив с пользователем (показывать ему свой экран и принимать от него события). Внутри системы процессов может быть множество — иначе невозможно было бы ни пакетами по сети обменяться, ни музыку в фоне послущать.

Насчет управления памятью для RTOS — под этим редко подразумевается виртуализация и/или защита памяти — в отличие от больших ОС, все процессы RTOS априори а) дружественны друг другу, т.к. системы реального времени обычно замкнутые — в них нельзя загрузить и запустить произвольный процесс, и б) отдельные процессы представляют собой части одного и того же программного модуля, соответственно вопросы загрузки и настройки адресов в большинстве случаев тоже отпадают. Кроме того, управляющие системы реального времени желательно строить с неизменяемым сегментом кода для увеличения детерминированности поведения при обработке непрогнозируемых отказов аппаратуры (например, срабатывании вотчдога или пропадания питания в произвольный момент)
Не даром марсоход Curiosity бороздит просторы Марса под управлением RT системы uCOS фирмы Micrium.

Пруф есть? А то WindRiver оказывается фигню пишет, что на каком-то vxWorks Curiosity работает )
С сайта micrium.com взял, но кто управляет колесами, не вполне ясно, так что, возможно, что Ваше замечание правильное. Но Micrium uC/OS-II на Марсе есть, это факт. По крайней мере, управляет аналитическими лабораториями SAM.

www.micrium.com/curiosity
Из Вашей ссылки следует, что Wind River's VxWorks тоже лабораторией управляет, а не колеса крутит (дались мне эти колеса).

Wind River's VxWorks Powers Mars Science Laboratory Rover, Curiosity — See more at: www.windriver.com/news/press/pr.html?ID=10901#sthash.WqzfkXoq.dpuf
можно здоровую критику?

. . .
;----	первый способ
	LDR      r2, text1	; загружаем адрес текста 1 в регистр r2
. . .

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

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


помоему конструкция излишне сложная… можна написать проще:
. . .
;----	первый способ
	LDR      r2, =txt	; загружаем адрес txt в регистр r2
. . .

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

то есть промежуточная константа text1 просто не нужна!
Можно любую критику, всегда полезно.
Согласен с Вашей правкой.
Я этот пример сам не писал, это был текст Hello World на языке C.
В ADS1.2 подвел курсор к файлу Hello.c, нажал правую кнопку мыши, выбрал «дизассемблировать». Вот и получил тот самый текст на Ассебмлере. Далее, его можно править вручную, заодно проверить можно, насколько эффективно работает компилятор с языка C.

Для RT-210 всё еще проще. Там программа пользователя загружается вниз памяти (0x20000000) и вызывается как подпрограмма. Не надо указывать никаких лишних адресов, как в StartOS.

Текст программы:
void Main(void)
{
   Print_String (20, 150, "Hello, World!");
}


В проект надо только включить второй файл, StartOS.c с определениями функций. Если на него не смотреть, то он вообще не отвлекает внимание от главного кода проекта.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации