Программный счетчик и стек




Реализация стека – главное отличие между младшими моделями AVR и другими микроконтроллерами этого семейства. В младших моделях AVR стек реализован в виде оперативной памяти типа LIFO («последний пришел – первый ушел»), добавленной к программному счетчику. Когда вызывается подпрограмма или происходит запрос прерывания, содержимое счетчика команд вводится в этот стек (рисунок 11). В AVR1200 такой стек имеет глубину в три элемента. Это значит, что вы можете иметь только три вложенные подпрограммы или два вложенных вызова функции в активном обработчике прерывания. Данное обстоятельство значительно ограничивает возможности этого микроконтроллера.

Структурная схема для AVR1200 и других младших моделей приведена на рисунке 12.

Другие модели семейства AVR не имеют таких жестких ограничений на объем стека, так как они используют для размещения стека внутреннюю память SRAM и, возможно, внешнюю память (рисунок 13). Такая структура позволяет использовать в качестве стека весь доступный объем оперативной памяти.

Использование значительного объема памяти RAM в качестве стека дает ряд преимуществ при разработке приложений. Окончательная структурная схема микроконтроллеров AVR имеет вид, показанный на рисунке 14.


 

Рис. 11.Счетчик команд и стек в младших моделяхAVR

 

Рис. 12. Структурная схема младших моделей AVR с учетом стека


 

Рис.13. Программный счетчик и стек в старших моделях AVR

 

Рис. 14. Полная архитектура процессора AVR с указателем стека


Прерывания

Реализация прерываний в AVR является специфичной для конкретных приложений, так как легко можно написать обработчик прерываний, который абсолютно не будет менять контекстовую информацию контроллера (содержимое стека, регистра состояния и других регистров), или такой, который будет сохранять содержимое всех РОН и некоторых специальных регистров.

Если произошел запрос прерывания и флаг I в регистре состояния установлен в «1», то адрес следующей команды сохраняется в стеке, а выполнение программы продолжается с адреса, хранящегося в соответствующем векторе прерывания. Когда запрос прерывания получен и программа перешла по этому вектору, флаг I сбрасывается в «0», чтобы предотвратить возможность вызова нового прерывания во время обработки прерывания текущего.

Флаг I будет снова установлен в «1» в конце обработчика прерывания, когда выполняется команда возврата reti. Он также может быть установлен в «1» в процессе обработки (после сохранения контекстовых регистров), чтобы разрешить вложенные прерывания. Средние и старшие модели AVR могут обрабатывать столько вложенных прерываний, на сколько хватит объема стека для сохранения содержимого программного счетчика и регистров контекста.

Младшие модели имеют ограниченный объем стека (три позиции), который может быстро переполниться при выполнении вложенных прерываний или подпрограмм.

Способы адресации данных

Основным способом доступа к данным является прямое обращение к регистрам общего назначения. Обычно в формате команды отводятся пять бит, которые позволяют адресоваться к любому регистру. Прямое обращение к одному из РОН показано на рисунке 15. Обычно такая адресация используется для операций с содержимым одного регистра (инкремент, декремент, инверсия знака, очистка и т. д.). Некоторые из этих команд дважды повторяют адрес в коде команды.

 

Рис. 7.15. Прямая адресация в AVR

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-01-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: