Кочегаров И.И. Микроконтроллеры AVR. Лабораторный практикум (2012) (1264221), страница 18
Текст из файла (страница 18)
Команда EICALL(Extended Indirect Call – расширенный косвенный вызов) позволяетвыполнять косвенный вызов подпрограмм из памяти программ размером до 4 М слов (8 Мбайт). При выполнении команд RCALL,ICALL, CALL и EICALL текущее значение программного счетчиказаносится в стек (2 байта в микроконтроллерах с 16-разрядным программным счетчиком или 3 байта в микроконтроллерах с 22-разрядным программным счетчиком).
Содержимое указателя стека(SPH:SPL) уменьшается соответственно на 2 или 3.Примеры использования команд вызова подпрограмм:RCALLsubr1subr1; относительный вызов подпрограммы; косвенный вызов подпрограммы subr2LDI R30, low(subr2)LDI R31, high(subr2)ICALL; команда icall не имеет операндовДля возврата из подпрограмм используется команда RET.
Привыполнении команды RET адрес возврата загружается из стека в программный счетчик. При этом содержимое указателя стека увеличивается на 2 или 3 в зависимости от разрядности программного счетчика(см. выше).Стек может также использоваться для сохранения содержимогоРОН на время выполнения подпрограмм.
Для сохранения в стеке иизвлечения из стека содержимого РОН служат команды PUSH и POP.Команда PUSH заносит содержимое регистра в стек по адресу, хранящемуся в указателе стека, при этом значение указателя стекауменьшается на единицу (SPH:SPL = SPH:SPL – 1). Команда POP107выполняет обратные действия: значение указателя стека увеличивается на единицу (SPH:SPL = SPH:SPL + 1); содержимое ячейки памяти по адресу, хранящемуся в указателе стека, загружается в регистр.Программы с использованием подпрограмм обычно начинаются с команды относительного перехода к основной программе, в которой прежде всего производится инициализация стека (рис.
33)..nolist.include "m8535def.inc".listRJMPграмме; отключить генерацию листинга; подключить inc-файл; включить генерацию листингаRESETPODPR:; ...RET; переход к основной про-; подпрограмма PODPR; возврат в основную программуRESET:; основная программаLDI R16, low(RAMEND)OUT SPL, R16; инициализация SPLLDI R16, high(RAMEND)OUT SPH, R16; инициализация SPH; ...RCALL; ...PODPR; вызов подпрограммы PODPRРис. 33. Пример программы с использованием подпрограммыПри работе с подпрограммами важно обеспечить передачу параметров из вызывающей программы в подпрограмму и возврат результатов выполнения подпрограммы обратно в вызывающую программу.
В ассемблере AVR-микроконтроллеров способы обмена данными между вызывающей программой и подпрограммой не форма108лизованы. Для передачи параметров могут использоваться регистрыобщего назначения, ячейки оперативной памяти и стек.Передача параметров через регистры общего назначения пригодна только для небольшого числа параметров, так как число РОНограничено и занятые под параметры регистры уже нельзя использовать в подпрограмме для участия в других вычислениях и хранениядругих данных. Однако это самый простой и прозрачный способ передачи параметров, обеспечивающий самый быстрый доступ к передаваемым параметрам.Использование оперативной памяти для передачи параметровтребует жесткой регламентации правил обращения к ним.
Например,можно организовать в памяти массив (таблицу) для непосредственного хранения значений передаваемых параметров или их адресов;адрес начала массива занести в РОН. Имея начальный адрес массива,вызывающая программа и подпрограмма смогут получить доступ ктребуемым параметрам.При передаче параметров через стек перед вызовом подпрограммы передаваемые параметры заносятся в стек. Следует помнить,что после выполнения команды вызова подпрограммы в стек будетдобавлен адрес возврата в вызывающую программу. Задавшись значением указателя стека в качестве базового адреса и используя косвенную адресацию памяти данных со смещением, в подпрограммеможно получить доступ к содержащимся в стеке параметрам. Например, если в основной программе перед вызовом подпрограммызанести в стек значение некоторого параметра:LDI R16, $33 ; R16 <- $33PUSHR16; сохранение содержимого регистра R16в стекето в подпрограмме можно получить к нему доступ:INR30, SPL; младший байт указателя стекаINR31, SPH; старший байт указателя стекаLDD R20, Z+3 ; загрузка числа $33 из стека в регистр R20(команда IN служит для считывания содержимого регистра вводавывода в РОН).
Аналогично можно использовать стек для хранения109адреса массива передаваемых параметров, расположенного в оперативной памяти данных.Практическая часть 1. Составить программу, использующую для вызова подпрограммы команду RCALL. Выполняемую подпрограммой функциювзять из задания лабораторной работы № 4 (по указанию преподавателя). Для передачи параметров в подпрограмму использовать регистры общего назначения.
Выполнить программу в пошаговом режиме, отслеживая изменение содержимого программного счетчика, указателя стека, а также занесение в стек адреса возврата из подпрограммы.2. Выполнить задание п. 1, используя стек для передачи параметров в подпрограмму. Проследить в симуляторе занесение передаваемых параметров в стек.3. Выполнить задание п. 2, применив для вызова подпрограммыкоманду ICALL.Содержание отчета Отчет должен содержать титульный лист с указанием номера иназвания лабораторной работы, номера группы и фамилий выполнивших работу; цель работы; листинги трансляции программ в соответствии с заданием.Контрольные вопросы 1. Каковы условия взаимодействия вызывающей программы иподпрограммы?2.
Опишите принцип организации и назначение стека.3. Каков механизм вызова подпрограмм?4. Какие команды работы с подпрограммами на ассемблеремикроконтроллеров семейства AVR вы знаете?5. Какие существуют способы обмена данными между вызывающей программой и подпрограммой?110Лабораторная работа № 6 Система прерываний Цель работы: изучение системы прерываний на примере прерывания по переполнению встроенного таймера-счетчика AVR-микроконтроллера.Теоретическая часть При работе реальной микропроцессорной системы в ней иливне ее могут произойти события, требующие немедленной реакции.Такая реакция обеспечивается процедурой прерывания (interrupt), которая состоит в том, что выполнение текущей программы приостанавливается, запоминается состояние на момент прерывания, выполняется другая программа, после чего восстанавливается сохраненноедо прерывания состояние процессора и продолжается выполнениепрерванной программы.
Сигнал, вызвавший прерывание текущейпрограммы, называется запросом на прерывание (interrupt request –IRQ); источник этого сигнала – источником прерывания; последовательность действий, выполняемая по запросу на прерывание, – обслуживанием прерывания, а выполняемая по прерыванию программа – подпрограммой обработки прерывания (interrupt handler, interrupt routine).Различают два типа источников прерывания – аппаратные ипрограммные. Источниками аппаратных прерываний служат внешние и внутренние периферийные устройства.
Запросом на прерывание от внешнего источника является активный сигнал на соответствующем выводе процессора; источник прерывания определяется повыводу, на котором появляется такой сигнал. К источникам программного прерывания относятся специальные команды прерываний(trap) – управляемые программные прерывания и особые условия(exception – исключение) – неуправляемые программные прерывания, являющиеся реакцией процессора на исключительную ситуацию, возникшую при выполнении некоторой команды (переполнение, деление на нуль и т.п.).
Запросом на прерывание от программного источника является непосредственно команда прерывания или установка бита (битов), фиксирующих возникновение особого условия.Общее количество источников аппаратных и программных прерываний может быть различным – от единиц до нескольких десятков.Процедура обслуживания прерываний по запросам от нескольких источников в различных процессорах выполняется по-разному.111Тем не менее основные принципы реализации механизма прерываний являются общими. Управление процедурой прерываний осуществляется специальными устройствами в составе аппаратного обеспечения процессора (контроллерами, схемами управления и т.п.).
Основными средствами управления прерываниями являются: векторы прерываний; приоритеты прерываний; операция маскирования прерываний; флаги прерываний.В микроконтроллерах указанные средства управления прерываниями реализуются следующим образом.Для управления прерываниями от N источников в адресномпространстве памяти программ выделяется специальная областьиз N ячеек памяти (или N блоков, состоящих из нескольких ячеек).В каждой из этих ячеек размещаются команды перехода к соответствующей подпрограмме обработки прерывания или (в случае блока изнескольких ячеек) непосредственно команды, которые необходимовыполнить по запросу на прерывание. Эти ячейки памяти (блоки) называются векторами прерываний (или просто векторами), адресячейки (первой ячейки каждого блока) – адресом вектора прерывания.