Анатолий @longtolik
Пользователь
Information
- Rating
- 8,699-th
- Location
- Россия
- Registered
- Activity
Specialization
3d Modeler, Neurochip application
From 10,000 €
Assembler
C
Programming microcontrollers
Embedded system
Arm Architecture
RISC-V
Real-time operating system
Electronics Development
Development of printed circuit board
Согласен с Вашей правкой.
Я этот пример сам не писал, это был текст Hello World на языке C.
В ADS1.2 подвел курсор к файлу Hello.c, нажал правую кнопку мыши, выбрал «дизассемблировать». Вот и получил тот самый текст на Ассебмлере. Далее, его можно править вручную, заодно проверить можно, насколько эффективно работает компилятор с языка C.
Для RT-210 всё еще проще. Там программа пользователя загружается вниз памяти (0x20000000) и вызывается как подпрограмма. Не надо указывать никаких лишних адресов, как в StartOS.
Текст программы:
В проект надо только включить второй файл, StartOS.c с определениями функций. Если на него не смотреть, то он вообще не отвлекает внимание от главного кода проекта.
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
www.micrium.com/curiosity
Но там такой код на С, что переписать на ассемблер не сложно, одни записи/чтения регистров, пересылки, и немного вычислений.
Код из текста на С получается очень компактный, это хорошо видно, если какой-то файл программы дизассемблировать.
Вкратце, для S3C2440A (Mini2440) были сложности, программа стартовала в режиме пользователя (User), система вызывалась в режиме SVC (привилегированном), прерывания из программы пользователя не работали, пришлось менять режим в программе обработки. Потом другая проблема, системные вызовы в одном варианте работали, в другом -не работали в пользовательской программе обработки аппаратных прерываний.
Пришлось применить стандартный подход, такой, что подпрограмма обработки прерывания должна быть короткой, она устанавливает флаги, о том, что произошло и выходит. Потом программа пользователя в спокойной обстановке анализирует флаги, приоритет событий и предпринимает нужные действия.
Для S5PV210 (Mini210s) всё проще, система в режиме User, программа позьзователя в режиме User, вызовы системы в режиме SVC. Мощная система векторных прерываний позволяет устанавливать адреса тремя способами.
Другая проблема, что адреса Reset, IRQ (FIQ) возможно менять легко, а вот поменять адрес SWI было непросто весьма и весьма.
Но, практика — критерий истины, работают прерывания и от таймеров, и от портов, и от другого.
Вот пример — вывод звука через таймер и ШИМ. Программа обработки сама все делает, независимо от основной, (вроде, как в учебнике).
а вот строк помещается около 130 при высоте шрифта 8 пунктов (в зависимости от среды программирования)
Подробнее можно узнать на форуме FriendlyARM
www.friendlyarm.net
С ADS1.2 тоже интересно, она идет в комлекте с платой на диске, люди интересовались, как ее получить легально, но так и не нашли ответа. Но она очень удобная.
Если программы небольшие, то, кажется, до 32 кБайт IAR (или Keil тоже) позволяют бесплатно использовать.
Сделайте, пожалуйста, что-то подобное, снабдите правильными примерами, без goto, хорошо структурированными, а мы — поучимся и даже критиковать не будем, только поапплодируем.
Еще так говорят: «отрицая — предлагай!». Подскажите, что применить для вызова системных подпрограмм из программы пользователя, когда разница в адресах больше 26 МБайт (больше в коде команды перехода не помещается, там ведь еще и код команды кроме адреса).
Современный подход мне не нравится, программы надо предустанавливать, вместо того, чтобы загружать в память и выполнять. Windows, Linux, Android занимают с добрую половину памяти, работают медленно, не в реальном времени, а программу пользователя отодвигают на второй план.
Пользователи бывают очень разные, кому-то понятнее goto (while тоже в примерах есть). Тут уж, как говорится, «дурак не заметит, а умный поймет».
Стандартный оператор printf занимает очень много памяти, еще и сбоит в работе, поэтому в платах Samsung для Linux его переписали, заменив своим.
Кстати, насчет «корявости» кода, просмотрев множество текстов для Linux и фирменных Samsung, вот тут уж — слов нету просто. StartOS содержит порядка 6000 строк кода, компилируется в загрузочный файл менее 32 КБайт (вполне себе эффективно), и главное — работает.
Еще посмотрите исходные коды на TCP IP Stack, там то байты, то 16-тиричные константы, то 32-битные слова, вот его покритикуйте…
Насчет «нерекомендования», боюсь, Вы опоздали, люди всё это уже используют (да еще и хвалят). И порекомендуйте своё, что-нибудь хорошее.
Напоследок, я — инженер-электрик по специальности «электропривод и автоматизация промышленных установок», в 1983 году столкнулся с применением микропроцессоров. Кстати, чего плохого в DEC? Реентерабельность, реккурентные вызовы подпрограмм, сопрограммы, трюки на ассбемблере, где они все сейчас, среди перлов и питонов?
Но это не помешало мне стать лауреатом Первого всесоюзного конкурса самодеятельных программистов СССР со своим «Программным синтезатором речи». Это я насчет давления авторитетом.
Хочу — сделаю себе ОС, хочу — свои библиотеки и свой компилятор текста в двоичный код, назову операторы тоже как хочу, кто мне запретит.
Самомодифицирующиеся программы — вот моя цель, и для этого нужен полный контроль над железом, а не работа в песочнице, к чему нас подталкивают.
Извините за длинный ответ
Чемберлену, вопрос тоже не был коротким.А вообще, это здорово, что такая критика и обсуждение, всем — успехов!
В StartOS ноу-хау является драйвер для программных прерываний и всего-то. Почему-то классические программные прерывания не применяются на практике (не видел). А сама технология подробно расписана на сайте холдинга ARM, но, как водится, их примеры не работоспособны. Что бы стать разработчиком, как я понял, надо ехать к ним на платные курсы.
FriendlyARM вообще сделала проприетарные экраны с обменом по одному проводу, пришлось их протокол просто тупо хакнуть.