Ревич, Ю.В. Программирование микроконтроллеров 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
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==