Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

30 Часть I. Общие принципы устройства и функционирования Atmel AVR в зависимости от модели, составляет от 64 до 256 байтов). Страница может про- граммироваться только целиком. Число циклов перепрограммирования достигает 10 тысяч. С точки зрения программиста память программ можно считать построенной из от- дельных ячеек — слов по 2 байта каждое. Устройство памяти программ (и только этой памяти!) по двухбайтовым словам — очень важный момент, который нужно твердо усвоить. Такая ее организация обусловлена тем, что бо´льшая часть команд в AVR имеет длину ровно 2 байта. Исключение составляют команды JMP , CALL и некоторые другие (например, LDS ), которые оперируют с 16-разрядными и более длинными адресами, — длина этих команд равна четырем байтам, и они встреча- ются лишь в моделях с памятью программ объемом свыше 8 кбайт (подробнее об этом рассказано в главе 6 ). Во всех остальных случаях счетчик команд сдвигается при выполнении очередной команды на 2 байта (одно слово), поэтому необходи- мую емкость памяти легко подсчитать, зная число используемых ассемблерных команд (вот еще один плюс ассемблера в сравнении с языками высокого уровня). Абсолютные адреса в памяти программ (указываемые, например, в таблицах векто- ров прерываний в техническом описании МК) также отсчитываются в словах (а не в байтах!), что нужно учитывать при прямом обращении к памяти программ. З АМЕТКИ НА ПОЛЯХ Приведем пример интересного случая адресации, который представляет команда для чтения констант из памяти LPM (а также ELPM в МК с памятью программ 128 кбайт и более). Эта команда подразумевает чтение по байтовому адресу, указанному в двух старших РОН (образующих т. н. регистр Z , см. об этом далее). Однако, чтобы не на- рушать «чистоту» концепции организации памяти программ по словам, разработчики решили этот вопрос следующим образом: в описании команды указано, что старшие 15 разрядов регистра Z адресуют слово в памяти, а младший разряд выбирает млад- ший или старший байт этого слова (при равенстве разряда 0 или 1 соответственно). Легко, однако, заметить, что байтовая и пословная организации памяти при таком подходе полностью эквивалентны. Последний адрес существующего объема памяти программ для конкретной модели обозначается константой FLASHEND . По умолчанию все контроллеры AVR всегда начинают выполнение программы с адреса $0000 1 . Если в программе нет прерыва- ний, то с этого адреса может начинаться прикладная программа. В противном слу- чае по этому адресу располагается т. н. таблица векторов прерываний , подробнее о которой мы будем говорить в главах 3 и 6 . Здесь укажем лишь, что по умолчанию первым в этой таблице (по тому же адресу $0000 ) почти всегда размещается вектор сброса RESET , который указывает на процедуру, выполняющуюся при сбросе МК (в том числе и при включении питания). 1 В ассемблере AVR можно обозначать шестнадцатеричные числа в «паскалевском» стиле, предваряя их знаком $ , при этом стиль языка С (0x00) тоже действителен, а вот «интеловский» способ (00h) не работает. В тексте книги мы будем пользоваться в основном «паскалевским» способом из-за его крат- кости. Подробнее об обозначениях чисел различных систем счисления в AVR-ассемблере рассказано в приложении 1 .

RkJQdWJsaXNoZXIy MTExODQxMg==