Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств

Шаг 5. Переходим непосредственно к разработке устройств и программ 243 Так как в строке 7 указателю присваивается значение 0x60, то именно по этому адресу будет располагаться ячейка памяти, резервируемая в строке 8. Почему же мы выбрали такой адрес? Вспомните схему распределения памяти микроконтроллера AVR [4]. Ячейки ОЗУ с адресами от 0 до OxlF совмещены с файлом регистров общего назначения, ячейки с адресами 0x20 — 0x5F совмещены с реги ­ страми ввода-вывода. Ячейка с адресом 0x60 — это первая ячейка ОЗУ, предназначенная исключительно для хранения данных. Зарезервированная нами ячейка далее в программе будет использо ­ ваться в качестве буфера для хранения содержимого рабочего регистра rab в промежутке между двумя вызовами прерывания. Именно из этих соображений для нее выбрано имя buf . Резервированием памяти заканчивается модуль определений. Далее начинается непосредственно программный код, то есть код, помещае ­ мый в программную память. Поэтому мы выбираем программный сег ­ мент памяти (строка 9). В строке 10 устанавливается начальное значение указателя для этого сегмента. Далее начинается код самой нашей программы. Но начинается код программы совсем не так, как мы уже привыкли во всех предыду ­ щих примерах. Строки 11 — 29 занимает блок команд переопределения векторов прерываний. До сих пор в наших программах мы не имели подобного блока команд, потому что до сих пор мы не использовали пре ­ рываний. Напомню определение: векторами прерываний называется несколько специально зарезервированных адресов в начале программной памяти, предназначенных для обслуживания прерываний. Микроконтроллер ATtiny2313 имеет таблицу векторов прерываний, состоящую из 19 адресов (с адреса 0x0000 по адрес 0x0012). Каждый из этих адресов, по сути, является адресом начала процедуры обработки одного из видов прерываний. Переопределение векторов состоит в том, что в каждую такую ячейку мы можем поместить команду безусловного перехода, передающую управление на адрес в программной памяти, где уже действительно начинается соответствующая процедура. Обычно программа не использует сразу все заложенные в микропро ­ цессор прерывания. Например, в нашем случае используется лишь одно прерывание — прерывание по совпадению таймера. Поэтому перео ­ пределение производят только для тех векторов, которые используются в данной программе. Однако и все остальные векторы принято не остав ­ лять без внимания. По всем остальным адресам таблицы принято ста ­ вить команды-заглушки. Назначение команды-заглушки: предотвратить негативные послед ­ ствия в случае ошибочного вызова незадействованного прерывания.

RkJQdWJsaXNoZXIy MTExODQxMg==