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

128 Часть 11. Программирование микроконтроллеров АVR на ассемблере директивы . dЬ, будет помещено в область EEPROM, начиная с нулевого адреса. Если директивой . org этот нулевой адрес не указывать, то размещение будет осу­ ществлено все равно с него, за исключением случая, когда где-то еще в тексте ранее встречалась директива . eseg, - тогда размещение произойдет по порядку адресов. Отметим, что содержимое EEPROM для контроллеров АVR предлагается загру­ жать через отдельный файл того же формата (*. hex), что и для кода программы, но с расширением .еер . Для того чтобы такой файл создавался при наличии директивы . eseg в коде программы, требуется указать специальную опцию компилятора, тогда строка в нашем ВАТ-файле (см. разд. « Обустройство ассемблера» главы 5) будет выглядеть так: c : \avrtools\avrasm32 -е % 1 . еер -f I % 1 . asm В этом случае в той же папке, где находится аsm-файл, дополнительно создаст­ ся файл с расширением .еер, который будет содержать данные для загрузки в EEPROM. Если директива . eseg в тексте программы не встречается, то в создан­ ном ·еер-файле данных не окажется, и компилятор удалит его по окончании процес­ са, сообщив вам об этом. Для размещения данных в SRAM есть директива . dseg. Специальных опций ком­ пилятора указывать в командной строке тут не требуется, зато почему-то данные по директиве . dseg помечаются не директивой . dЬ (или . dw), а . byte, которая имеет иной синтаксис, - после нее должна идти константа, указывающая число резерви­ руемых байтов. Других параметров не допускается, потому . byte может приме­ няться только для выделения места под переменные в SRAM, но не для инициали­ зации ее содержимого. К тому же есть некоторая путаница с адресацией в отноше­ нии SRAM- счетчик адресов здесь по умолчанию равен не нулю, как в других случаях, а 32-м (поскольку адреса 0-3 1 заняты РОН), но с этого адреса вообще-то начинается файл РВВ, т. е. регистров ввода/вывода, а не собственно SRAM. Чтобы не путаться и не попасть в какой-нибудь регистр или вообще выйти за пределы памяти, здесь лучше использовать константы sRAМ_START и RAМEND, указывающие на начало и конец свободной SRAM для каждого контроллера. По сути, единственное преимущество . byte в том, что нам не приходится думать в процессе программирования об адресах в SRAМ, а можно просто располагать данные по метке (причем адресация здесь побайтовая, а не пословная, как в памяти программ, о чем далее) . Такой способ загрузки данных используют значительно реже остальных - заполнять память конкретными значениями все равно прихо­ дится программно, так что много от применения . byte мы не выигрываем. Пример применения этой директивы вы найдете в программе вывода на дисплей с I 2 С-ин­ терфейсом в главе 13 . Применение директивы . macro мы рассмотрим далее отдельно. Стоит упоминания, что, как и любой другой серьезный язык программирования, АVR-ассемблер пред­ полагает возможность условной компиляции (директивы i f, endi f, else, i fdef и им подобные). В совокупности с директивой .device (ранее) или конструкцией #pragma

RkJQdWJsaXNoZXIy MTExODQxMg==