Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

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

В ячейках оперативной памяти организуется системный стек, который используется автоматически для хранения адресов возврата при выполнении подпрограмм, а также может использоваться программистом для временного хранения содержимого оперативных регистров (команды PUSH и POP). В начале любой программы необходимо инициализировать стек программными средствами, т.е. занести в Указатель Стека (Stack Pointer) начальное значение, равное самому старшему адресу ячейки в оперативной памяти. Микроконтроллеры, не имеющие SRAM, содержат трехуровневый аппаратный стек.

Следует иметь в виду, что если стек располагается во внешней SRAM, то вызовы подпрограмм и возвраты из них требуют двух дополнительных циклов, если бит SRW не установлен, и четырех, если установлен.

Размер стека, организуемого в оперативной памяти, ограничен лишь размерами этой памяти. Если микроконтроллер содержит на кристалле 128 байт внутренней SRAM и не имеет возможности подключения внешней SRAM, то в качестве указателя вершины стека используется регистр ввода/вывода SPL. Если есть возможность подключения внешней памяти или внутренняя память имеет размеры 256 байт и больше, то указатель стека состоит из двух регистров ввода/вывода SPL и SPH.

При занесении числа в стек автоматически выполняются следующие действия:

1. Число записывается в ячейку памяти по адресу, хранящемуся в указателе стека. (SPH:SPL) <- число;

2. Содержимое указателя стека уменьшается на единицу. SPH:SPL = SPH:SPL - 1.

Обратные действия выполняются при извлечении числа из стека:

1. Содержимое указателя увеличивается на единицу. SPH:SPL= SPH:SPL + 1;

2. Число извлекается из ячейки памяти с адресом, хранящимся в указателе стека. (SPH:SPL) -> число.

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

Кроме оперативной памяти программно доступными ресурсами микроконтроллера являются энергонезависимые, электрически программируемые FLASH и EEPROM блоки памяти, которые имеют отдельные адресные пространства.

Младшие адреса памяти программ имеют специальное назначение. Адрес $0000 является адресом, с которого начинает выполняться программа после сброса процессора. Начиная со следующего адреса $0001, ячейки памяти программ образуют область векторов прерывания. В этой области для каждого возможного источника прерывания отведен свой адрес, по которому (в случае использования данного прерывания) размещают команду относительного перехода RJMP на подпрограмму обработки прерывания (см. рис. 2.3). Следует помнить, что адреса векторов прерывания одних и тех же аппаратных узлов для разных типов AVR могут иметь разное значение. Поэтому для обеспечения переносимости программного обеспечения удобно, так же как и в случае с регистрами ввода/вывода, использовать символические имена адресов векторов прерывания, которые определены в соответствующем inc -файле.

EEPROM блок электрически стираемой памяти данных AVR предназначен для хранения энергонезависимых данных, которые могут изменяться непосредственно на объекте. Это калибровочные коэффициенты, различные установки, конфигурационные параметры системы и т. п. EEPROM-память данных может быть программным путем как считана, так и записана. Однако специальных команд обращения к EEPROM-памяти нет. Чтение и запись ячеек EEPROM выполняется через регистры ввода/вывода EEAR (регистр адреса), EEDR (регистр данных) и EECR (регистр управления).

Регистр состояния.

Регистр состояния – SREG является частью пространства ввода/вывода и расположен по адресу $3F. В нем устанавливаются признаки результата арифметических операций. Отдельные биты регистра имеют следующее назначение (см. рис. 2.5)

 
 

SREG

Символьное обозначение I T H S V N Z C
Бит 7 6 5 4 3 2 1 0

 

 

 


Рис. 2.5. Регистр состояния SREG (Status Register).

Рассмотрим некоторые из признаков:

· Бит 0 – С (carry) Флаг переноса. Устанавливается, если во время выполнения операции был перенос из старшего разряда результата;

· Бит 1 – Z (zero) Флаг нулевого результата. Устанавливается, если результат операции равен 0;

· Бит 2 – N Флаг отрицательного результата. Устанавливается, если MSB (Most Significant Bit - старший бит) результата равен 1 (правильно показывает знак результата, если не было переполнения разрядной сетки знакового числа);

· Бит 3 – V Флаг переполнения дополнения до двух. Устанавливается, если во время выполнения операции было переполнение разрядной сетки знакового результата;

· Бит 4 –: Бит знака, S = N XOR V. Бит S всегда равен исключающему ИЛИ между флагами N (отрицательный результат) и V (переполнение допол­нения до двух). Правильно показывает знак результата и при переполнении разрядной сетки знакового числа;

· Бит 5 – H Флаг половинного переноса. устанавливается, если во время выполнения операции был перенос из 3-го разряда результата.

· Бит 6 - T: Хранение копируемого бита. Команды копирования битов BLD (Bit LoaD) и BST (Bit STore) используют этот бит как источник и приемник обрабатываемого бита. Бит из регистра регистрового файла может быть скопирован в T командой BST, бит T может быть скопирован в бит регистрового файла командой BLD.

· Бит 7 - I: Общее разрешение прерываний. Для разрешения прерываний этот бит должен быть установлен в единицу. Управление отдельными прерываниями производится регистром маски прерываний - GIMSK/TIMSK. Если флаг сброшен (0), независимо от состояния GIMSK/TIMSK, прерывания не разрешены. Бит I очищается аппаратно после входа в прерывание и восстанавливается командой RETI, для разрешения обработки следующих прерываний.

Прерывания.

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

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


 

Аппаратные средства AVR.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...