Pull to refresh

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

Reading time 3 min
Views 16K
В последнее время я часто встречаю о самых разных устройствах, работающих на процессорах с архитектурой 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 разработке вообще и в частности.
Tags:
Hubs:
+49
Comments 86
Comments Comments 86

Articles