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

Глава б. Основы программирования МКАVR 127 Рассмотрим еще директиву . dЬ (define byte), которая позволяет хранить непоимено­ ванные константы или массивы во flаsh-памяти программ или в долговременной памяти EEPROM (для памяти данных SRAM используется другой способ, - об этом рассказано далее) . В языках высокого уровня (в том числе и для Arduino) та­ кая возможность имеется только теоретически (во встроенном ассемблере), по­ скольку модель «общения» с памятью у них совершенно другая, и никому не при­ дет в голову хранить данные «внавал», когда их можно поименовать и заодно ука­ зать тип . А в ассемблере это используется достаточно часто - здесь нет массивов, как таковых, потому удобно прибегать к такому способу. Причем, кроме .dЬ, есть еще директива . dw (define word, т. е. двухбайтовое слово) и даже . dd и . dq (двойное и четвертное слова), но мы не будем отвлекаться на все нюансы адресации, кото­ рые при этом возникают, и обойдемся одной . dЬ - на практике она употребляется наиболее часто. Для того чтобы показать, куда именно писать данные, совместно с . dЬ можно ука­ зать директиву . eseg (для EEPROM). Память программ при этом обозначается директивой . cseg (code segment). Некоторые авторы советуют всегда записывать в начале программы, как минимум, директиву . cseg, чтобы указать, что последую­ щий текст представляет собой именно текст программы, а не набор констант, но мне кажется, что это только запутывает дело, потому и советую употреблять эти директивы тогда, когда это действительно надо. Если директива яв н ого указания на область памяти отсутствует, то данные по ди­ рективе . dЬ будут сохраняться вместе с командами в памяти программ (пример приведен в разд. «Команды пересылки данных» главы 7). Если же присутствует директива . eseg, то потом, чтобы указать, что область данных EEPROM в тексте закончилась, и следует опять перейти к памяти программ, необходимо это явно определить, т. е. поставить директиву . cseg (code segment) . Естественно, распола­ гать в зоне действия директивы . eseg что-либо, кроме констант, определенных директивой . dЬ, бессмысленно. Все сказанное иллюстрируется, например, фраг­ ментом текста, заимствованным из «аппноты» Atmel № 240 (листинг 6.2). . eseg ; EEPROM segment . org О . dЬ 1 , 2 , з , ' 1 5 , 4 , 5 , б , 1 4 , 7 , 8 , 9 , 1 з , 1 0 , о , 1 1 , 12 ; * * * * Source code * * * * * * * * * * * * * * * * * * * . cseg ; CODE segment . org О rjrnp reset ; Reset handler Применение директивы . org мы рассмотрим в этой главе далее, а здесь только от­ метим следующее . Согласно листингу 6.2, все, что записано через запятую после

RkJQdWJsaXNoZXIy MTExODQxMg==