Немного о архитектуре процессоров ARM7TDMI

    В последнее время я часто встречаю о самых разных устройствах, работающих на процессорах с архитектурой ARM. В этой статье я хочу начать рассказ о архитектуре процессоров ARM7TDMI (не путать с ARMv7). ARM7TMI — это довольно таки устаревшее семейство, но оно довольно таки широко используется в разных embedded устройствах. Так как моя работа очень плотно связанна с разработкой таких устройств — то я довольно неплохо ориентируюсь именно в этом семействе. Но если кому-то будет интересно — могу рассказать и о более новых семействах ARM.



    Общее описание


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

    ARM7 с одной стороны довольно таки прост (особенно по сравнению с x86), с другой стороны — имеет большую производительность и меньшее энергопотребление. Но меньший набор команд и тот факт, что длинна команды фиксирована приводит к увеличению объема программ.

    Отличия от x86


    Надеюсь, многие из читающих эту статью хотя бы в общих чертах знают архитектуру x86 :)
    Чем же ARM7 отличается от x86?

    Регистры

    ARM имеет 32 регистра длинной 32 бита. На самом деле одновременно доступно только 16 из них. Остальные регистры переключается вместе с режимами процессора. Все регистры совершенно одноправны (сравните с x86, где даже регистры общего назначения имеют разные свойства). Правда один из регистров, r15, используется как счетчик инструкций (program counter), у него даже есть псевдоним — pc. Так что очевидно, что его не стоит использовать в качестве регистра общего назначения :)
    Другой регистр, r14 используется как указатель стека (stack pointer) и имеет псевдоним sp. Но его никто не мешает использовать как обычный рабочий регистр, если вам вдруг совершено не нужен стек. Хотя и это и не рекомендуется.
    Третий регистр, r13 по соглашению хранит адрес возврата из текущей функции. Точно и как и предыдущий регистр его можно использовать как рабочий.
    Остальные 13 регистров программист (правда, чаще — компилятор) может использовать как хочет.
    Плюс, есть ещё 2 выделенных регистра состояния процессора. На самом деле один и тот же регистр, просто одна его ипостать содержит сохраненные данные после переключения режима.

    Режимы работы

    Процессор может работать в 7 разных режимах: User, FIQ, IRQ, Supervisor, Abort, System, Undefined. 4 из этих режимов (FIQ, IRQ, Undefined, Abort) слушат для обработки исключительных операций — обработка быстрого прерывания, обработка обычного прерывания, попытка выполнить неизвестную инструкцию, попытка обратиться к несуществующей области памяти (или по невыровненому адресу). Режимы Abort и Undefined позволяют сделать эмуляцию инструкций сопроцессора и добавить поддержку виртуальной памяти соответственно.
    Остальные три режим служат для защиты операционной системы от прикладных программ.
    Любопытно что все режимы (кроме System) имеют свои регистры r13 и r14. Таким образом при переключении режимов нет надобности сохранять значения вершины стека и адрес возврата.

    Набор команд

    Процессор поддерживает два набора команд — ARM и Thumb (а модификация ARM7EJ-S ещё и команды для аппаратного ускорения java). Основная разница между ARM и Thumb — это длинна команда. В первом случае она составляет 32 бита, в другом — 16. Программы на Thumb в среднем занимают меньше места, но и дольше выполняются.
    Основные отличия команд ARM от x86 таковы:
    • все операции над данными происходят только в регистрах. Нельзя модифицировать данные в памяти
    • с памятью работают только команды пересылки данных. Возможна передача данных регистр-память, память-регистр и регистр-регистр
    • каждая команда имеет модификаторы условного исполнения. Т.е. можно делать не только условный переход, но и например условную пересылку или сложение.


    Прочее


    Есть ещё много отличий, например таких как отсутствие команд для работы с числами с плавающей точкой, команд для работы с десятично -двоичными числами, запрет на обращения к невыравненым адресам в памяти, расширения DSP и Jazelle, отсутствие портов ввода-вывода (вся периферия мапится в память), только линейная адресация (хотя при наличии MMU можно переключать страницы), хитрые модификаторы команд пересылки для использования битовых сдвигов.

    В общем, если кому-то будет интересно — могу рассказать подробнее об АРМах, конкретно о процессоре AT91SAM7x, о embedded разработке вообще и в частности.
    Поделиться публикацией
    Комментарии 86
    • НЛО прилетело и опубликовало эту надпись здесь
        0
        маловато будет! давай ещё.
          0
          Да без проблем. А очем конкретно? Например, расписывать все команды — толку нет.
          Хотя, могу пройтись подробно по режимах работы.
            0
            ну асм x86 знаете? вот сравнить бы на чём нибудь реальном.
              0
              например
              * где можно применять и как,
              * конкретные преимущества перед x86 на конкретных задачах
              * с чего начать в случае своего дела.

              Спасибо!
                +3
                где применять? Там где не важна очень большая скорость работы, зато важны размеры и энергопотребление. От СВЧ-печей до телефонов и нетбуков (правда тогда надо ставить всё же не древний ARM7 а что-то вроде Cortex-R3).
                Преимущества? Цена, размеры, энергопотребление. Да и для х86 нужен целый чипсет, а микроконтроллеры с АРМ — вещь в себе. Подпаял кварц, подал питание, и всё, он работает :)
                С чего начинать? С поиска схемотехника и программиста :) Один будет проектировать и разводить платы, второй — программировать всё это счастье.
                  0
                  я имел ввиду содержание следующего топика :)
                    0
                    Не могли бы дай какие-нибудь ссылочки для базовых знаний, видел множество всяких плат типо конструктора, интересно как их объединяют и т д. Очень хочется собрать роутер с мощным процессором, низким энергопотреблением, а подключить к нему hdd вообще сказка.
                    С чего начать изучение?
                  0
                  Примеры кода, например. У Интел в книжках есть красивые схемки, вот примерно такое было бы не плохо. О конвеере, о логических блоках… =)
                    0
                    «ARM для чайников» было бы очень круто. Например, в этой статье было кое-что непонятно, использовались спецтермины. Я бы с огромным удовольствием почитал то же самое, но значительно подробней, чтобы потом знать о чем идет речь :)
                      0
                      Ну я уже решил, что следующая статья будет про самое начало — как АРМ запускается. И как его запустить. С одной стороны — это довольно хардкорно, с другой стороны — если более менее заниматься такими штуками, то это надо знать.
                      А какие термины были непонятны? Постараюсь в следующий раз более подробно расписать.
                        0
                        Да, было бы интересно почитать про запуск АРМа с нуля, на конкретном примере, инициализация периферии там и т.п.
                        0
                        Термины… ну термины были непонятны практически все)) Наборы инструкций, режимы работы — тут есть баланс между «мне настолько это важно, что я по каждому из них прочту большую статью википедии на английском» и «вообще не интересуюсь этим». Я (и, думаю, не только я) где-то посерединке, на уровне «классно было бы прочесть эти коротенько в статье, но если не прочту — что ж, смысл моей жизни не в этом». Как-то так))
                  0
                  > могу рассказать подробнее
                  Наиболее полезен не рассказ вообще, а живой опыт и решение проблем — то, чего в книжках не прочитаешь.
                  Но в данном случае статья как познавательное чтиво — понравилась. (Впрочем, сам имел опыт на них, поэтому интерес номинальный.)
                    0
                    Хм. Опыт какого плана? Как поставить и настроить toolchain? Как запустить плату? Как программировать ту или иную периферию?
                      0
                      Меня бы интересовал опыт — в каких средах программировалось, насколько сложно запустить, методики отладки, если были. В общем, что-то вполне практичное с конечными цифрами затрат (времени, сборки, работ, копания в документации; последнее больше всего утомляет).
                        0
                        Да. Вообще, мне лично очень интересен опыт:
                        1. Как получить нечто работающее на ARM
                        2. Как это начать программировать

                        Можете написать рук-во по типу, берем железку, запускаем ее, пишем hello world.

                        За статью спасибо, очень интересно, для меня очень понятно, но у меня профильное образование. В принципе мне проще datasheet скачать если что непонятно. Да. И слово длина с одной н пишется (два раза в тексте ошибка)
                      +1
                      Эх, помнится патчил Samsung C100 в далёкие школьные времена. IDA, ARM, Thumb, 3 часа ночи…
                        +1
                        у меня Сименс, ИДА, Арм, Тумбы, ну и теже 3 часа ночи))
                          0
                          SE k750, IDA, Thumb :) Кстати, первый скрипт под иду как раз тогда и написал :)
                        0
                        имеет большую производительность и меньшее энергопотребление
                        смотря как мерять, если просто как числодробилку, x86 имеет большую производительность :)
                          +1
                          Ждем: «могу рассказать подробнее об АРМах, конкретно о процессоре AT91SAM7x, о embedded разработке вообще и в частности.» :)
                            0
                            AT91SAM7x — это всетаки ARM7TDMI и архитектура ARMv4T
                              0
                              Ну да. Я и писал, что это ARM7, не путать с ARMv7 :)
                                0
                                я и не путаю, есть разница между ARM7 (ARMv3) и ARM7TDMI (ARMv4T)
                                  0
                                  Да, действительно, это я напутал, прошу прощения.
                                  Исправлю заголовок статьи, что бы было понятней
                              0
                              Расскажите, пожалуйста, о средах программирования, компиляторах, программаторах, о семействах процессоров…
                              //Сам никак не перейду с авр-ок на арм.
                                0
                                Еще было бы интересно узнать о поддержке USB и HID девайсах =)
                                  +1
                                  Ну тот же AT91SAM7X512 с которым я обычно работают поддерживает Full USB. Есть куча примеров и библиотек от Atmel с HID, устройствами хранения, CDC, и т.д…
                                  Правда, только в режиме Slave. Но есть контроллеры, которые могут работать и мастером.
                                    0
                                    AT91SAM7X512 — хорошая вещь. Можно поинтересоваться, что именно на нём делаете?
                                      +2
                                      У, что мы на них только не делали: POS-терминалы пополнения счетов, Watchdog таймеры для киосков самообслуживания (там конечно можно было применить не столь крутой контроллер, но экономически разницы никакой, а унификация рулит), кассовые аппараты, всякие полупромышленные агрегаты…
                                      Просто, за годы работы устаканился некоторый общий дизайн плат, свой набор драйверов для периферии и теперь на основе этого можно очень быстро делать почти что угодно :)
                                  +2
                                  Ну если кратко, то из компиляторов два варианта: или gcc или Keil. Первый бесплатный, но генерит не такой маленький код, второй платный, имеет с собой две стандартных библиотеки (совсем стандартную и облегченную, маленькую), своё ядро RTOS, TCP/IP стек, файловую систему.
                                  Конечно, есть бесплатные аналоги для всего этого, но там нужно приложить куда больше усилий по допиливанию до рабочего состояния.
                                  Среды можно использовать самые разные. У нас например используют MSVS или Emacs. У Keil есть своя среда, но там неудобный редактор кода.
                                  Прошивать можно по USB, JTAG, FFPI или написать свой бутлоадер и заливать прошивки хоть через сетку.
                                    0
                                    фирменный ARM-овский компилятор не посчитали? =)
                                      0
                                      эээ… Насколько я знаю — Keil и ARM объединились и теперь кейловский стал официальным АРМ компилятором, а старый АРМовский больше не поддерживается.
                                        0
                                        точно. не знал что RVDS их детище.
                                      0
                                      А для линуха есть среды? =)
                                        0
                                        Ну… emacs, vim, eclipse :) На самом деле — любая программа, которая может запустить make и красиво распарсить результат. Все равно мы обычно дебажим через RS232, диангностическими сообщениями. Есть ли графические дебаггеры, поддерживающие JTAG — не знаю, честно говоря.
                                          0
                                          img505.imageshack.us/img505/8531/eclipsegdbopenocddi5.png

                                          скрин с моего ноута, правда под виндой но все тоже можно организовать на линуксе
                                            0
                                            Есть, конечно. Для вышеупомянутого AT91SAM7X256, X512 есть среда разработки IAR Embedded Workbench for ARM, JTAG-отладка работает через приблуду MT-LINK.
                                          0
                                          А нафига свой бутлоадер если есть U-boot?
                                            0
                                            Свой круче :) Наш занимает 16кб, при этом позволяет обновлять прошивку через RSR232 и с внешней DataFlash. Второй вариант занимает 32 кб, но кроме всего этого понимает прошивки шифрованные ГОСТ28147 и умеет проверять MAC-подпись, что не позволит залить в процессор левый код.
                                              0
                                              Сурово :)

                                              Мне по работе и u-boot хватает
                                                0
                                                если я правильно понял — u-boot грузит только линукс. А у нас монолитная прошивка с real-time ядром, которая в общем может и сама стартовать, без загрузчика. Загрузчик по большому счету нужен только для обновления прошивки.
                                                  0
                                                  Еще круче :)

                                                  Это тоже неплохая тема для статьи, что помимо линукса можно крутить на ARM, с примерами из практики
                                                0
                                                RS232


                                                Xmodem?
                                                  0
                                                  Свой самописный протокол, который ползает от одного проекта к другому.
                                                    0
                                                    А вот это уже не айс. Тоже ваяли свой протокол (SBBP — small binary block protocol), довели до стадии релиза и отложили на полочку. Наши суровые товарищи прилюбили REXX под зоком, посему хмодем вырулил.
                                                    SBBP:
                                                    хэндшейк
                                                    код операции
                                                    датаблок (если необходим) с номером и контрольной суммой
                                                    хэндшейк
                                                    контрольная сумма операции.
                                            +2
                                            хм, Хабр куда-то скушал мой комментарий :/
                                            Ладно, если в кратце — то компиляторов есть два: gcc и Keil. Со вторым так же может поставляться среда (с неудобным редактором кода), стек TCP/IP, ядро RTOS, драйвер FS и ещё какая-то вкуснятина. С gсc конечно ничего такого не поставляется, зато он бесплатен, и есть бесплатные аналоги всего того, что я перечислил выше.
                                            Правда, gcc генерит более объемный и медленный код. Зато там более гибкие скрипты линковщика :) В общем везде есть свои плюсы и минусы.
                                            Из IDE мы используем MSVS или Emacs.
                                            Прошивать удобней всего через самописный бутлоадер. Хотя есть варианты через USB, JTAG, FFPI, последовательный порт (это если говорить о AT91SAM7X).
                                              +1
                                              черт, теперь их стало два. Хабрахабр, отпусти меня…
                                              0
                                              Хочу сделать статью на эту тему
                                              +1
                                              Такого типа проц есть в телефона сониэриксон начиная с к750 серии, и под этот проц написана, точнее портирована замечательная вещь под названием эльфлоадер, который добовляет программных возможностей телефончегу)) если кому интересно то гуглите или могу статейку навять по этому поводу)
                                                0
                                                интересно.
                                                хотим статью )))
                                                  0
                                                  на днях будет
                                                +1
                                                Граммарнаци негодуэ. Куча опечатков, окончания прилагательных и сущестительных несинхронизированы.

                                                «Для использования бытовых сдвигов» — что имеется ввиду?
                                                  0
                                                  прошу пардну. Спеллчекером вроде проверил, но надо было ещё нормально вычитать :(
                                                  Как «битовых» превратилось в «бытовых» — до сих пор понять не могу :)
                                                    0
                                                    Кстати, у нас в городе есть магазин «бИтовая химия»-огромная вывеска весит напротив загруженной дороги… года четыре висит…
                                                  +1
                                                  Продолжайте, только с картинками, пожалуйста ;)
                                                    +3
                                                    Уиииии! Как раз начал заниматься вплотную с arm-devboard. Можно позасыпать Вас многоуважаемый автор вопросами?

                                                    Итак, я пришел в мир ARM с платой mini2440. www.friendlyarm.net/products/mini2440
                                                    Как видно из даташита её сердце — S3C2440A ARM920T. Очень, очень впечатлен возможностями этого девайса за 85$.

                                                    Теперь вопросы: собрал ядро Linux которое дает вендор, вроде все работает но как-то непонятно с драйверами под мои девайсы (USB-Wifi), их надо кросскомпилить пробовать из обычного ядра? Юзаю gcc-arm других же вариантов нет?

                                                    Очень, просто катастрофически интересует возможность запускать Java код на этом звере. Поиски увенчались ссылками на малопонятные сторонние (не Sun) JVM которые совместимы со старыми версиями языка… Есть ли какое-то mainstream решение? Ну или хотябы с внятными инструкциями как это скомпилить/запустить?

                                                    И еще вагон и маленькая тележка вопросов, но позже и если Автору будет интересно.

                                                    Заранее огромное спасибо, от этой инфы зависит моя диссертация :)

                                                      0
                                                      Ах да, ну и конечно! Яростно плюсую где только можно и жду новых постов :)
                                                        +1
                                                        ээ, к сожалению с ARM9 ещё не успел поработать. У нас как раз скоро должен начаться проект на таком девайсе. С Линуксом на борту, и т.д. Поэтому ответы будут опираться на логику и предыдущий опыт :)
                                                        Драйвера под девайсы должны нормально скомпилироваться из обычного ядра, если вендор не сильно переколбасил USB стек. Я бы вообще советовал попытаться собрать ванильное ядро под ваш процессор. Получите много опыта, и, надеюсь, много фана :)

                                                        gcc-arm — это скорее всего единственная альтернатива. Можно попытаться с Keil armcc, он поддерживает некоторые расширения GNU, но возможно будут проблемы с линковкой, если вообще соберется. В общем, лично я не стал бы заморачиваться.

                                                        Вот насчет java не знаю совсем… С одной стороны этот процессор вроде бы поддерживает jazelle. Но есть ли какие-то свободные реализации java-машин с поддержкой этой технологии — мне неизвестно.

                                                        Могу помочь с конктретными вопросами по железу, если такие возникнут.
                                                          0
                                                          ООоо! Линукс это интересно))
                                                            0
                                                            Спасибо за ответы :) Много фана не перестаю получать :) уже пробовал и собрал андроид под эту железку :)

                                                            А что есть jazelle с практической точки зрения, судя по тому что я прочитал — возможность исполнять байт-код прямо на проце… Но как это увязать с осью (Linux например)?
                                                            0
                                                            Дружище, где купил? Я своего друга-электронщика хочу тоже на ARM пересадить, а то он всё на AVR, хотя я его уже пересадил на gcc с нормальным С :-) Я думаю, что когда он этот дивайс увидиииит…

                                                            Про яву — gcj не смотрел? Насколько я знаю, в Debian есть все пакеты под ARM, gcj по идее тоже должен быть.
                                                              0
                                                              Купил на e-bay, дабы не сочли за рекламу — могу в личку сказать у кого конкретно.
                                                              gcj посмотрел — но это кажется не то, что мне надо. Мне JVM нужна, а не способ компилить Java в родные бинарники.
                                                                0
                                                                Да, я уже нарыл на ибее за 85, если не секрет — у кого брал? Другу уже показал, в экстазе.

                                                                gcj — компилит в байткод, к нему же и jre имеется, всё в репах. Т.е. он «и бинарники» может, а не «только бинарники».
                                                              0
                                                              STN Displays:
                                                              4 bit dual scan, 4 bit single scan or 8 bit single scan display type
                                                              monochrome, 4 gray levels, 16 gray levels, 256 colors or 4096 colors
                                                              Max: 1024x768, 4096 colors

                                                              У меня глаза на орбитах, ни#ига себе экранчик 0_0
                                                                0
                                                                Да, многие ARM9 идут со встроеным контроллером цветного графического экрана, аудиокодеком, контроллерами флеш-карточек и прочими вкусностями. При чем совсем за смешные деньги. Думаете, на чем китайцы клепают свои дешевые телефоны? :)
                                                                  +1
                                                                  Спрашивается, че я на AVR сижу?))
                                                                  У них, вроде, лозунг был/есть «32 битные мк по цене 8 битных avr»… мда.
                                                                  Какой посоветуете стартовый набор? =)
                                                                    0
                                                                    Ну на ARM9 надо распаивать внешнюю память. Да и плату четырехслойную разводить… Сложно очень :)
                                                                    С ARM7 в этом плане проще — ему кроме питания и кварца вообще ничего не надо. Но и возможностей там поменьше… Причем, некоторые AVR32 и AVRUSB его, кажется, догоняют по возможностям.
                                                                    Про стартовый набор ничего не скажу, ибо не видел ни одного :) Хотя, атмеловские кажется хороши.
                                                                    Просто мне в руки всегда попадают уже разведенные и распаяные платы, которые потом идут в производство. Вот прямо на них и экспериментирую.
                                                                0
                                                                Недорогая макетка — AT91SAM7X.
                                                                  0
                                                                  Попробуйте OpenJDK, у меня была пара домашних сервачков (Sheeva Plug и Dream Plug ) от Global Scale, они вроде бы тоже на ARM проце, и на них под OpenJDK даже Tomcat c парой-тройкой веб-приложений вполне запускался.
                                                                  0
                                                                  Очень интересно узнать больше!
                                                                  В какой момент переходить с микроконтроллера на ARM, какие контроллеры и каких призводителей выбирать, на чем писать, как отлаживать, и т.д.
                                                                    0
                                                                    Ну как бы ARM7 (в отличие от ARM9, например) — тот же микроконтроллер, вещь в себе. Правда побольше и помощнее :)
                                                                    Насчет производителей… почему-то обычно выбирают Philips (серия LPC). Но мы остановились на атмеловских. В сущности разница небольшая, как мне кажется.
                                                                    Про «писать и отлаживать»- я постараюсь написать развернуто позже.
                                                                      0
                                                                      Если можно затроньте, пожалуйста, и Java.
                                                                        0
                                                                        вот о java к сожалению ничего не расскажу. Так вышло, никогда не работал с ней. В тех камнях, что мы используем просто негде развернуться с ней.
                                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                                    +1
                                                                    О! Смотрите, что я нашел!
                                                                    Оказывается для ARM'a можно писать на C# прямо в MS Visual Studio.
                                                                    Нужен .Net Micro Framework
                                                                    Поддерживаются ARM'ы, начиная с ARM7 с 64KB RAM, 256KB Flash на борту.
                                                                    Про этот фрейворк и книжка есть: Expert .NET Micro Framework By Jens Kuhner

                                                                    Это становится все более интереснее и интереснее ;)
                                                                      0
                                                                      Уже и девборды давно есть — даже фронтмен в мелких однокристальных армах — NXP — на днях выпустил готовое решение, под которое можно писать прям в VS.
                                                                      Эдакий Arduino для взрослых =)
                                                                    0
                                                                    По поводу скорости выполнения команд ARM и Thumb, хотелось бы заметить, что возможны варианты и связаны они с флеш памятью на чипе (конечно если вы не подгружаете в оперативную память). Бывает что флеш на кристалле соединен с ядром 16-битной шиной, тогда чтение команд Thumb в два раза быстрее чем ARM, соответственно и скорость исполнения может оказаться выше.

                                                                      0
                                                                      p.s. про компилятор от IAR почему-то все дружно забыли, у них и среда разработки и библиотеки и средства отладки есть.
                                                                      0
                                                                      Есть идея собрать свой NAS на базе ARM с Linux, скорее всего Gentoo или Debian на борту.
                                                                      Когда-то у меня были DreamPlug и SheevaPlug, которые себя неплохо зарекомендовали.
                                                                      Мысль собрать что-то аналогичное, только с RAID 1 и более заточенное под функции NAS.
                                                                      Не знаю с какой стороны к этому проекту вообще подходить.
                                                                        0
                                                                        Ну тут зависит от того — делать самому с нуля, или взять готовую плату. Если делать с 0 то здесь будет множество проблем: правильно развести схему, изготовить сами платы ( а они обязательно будут многослойными), расспаять всю электронику… Это практически невозможно сделать дома.

                                                                        Если брать готовую плату — то тут всё намного проще. Все производители выпускают сборки Линукса для своих плат. Нужно будет просто доточить её под свои требования. В принципе, всё то же самое, что и с десктопным линуксом.
                                                                          0
                                                                          Лучше, конечно, взять готовую. Вот только не совсем пойму какую и как к этому вопросу подойти.

                                                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                      Самое читаемое