Комментарии 40
Забавно монитор ориентирован в первом видио.
+1
Ну это не забавы ради, а листингов длинных для. А так же для манов и даташитов. У меня второй монитор на машине точно так же установлен. Очень удобно скажу я Вам.
+3
Кстати да, когда мне приходилось писать на ассемблере, то его код по ширине был не велик, а вот высоты экрана реально не хватало (приходилось изменять текстовый режим). Какое отношение сторон у вашего монитора на видео? Вообще, этот момент по созданию удобной рабочей интересен, если будет время, напишите чуть подробней.
+1
Ээээ… не я автор топика, но если интересно, то у меня 2 монитора: основной — 23" 16х10, вспомогательный (вертикально установленный) 19" 16х9.
+1
16:9
а вот строк помещается около 130 при высоте шрифта 8 пунктов (в зависимости от среды программирования)
а вот строк помещается около 130 при высоте шрифта 8 пунктов (в зависимости от среды программирования)
+1
Скажите, заведется ли StartOS на Atmel'овских чипах (ARM Cortex-M7)?
+1
Возможно, но надо будет ее портировать. Скорее всего, в Atmel другая организация памяти, регистров внешних устройств и пр. Даже в Samsung у разных процессоров всё по-разному. В общем, если есть документация и исходный код на процессор, например, в Keil, для инициализации SoC, еще известно, как организована память на плате, ее параметры, то можно. Но пока всё есть для ARM9 и ARM Cortex-A8. Это непростая работа…
+1
очень интересно, плюсую, пошел смотреть исходники
(написал чтобы потом иметь возможность комментировать)
(написал чтобы потом иметь возможность комментировать)
+1
Исходники есть на все примеры, работу с прерываниями, с видеокамерой, но не на саму систему (пока, во всяком случае). Для плат 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 вообще сделала проприетарные экраны с обменом по одному проводу, пришлось их протокол просто тупо хакнуть.
В StartOS ноу-хау является драйвер для программных прерываний и всего-то. Почему-то классические программные прерывания не применяются на практике (не видел). А сама технология подробно расписана на сайте холдинга ARM, но, как водится, их примеры не работоспособны. Что бы стать разработчиком, как я понял, надо ехать к ним на платные курсы.
FriendlyARM вообще сделала проприетарные экраны с обменом по одному проводу, пришлось их протокол просто тупо хакнуть.
+1
:-(((
жаль…
интересна сама система!
жаль…
интересна сама система!
+1
Почему-то классические программные прерывания не применяются на практике (не видел).
На software interrupts почти во всех ОС для ARM сисколы сделаны. Так что, ноу-хау ваше сомнительно. )
+1
Это было ноу-хау, Карл, ноу-хау.
Когда механизм вызова через EMT применялся в реализации Basic для DEC микрокомпов, это было оправданно, поскольку позволяло сэкономить до 12% (на мой взгляд, цифра несколько завышена), что при объеме ПЗУ в 4КБ было вполне существенным. Но в наше время, на А8, применять подобное и называть это ноу-хау…
У меня просто нет слов.
И Бога ради, не надо выкладывать исходников на саму систему, это могут увидеть дети, мне более чем хватило исходников на примеры. Магические константы в каждой строке (в каждой строке, Карл), стандартные типы не применяются ввиду их фатального недостатка и создаются свои, полнейшее пренебрежение элементарными правилами структурирования кода, goto как замена while (это, наверное, тоже ноу-хау?), и это в примерах применения, мне страшно представить, как будет реализованна работа с регистрами периферии в самой системе.
Резюмируя, категорически не рекомендую использовать данный продукт с его ноу-хау для
Когда механизм вызова через EMT применялся в реализации Basic для DEC микрокомпов, это было оправданно, поскольку позволяло сэкономить до 12% (на мой взгляд, цифра несколько завышена), что при объеме ПЗУ в 4КБ было вполне существенным. Но в наше время, на А8, применять подобное и называть это ноу-хау…
У меня просто нет слов.
И Бога ради, не надо выкладывать исходников на саму систему, это могут увидеть дети, мне более чем хватило исходников на примеры. Магические константы в каждой строке (в каждой строке, Карл), стандартные типы не применяются ввиду их фатального недостатка и создаются свои, полнейшее пренебрежение элементарными правилами структурирования кода, goto как замена while (это, наверное, тоже ноу-хау?), и это в примерах применения, мне страшно представить, как будет реализованна работа с регистрами периферии в самой системе.
Резюмируя, категорически не рекомендую использовать данный продукт с его ноу-хау для
изучения программирования встроенных систем, ОС реального времени, Ассемблера и С— ничему хорошему не научитесь.
+1
Мой знакомый говорит: «умных много, а работать — некому».
Сделайте, пожалуйста, что-то подобное, снабдите правильными примерами, без goto, хорошо структурированными, а мы — поучимся и даже критиковать не будем, только поапплодируем.
Еще так говорят: «отрицая — предлагай!». Подскажите, что применить для вызова системных подпрограмм из программы пользователя, когда разница в адресах больше 26 МБайт (больше в коде команды перехода не помещается, там ведь еще и код команды кроме адреса).
Современный подход мне не нравится, программы надо предустанавливать, вместо того, чтобы загружать в память и выполнять. Windows, Linux, Android занимают с добрую половину памяти, работают медленно, не в реальном времени, а программу пользователя отодвигают на второй план.
Пользователи бывают очень разные, кому-то понятнее goto (while тоже в примерах есть). Тут уж, как говорится, «дурак не заметит, а умный поймет».
Стандартный оператор printf занимает очень много памяти, еще и сбоит в работе, поэтому в платах Samsung для Linux его переписали, заменив своим.
Кстати, насчет «корявости» кода, просмотрев множество текстов для Linux и фирменных Samsung, вот тут уж — слов нету просто. StartOS содержит порядка 6000 строк кода, компилируется в загрузочный файл менее 32 КБайт (вполне себе эффективно), и главное — работает.
Еще посмотрите исходные коды на TCP IP Stack, там то байты, то 16-тиричные константы, то 32-битные слова, вот его покритикуйте…
Насчет «нерекомендования», боюсь, Вы опоздали, люди всё это уже используют (да еще и хвалят). И порекомендуйте своё, что-нибудь хорошее.
Напоследок, я — инженер-электрик по специальности «электропривод и автоматизация промышленных установок», в 1983 году столкнулся с применением микропроцессоров. Кстати, чего плохого в DEC? Реентерабельность, реккурентные вызовы подпрограмм, сопрограммы, трюки на ассбемблере, где они все сейчас, среди перлов и питонов?
Но это не помешало мне стать лауреатом Первого всесоюзного конкурса самодеятельных программистов СССР со своим «Программным синтезатором речи». Это я насчет давления авторитетом.
Хочу — сделаю себе ОС, хочу — свои библиотеки и свой компилятор текста в двоичный код, назову операторы тоже как хочу, кто мне запретит.
Самомодифицирующиеся программы — вот моя цель, и для этого нужен полный контроль над железом, а не работа в песочнице, к чему нас подталкивают.
Извините за длинный ответЧемберлену, вопрос тоже не был коротким.
А вообще, это здорово, что такая критика и обсуждение, всем — успехов!
Сделайте, пожалуйста, что-то подобное, снабдите правильными примерами, без goto, хорошо структурированными, а мы — поучимся и даже критиковать не будем, только поапплодируем.
Еще так говорят: «отрицая — предлагай!». Подскажите, что применить для вызова системных подпрограмм из программы пользователя, когда разница в адресах больше 26 МБайт (больше в коде команды перехода не помещается, там ведь еще и код команды кроме адреса).
Современный подход мне не нравится, программы надо предустанавливать, вместо того, чтобы загружать в память и выполнять. Windows, Linux, Android занимают с добрую половину памяти, работают медленно, не в реальном времени, а программу пользователя отодвигают на второй план.
Пользователи бывают очень разные, кому-то понятнее goto (while тоже в примерах есть). Тут уж, как говорится, «дурак не заметит, а умный поймет».
Стандартный оператор printf занимает очень много памяти, еще и сбоит в работе, поэтому в платах Samsung для Linux его переписали, заменив своим.
Кстати, насчет «корявости» кода, просмотрев множество текстов для Linux и фирменных Samsung, вот тут уж — слов нету просто. StartOS содержит порядка 6000 строк кода, компилируется в загрузочный файл менее 32 КБайт (вполне себе эффективно), и главное — работает.
Еще посмотрите исходные коды на TCP IP Stack, там то байты, то 16-тиричные константы, то 32-битные слова, вот его покритикуйте…
Насчет «нерекомендования», боюсь, Вы опоздали, люди всё это уже используют (да еще и хвалят). И порекомендуйте своё, что-нибудь хорошее.
Напоследок, я — инженер-электрик по специальности «электропривод и автоматизация промышленных установок», в 1983 году столкнулся с применением микропроцессоров. Кстати, чего плохого в DEC? Реентерабельность, реккурентные вызовы подпрограмм, сопрограммы, трюки на ассбемблере, где они все сейчас, среди перлов и питонов?
Но это не помешало мне стать лауреатом Первого всесоюзного конкурса самодеятельных программистов СССР со своим «Программным синтезатором речи». Это я насчет давления авторитетом.
Хочу — сделаю себе ОС, хочу — свои библиотеки и свой компилятор текста в двоичный код, назову операторы тоже как хочу, кто мне запретит.
Самомодифицирующиеся программы — вот моя цель, и для этого нужен полный контроль над железом, а не работа в песочнице, к чему нас подталкивают.
Извините за длинный ответ
А вообще, это здорово, что такая критика и обсуждение, всем — успехов!
+5
а может быть сделаете статью про написание ОС для арм процессоров?
интересует привилегированный и обычный режимы процессора, минимальные функции и т.д.
интересует привилегированный и обычный режимы процессора, минимальные функции и т.д.
-1
Наверное, сделаю. Так, чтобы не умничать, а людям польза бы была, не натыкаться на известные грабли. Вообще, затея делать ОС — на грани помешательства.
Вкратце, для S3C2440A (Mini2440) были сложности, программа стартовала в режиме пользователя (User), система вызывалась в режиме SVC (привилегированном), прерывания из программы пользователя не работали, пришлось менять режим в программе обработки. Потом другая проблема, системные вызовы в одном варианте работали, в другом -не работали в пользовательской программе обработки аппаратных прерываний.
Пришлось применить стандартный подход, такой, что подпрограмма обработки прерывания должна быть короткой, она устанавливает флаги, о том, что произошло и выходит. Потом программа пользователя в спокойной обстановке анализирует флаги, приоритет событий и предпринимает нужные действия.
Для S5PV210 (Mini210s) всё проще, система в режиме User, программа позьзователя в режиме User, вызовы системы в режиме SVC. Мощная система векторных прерываний позволяет устанавливать адреса тремя способами.
Другая проблема, что адреса Reset, IRQ (FIQ) возможно менять легко, а вот поменять адрес SWI было непросто весьма и весьма.
Но, практика — критерий истины, работают прерывания и от таймеров, и от портов, и от другого.
Вот пример — вывод звука через таймер и ШИМ. Программа обработки сама все делает, независимо от основной, (вроде, как в учебнике).
Вкратце, для S3C2440A (Mini2440) были сложности, программа стартовала в режиме пользователя (User), система вызывалась в режиме SVC (привилегированном), прерывания из программы пользователя не работали, пришлось менять режим в программе обработки. Потом другая проблема, системные вызовы в одном варианте работали, в другом -не работали в пользовательской программе обработки аппаратных прерываний.
Пришлось применить стандартный подход, такой, что подпрограмма обработки прерывания должна быть короткой, она устанавливает флаги, о том, что произошло и выходит. Потом программа пользователя в спокойной обстановке анализирует флаги, приоритет событий и предпринимает нужные действия.
Для S5PV210 (Mini210s) всё проще, система в режиме User, программа позьзователя в режиме User, вызовы системы в режиме SVC. Мощная система векторных прерываний позволяет устанавливать адреса тремя способами.
Другая проблема, что адреса Reset, IRQ (FIQ) возможно менять легко, а вот поменять адрес SWI было непросто весьма и весьма.
Но, практика — критерий истины, работают прерывания и от таймеров, и от портов, и от другого.
Вот пример — вывод звука через таймер и ШИМ. Программа обработки сама все делает, независимо от основной, (вроде, как в учебнике).
0
Ну по пунктам
Получилось совсем не коротко, но резюмирую — есть два способа реакции на критику — первый, подумать, а может быть есть в ней рациональное зерно, и попытаться привести свои коды в приемлемый вид, и второй — встать в позу «я художник, я так вижу» и вообще «не доросли вы еще до моей музыки». Мне, почему то, показалось, что Вы не выбрали первый способ.
Сделайте, пожалуйста, что-то подобное, снабдите правильными примерами, без goto, хорошо структурированными, а мы — поучимся и даже критиковать не будем, только поапплодируем.uc/OS, FreeRTOS, esOS и т.д — хорошо структурированные, без goto — качайте, смотрите, учитесь (комментированы слабовато, но уж тут что есть, у Вас не лучше).
Подскажите, что применить для вызова системных подпрограмм из программы пользователя, когда разница в адресах больше 26 МБайт (больше в коде команды перехода не помещается, там ведь еще и код команды кроме адреса).эта проблема решается линкерами (что, на мой взгляд, не есть хорошо) путем создания промежуточной команды длинного перехода, также существует, причем условная, команда длиного перехода по регистру. В любом случае это будет в разы быстрее, чем диспетчер вызовов.
Современный подход мне не нравится, программы надо предустанавливать, вместо того, чтобы загружать в память и выполнятьМы вообще о встроенных системах говорим?
Пользователи бывают очень разные, кому-то понятнее goto (while тоже в примерах есть)Не знаю, как Вас, но меня люди, не способные понять while, просто не интересуют, им не место в современном программировании. Я хорошо разбираюсь в ассемблере и прекрасно знаю, что в машинных командах нет (ну или почти нет) команд непосредственной организации цикла и внутри прячется переход, но любой язык программирования — это повышение уровня абстракции и не следует идти в обратном направлении.
Стандартный оператор printf занимает очень много памяти, еще и сбоит в работе, поэтому в платах Samsung для Linux его переписали, заменив своимЯ про него ничего не говорил, но, вообще то, в современных компиляторах есть возможность существенно уменьшить объем, занимаемый реализацией даного оператора, сбоев в работе лично я не наблюдал (наверное, везло, а может быть, Вы просто не умеете его готовить?), и если стандартный оператор вылизан годами интенсивной эксплуатации, то про реализацию Самсунга ничего сказать нельзя.
Кстати, насчет «корявости» кода, просмотрев множество текстов для Linux и фирменных Samsung, вот тут уж — слов нету просто. StartOS содержит порядка 6000 строк кода, компилируется в загрузочный файл менее 32 КБайт (вполне себе эффективно), и главное — работаетКак говорится, «указав другому на грязные плавники, Вы не станете плавать быстрее». Да, многие коды лично мне было бы стыдно выкладывать на всеобщее обозрение, но у авторов могут быть свое мнение по данному поводу. Размер загрузочного файла не имеет ни малейшего отношения к правильности оформления кода и соблюдения принципов структурирного программирования. Есть еще одно прекрасное выражение «Мы пишем программы не для компиляторов, а для других людей» и если мы можем, не уменьшая эффективности, сделать код более понятным и читаемым, то мы это сделать обязаны. Ну а последний аргумент — «главное, работает» просто приводит в изумление.
Насчет «нерекомендования», боюсь, Вы опоздали, люди всё это уже используют (да еще и хвалят). И порекомендуйте своё, что-нибудь хорошее.И это просто пугает, то есть люди начинают думать, что так можно писать программы, а потом будут ссылаться — ну у них же не хуже, чем в Ваших примерах, а их похвалили. То есть мы стремимся ускорить деградацию качества программного продукта. Простите, но я не верю, что человек, не способный правильно (то есть понятно) расставить скобки в операторе if, может иметь какие-то глубокие мысли относительно содержательной части данных операторов. Для себя, для какой-то быстрой поделки — пожалуйста, но выкладывать такое на всеобщее обозрение — сильно. Многие хорошие программисты вообще рекомендуют, что всегда нужно писать так, чтобы не стыдно было показать код другим, это дисциплинирует.
Кстати, чего плохого в DEC? Реентерабельность, реккурентные вызовы подпрограмм, сопрограммы, трюки на ассбемблере, где они все сейчас, среди перлов и питонов?Где я что-то плохое сказал про DEC? Это была превосходная (для своего времени) разработка, я на ней учился и многие вещи считаю эталоном. Просто хотелось бы заметить, что системные вызовы не были реентрабельными, это прямо указывалось в документации, сопрограммы легко реализовывались путем учета особенностей команды вызова, но не особо рекомендовались, а трюки на ассемблере — надо понимать, что они росли из необходимости вводить код руками через клавиатурный монитор или панель с клавишами, и применять их в наше время нет никаких оснований.
Хочу — сделаю себе ОС, хочу — свои библиотеки и свой компилятор текста в двоичный код, назову операторы тоже как хочу, кто мне запретит.Да Бога ради, просто для того, чтобы назвать опереаторы по своему, нужно быть твердо уверенным в том, что неудобства, связанные с необходимостью переучиваться на новые названия, не превысят выигрыша от подобного переименования, то есть надо быть настолько уверенным в гениальности своих предложений, что простого звания лауреата
Первого всесоюзного конкурса самодеятельных программистов СССРбудет явно недостаточно.
Получилось совсем не коротко, но резюмирую — есть два способа реакции на критику — первый, подумать, а может быть есть в ней рациональное зерно, и попытаться привести свои коды в приемлемый вид, и второй — встать в позу «я художник, я так вижу» и вообще «не доросли вы еще до моей музыки». Мне, почему то, показалось, что Вы не выбрали первый способ.
+1
Во-первых, здравствуйте!
(А у Вас отсутствуют операторы приветствия и прощания, не обижайтесь).
Если серьезно, то за критику — спасибо, говорят, что в науке отрицательный результат — тоже результат, а уж отрицательные отзывы всегда полезнее положительных.
Я хотел помочь заинтересованным людям, если кому пригодится, а мне-то ничего на надо. Дарёному коню в зубы ведь не смотрят.
Насчет оператора goto — примерно так я и думал, что будет такое отношение, но хотелось показать, что его тоже можно применить, наряду с while. И еще — в операционной системе Unix (или Linux?) все-таки констатировали применение хотя бы одного оператора goto (причем, с таким сожалением, как будто преступление совершили). Получается, Unix — плохой, написан ужасно…
Искал подтверждение, нашел статью про goto тут, на Хабре: habrahabr.ru/post/114211
Много пользователей из Индии, Колумбии, Пакистана и т.д. Для них goto понятнее, а потом они переходят на while.
Вот пример (один из них), вроде тут и структуривать особо нечего:
Если кто-то захочет, просто редактирует на свой вкус и всё.
Теперь мне понятно, зачем некоторые хотели купить исходные коды — они собирались уничтожить этот ужас! Вместе с примененными структурами, указателями, адресами в стеках 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 году получил диплом о высшем образовании и до сих пор творит.
Еще раз спасибо за науку, с уважением и успехов Вам во всём.
Анатолий
(А у Вас отсутствуют операторы приветствия и прощания, не обижайтесь).
Если серьезно, то за критику — спасибо, говорят, что в науке отрицательный результат — тоже результат, а уж отрицательные отзывы всегда полезнее положительных.
Я хотел помочь заинтересованным людям, если кому пригодится, а мне-то ничего на надо. Дарёному коню в зубы ведь не смотрят.
Насчет оператора 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 году получил диплом о высшем образовании и до сих пор творит.
Еще раз спасибо за науку, с уважением и успехов Вам во всём.
Анатолий
0
Конечно же, здравствуйте, извините, если чем-то обидел.
Ни в коей мере на претендовал на статус гуру, поэтому за науку благодарить не следует.
И тем не менее, если можно сделать хорошо и правильно, ЗАЧЕМ делать коряво?
Например, в приведенном Вами листинге, почему не поставить тексты функций (нициализации и обработчик) выше main? Например, я, как и многие, читаю программу сверху вниз и мне удобнее увидеть функцию обработки прерывания ДО того, как ее адрес будет присвоен вектору, ну просто удобнее и все. Я не вижу оснований запихать ее ниже точки использования, то есть ухудшить читаемость в угоду чему?
И почему не оформить 4 однотипных фрагмента со настройкой источников прерывания в виде макроса и использовать его? От этого понятность программы возрастет (и даже размер несколько уменьшится исходного текста), а эффективность нисколько не пострадает — опять таки, во имя каких выгод Вы этого не сделали?
Мне просто непонятно нежелание делать красиво из неясных соображений, ни в коей мере не посягая на сами решения. Как говорят, красиво сделанная машина и ездит лучше, а для программ это еще более правильно.
Ну и замечание по существу — а разве переменные num и addr не следовало пометить как volatile? А переменную i превратить из глобальной в локальную для функции main? И присвоить им начальные нулевые значения, не полагаясь на инициализацию по умолчанию? Опять таки на конечный код это никак не повлияет, а ясности в исходный текст добавит. Вот из таких мелочей и вырастают проблемы.
И, конечно, успехов и Вам во всем.
Игорь.
Ни в коей мере на претендовал на статус гуру, поэтому за науку благодарить не следует.
И тем не менее, если можно сделать хорошо и правильно, ЗАЧЕМ делать коряво?
Например, в приведенном Вами листинге, почему не поставить тексты функций (нициализации и обработчик) выше main? Например, я, как и многие, читаю программу сверху вниз и мне удобнее увидеть функцию обработки прерывания ДО того, как ее адрес будет присвоен вектору, ну просто удобнее и все. Я не вижу оснований запихать ее ниже точки использования, то есть ухудшить читаемость в угоду чему?
И почему не оформить 4 однотипных фрагмента со настройкой источников прерывания в виде макроса и использовать его? От этого понятность программы возрастет (и даже размер несколько уменьшится исходного текста), а эффективность нисколько не пострадает — опять таки, во имя каких выгод Вы этого не сделали?
Мне просто непонятно нежелание делать красиво из неясных соображений, ни в коей мере не посягая на сами решения. Как говорят, красиво сделанная машина и ездит лучше, а для программ это еще более правильно.
Ну и замечание по существу — а разве переменные num и addr не следовало пометить как volatile? А переменную i превратить из глобальной в локальную для функции main? И присвоить им начальные нулевые значения, не полагаясь на инициализацию по умолчанию? Опять таки на конечный код это никак не повлияет, а ясности в исходный текст добавит. Вот из таких мелочей и вырастают проблемы.
И, конечно, успехов и Вам во всем.
Игорь.
0
Здравствуйте, Игорь.
Не буду долго Вас отвлекать от дел.
Теперь я понял суть и целиком согласен с доводами.
Да, есть там, что подправить.
Переменные нужно делать локальными, но там она одна и только для индикации, что программа работает, но при этом наступают прерывания (в других примерах локальные переменные показаны, некоторые инициализированы, но иногда и инициализация не помогает, надо записывать значение в теле программы, на практике сталкивался).
По поводу, что 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)…
У нас был преподаватель по начерталке, профессор Рылов. Как-то он поставил на доске мелом точку, потом стер её. Сказал: «точку ставить не будем, затемняет чертёж!».
Все эти примеры нисколько не претендуют на образцовость, это — «скелетоны», чтобы все поняли, как применить вызов или обратиться к устройству. А вот сложная конструкция может отпугнуть новичка, тем более не программиста, а инженера.
Но я, конечно же, учту эти замечания, спасибо.
С уважением,
Анатолий
Не буду долго Вас отвлекать от дел.
Теперь я понял суть и целиком согласен с доводами.
Да, есть там, что подправить.
Переменные нужно делать локальными, но там она одна и только для индикации, что программа работает, но при этом наступают прерывания (в других примерах локальные переменные показаны, некоторые инициализированы, но иногда и инициализация не помогает, надо записывать значение в теле программы, на практике сталкивался).
По поводу, что 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)…
У нас был преподаватель по начерталке, профессор Рылов. Как-то он поставил на доске мелом точку, потом стер её. Сказал: «точку ставить не будем, затемняет чертёж!».
Все эти примеры нисколько не претендуют на образцовость, это — «скелетоны», чтобы все поняли, как применить вызов или обратиться к устройству. А вот сложная конструкция может отпугнуть новичка, тем более не программиста, а инженера.
Но я, конечно же, учту эти замечания, спасибо.
С уважением,
Анатолий
0
Операционные системы на Ассемблере удивительно быстро работают. Я где-то год назад узнал о Kolibri OS, загрузил через kvm и… не понял, что произошло — 1 секунда, и я вижу рабочий стол.
Недавно, нашел еще проект системы- gr8
https://code.google.com/archive/p/gr8os/
Который, кстати, разрабатывал мой родственник.
Хотелось бы верить, что однажды такие системы можно будет устанавливать на пользовательские компьютеры.
Спасибо за статью.
Недавно, нашел еще проект системы- gr8
https://code.google.com/archive/p/gr8os/
Который, кстати, разрабатывал мой родственник.
Хотелось бы верить, что однажды такие системы можно будет устанавливать на пользовательские компьютеры.
Спасибо за статью.
0
Спасибо, но она не на ассемблере, только небольшие части.
Но там такой код на С, что переписать на ассемблер не сложно, одни записи/чтения регистров, пересылки, и немного вычислений.
Код из текста на С получается очень компактный, это хорошо видно, если какой-то файл программы дизассемблировать.
Но там такой код на С, что переписать на ассемблер не сложно, одни записи/чтения регистров, пересылки, и немного вычислений.
Код из текста на С получается очень компактный, это хорошо видно, если какой-то файл программы дизассемблировать.
0
Я не анализировал. Тут просто история такая: я решил поискать то, чем занимался мой двоюродный племянник — Great, он тут есть на Хабре, я только знал, что он бывает на wasm-e, практикует ассемблер и что-то пишет.
И вот спустя несколько лет узнал, чем он занимался, оказывается, один из его проектов — это ОС.
Я полистал описание, это учебная однопоточная система, но я сам такими вещами никогда не занимался, поэтому мне сложно понять.
Я был бы очень рад, если бы система кому-то пригодилась для учебных или иных целей, может, как прототип для написания более полной ОС.
И хотелось бы, конечно, чтобы труд Ильи не канул в лету, так как его самого уже нет с нами.
И вот спустя несколько лет узнал, чем он занимался, оказывается, один из его проектов — это ОС.
Я полистал описание, это учебная однопоточная система, но я сам такими вещами никогда не занимался, поэтому мне сложно понять.
Я был бы очень рад, если бы система кому-то пригодилась для учебных или иных целей, может, как прототип для написания более полной ОС.
И хотелось бы, конечно, чтобы труд Ильи не канул в лету, так как его самого уже нет с нами.
+1
Автор русский? «Программы», прям гордость взяла.
0
Русский, а сарказм не понятен…
+3
Я имею ввиду автор ОС. Вы?
0
Это маленькая ОС. (Хотя, MS-DOS тоже была однозадачной). Да, вот так получилось, ненароком. Я о слове программы в кавычках подумал, что сарказм.
У меня есть старые журналы «Микропроцессорные средства и системы», там, к примеру, были статьи о том, что «на кафедре мединститута была создана ОС...». И это был не единичный случай. И ОС была с потоками, семафорами и т.д.
У меня есть старые журналы «Микропроцессорные средства и системы», там, к примеру, были статьи о том, что «на кафедре мединститута была создана ОС...». И это был не единичный случай. И ОС была с потоками, семафорами и т.д.
-1
Создавать программы можно в средах ADS1.2 (Metrowerks CodeWarrior), IAR, Keil и других
Что из бесплатных/опенсорсных?
+1
GCC под Linux или с эмуляторами под Windows. Только я с этим не работал, но есть документация ведь. Там надо в опциях указать ARM920T в качестве процессора, адрес загрузки и старта программы задать 0x20000000, это для платы Mini2440.
Подробнее можно узнать на форуме FriendlyARM
www.friendlyarm.net
С ADS1.2 тоже интересно, она идет в комлекте с платой на диске, люди интересовались, как ее получить легально, но так и не нашли ответа. Но она очень удобная.
Если программы небольшие, то, кажется, до 32 кБайт IAR (или Keil тоже) позволяют бесплатно использовать.
Подробнее можно узнать на форуме FriendlyARM
www.friendlyarm.net
С ADS1.2 тоже интересно, она идет в комлекте с платой на диске, люди интересовались, как ее получить легально, но так и не нашли ответа. Но она очень удобная.
Если программы небольшие, то, кажется, до 32 кБайт IAR (или Keil тоже) позволяют бесплатно использовать.
+1
Мне кажется, что это не совсем OS, а скорее библиотека (удобных) сервисных функций и/или драйверов, заточенных на конкретное железо. Мне кажется, что ядро (RT)OS — это прежде всего: a) поддержка механизма многопоточности, б) поддержка синхронизационных примитивов и механизмов межпоточного обмена данными, в) управление памятью, г) поддержка периферии (втч через драйверы). Для RTOS, в отличие от OS, критически важна поддержка алгоритмов переключения контекста по аппаратным событиям в детермитированное время, втч «быстрые» обработчики прерываний.
Мне также кажется, что тот факт, что в данном решении такая частная задача, как вызов сервисных функций, решена через механизм программных прерываний, не делает систему ни лучше, ни хуже — это все равно, что спорить о том, какой способ передачи параметров лучше при вызове подпрограмм в модифицируемой памяти — класть их в стек или «под себя».
Для сравнения можно взять ChibiOS и посмотреть, например, на ее краткую документацию (даже не на код) — идеологию, организацию модулей, API итд
Мне также кажется, что тот факт, что в данном решении такая частная задача, как вызов сервисных функций, решена через механизм программных прерываний, не делает систему ни лучше, ни хуже — это все равно, что спорить о том, какой способ передачи параметров лучше при вызове подпрограмм в модифицируемой памяти — класть их в стек или «под себя».
Для сравнения можно взять ChibiOS и посмотреть, например, на ее краткую документацию (даже не на код) — идеологию, организацию модулей, API итд
+4
Она делает свое дело, экономит время, запускает программы и предоставляет им API.
Конечно, ее можно наворотить при желании и наличи времени.
А если я делаю конкретный аппарат и многопоточность мне не нужна?
Кроме того, всегда можно (даже на уровне программы пользователя) включить свое многозадачное ядро, например, как в uC/OS и переключать задачи, как захочется.
Можно даже uC/OS запустить с карты памяти как программу пользователя, проверял.
А ОС бывают и однозадачные. Не так ведь давно был анонс, что «iOS теперь работает в настоящем многозадачном режиме, може даже выводить несколько окон на экран и все они будут работать».
Хотя железо ARM процессоров уже давно позволяет использовать до 32 (кажется) программ по 1 Мегабайту каждая одновременно, причем, они могут быть скомпилированы для работы, скажем, в адресе 0x20000000 каждая, а загружены в разные адреса, менеджер памяти сделает так, что программы и не будут подозревать, где они находятся.
Пока я не видел таких систем. Настоящих.
Конечно, ее можно наворотить при желании и наличи времени.
А если я делаю конкретный аппарат и многопоточность мне не нужна?
Кроме того, всегда можно (даже на уровне программы пользователя) включить свое многозадачное ядро, например, как в uC/OS и переключать задачи, как захочется.
Можно даже uC/OS запустить с карты памяти как программу пользователя, проверял.
А ОС бывают и однозадачные. Не так ведь давно был анонс, что «iOS теперь работает в настоящем многозадачном режиме, може даже выводить несколько окон на экран и все они будут работать».
Хотя железо ARM процессоров уже давно позволяет использовать до 32 (кажется) программ по 1 Мегабайту каждая одновременно, причем, они могут быть скомпилированы для работы, скажем, в адресе 0x20000000 каждая, а загружены в разные адреса, менеджер памяти сделает так, что программы и не будут подозревать, где они находятся.
Пока я не видел таких систем. Настоящих.
-1
Анатолий, я же не говорю, что Ваш продукт — плохой. Я говорю, что он больше похож на оболочку, чем на ОС.
Насчет «многозадачность мне не нужна» — если Вам нужны прерывания — вам в 99% случаев нужна и многозадачность. Вопрос в парадигме реализации обработки системой асинхронных событий (а физический мир всегда асинхронен по отношению к работающей МК системе) — то есть если нет встроенных средств поддержки многозадачности ИЛИ нужна оперативная реакция на прерывания с лимитированным временем ответа и джиттером — тогда да, ограничиваемся просто обработчиком.
Если же ядро такие средства имеет, и величина латентности/джиттера допустима — строим на основе потоков и обмена сообщениями.
Последний способ гораздо менее привязан к конкретной аппаратуре, и соответственно, более понятен, гибок, переносим. Заметьте, что подавляющее большинство периферийных устройств современных SoC имеют встроенные аппаратныее средства, как раз позволяющие работать с ними с заметной латентностью.
Насчет iOS — имеется в виду «пользовательская» однозадачность — то есть в один момент времени только одно приложение может иметь интерактив с пользователем (показывать ему свой экран и принимать от него события). Внутри системы процессов может быть множество — иначе невозможно было бы ни пакетами по сети обменяться, ни музыку в фоне послущать.
Насчет управления памятью для RTOS — под этим редко подразумевается виртуализация и/или защита памяти — в отличие от больших ОС, все процессы RTOS априори а) дружественны друг другу, т.к. системы реального времени обычно замкнутые — в них нельзя загрузить и запустить произвольный процесс, и б) отдельные процессы представляют собой части одного и того же программного модуля, соответственно вопросы загрузки и настройки адресов в большинстве случаев тоже отпадают. Кроме того, управляющие системы реального времени желательно строить с неизменяемым сегментом кода для увеличения детерминированности поведения при обработке непрогнозируемых отказов аппаратуры (например, срабатывании вотчдога или пропадания питания в произвольный момент)
Насчет «многозадачность мне не нужна» — если Вам нужны прерывания — вам в 99% случаев нужна и многозадачность. Вопрос в парадигме реализации обработки системой асинхронных событий (а физический мир всегда асинхронен по отношению к работающей МК системе) — то есть если нет встроенных средств поддержки многозадачности ИЛИ нужна оперативная реакция на прерывания с лимитированным временем ответа и джиттером — тогда да, ограничиваемся просто обработчиком.
Если же ядро такие средства имеет, и величина латентности/джиттера допустима — строим на основе потоков и обмена сообщениями.
Последний способ гораздо менее привязан к конкретной аппаратуре, и соответственно, более понятен, гибок, переносим. Заметьте, что подавляющее большинство периферийных устройств современных SoC имеют встроенные аппаратныее средства, как раз позволяющие работать с ними с заметной латентностью.
Насчет iOS — имеется в виду «пользовательская» однозадачность — то есть в один момент времени только одно приложение может иметь интерактив с пользователем (показывать ему свой экран и принимать от него события). Внутри системы процессов может быть множество — иначе невозможно было бы ни пакетами по сети обменяться, ни музыку в фоне послущать.
Насчет управления памятью для RTOS — под этим редко подразумевается виртуализация и/или защита памяти — в отличие от больших ОС, все процессы RTOS априори а) дружественны друг другу, т.к. системы реального времени обычно замкнутые — в них нельзя загрузить и запустить произвольный процесс, и б) отдельные процессы представляют собой части одного и того же программного модуля, соответственно вопросы загрузки и настройки адресов в большинстве случаев тоже отпадают. Кроме того, управляющие системы реального времени желательно строить с неизменяемым сегментом кода для увеличения детерминированности поведения при обработке непрогнозируемых отказов аппаратуры (например, срабатывании вотчдога или пропадания питания в произвольный момент)
0
С сайта micrium.com взял, но кто управляет колесами, не вполне ясно, так что, возможно, что Ваше замечание правильное. Но Micrium uC/OS-II на Марсе есть, это факт. По крайней мере, управляет аналитическими лабораториями SAM.
www.micrium.com/curiosity
www.micrium.com/curiosity
0
Из Вашей ссылки следует, что 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
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
0
можно здоровую критику?
помоему конструкция излишне сложная… можна написать проще:
то есть промежуточная константа text1 просто не нужна!
. . .
;---- первый способ
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 просто не нужна!
0
Можно любую критику, всегда полезно.
Согласен с Вашей правкой.
Я этот пример сам не писал, это был текст Hello World на языке C.
В ADS1.2 подвел курсор к файлу Hello.c, нажал правую кнопку мыши, выбрал «дизассемблировать». Вот и получил тот самый текст на Ассебмлере. Далее, его можно править вручную, заодно проверить можно, насколько эффективно работает компилятор с языка C.
Для RT-210 всё еще проще. Там программа пользователя загружается вниз памяти (0x20000000) и вызывается как подпрограмма. Не надо указывать никаких лишних адресов, как в StartOS.
Текст программы:
В проект надо только включить второй файл, StartOS.c с определениями функций. Если на него не смотреть, то он вообще не отвлекает внимание от главного кода проекта.
Согласен с Вашей правкой.
Я этот пример сам не писал, это был текст Hello World на языке C.
В ADS1.2 подвел курсор к файлу Hello.c, нажал правую кнопку мыши, выбрал «дизассемблировать». Вот и получил тот самый текст на Ассебмлере. Далее, его можно править вручную, заодно проверить можно, насколько эффективно работает компилятор с языка C.
Для RT-210 всё еще проще. Там программа пользователя загружается вниз памяти (0x20000000) и вызывается как подпрограмма. Не надо указывать никаких лишних адресов, как в StartOS.
Текст программы:
void Main(void)
{
Print_String (20, 150, "Hello, World!");
}
В проект надо только включить второй файл, StartOS.c с определениями функций. Если на него не смотреть, то он вообще не отвлекает внимание от главного кода проекта.
+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Компактная ОС для ARM процессоров