Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
sp_avr_2009.doc
Скачиваний:
48
Добавлен:
21.04.2023
Размер:
819.2 Кб
Скачать

3.7. Настройка указателя стека

В микроконтроллерах стеком называется специальная область памяти, предназначенная для временного хранения информации (адресов и данных). Информация может как записываться в стек, так и извлекаться из стека. Стек обязательно имеет указатель. Указатель стека это регистр, в котором находится адрес активной ячейки стека (верхушки стека). При операциях обращения к стеку (чтение или запись) в указателе стека автоматически формируется адрес вершины стека.

Существует стек двух типов (рис. 7, 8):

LIFOLast Input, First Output (последний вошел, первый вышел)

FIFOFirst Input, First Output (первый вошел, первый вышел)

Рис. 7. Стек LIFO (Last Input, First Output – последний вошел, первый вышел)

Рис. 8. Стек FIFO (First Input, First Output – первый вошел, первый вышел)

Стек применятся при использовании подпрограмм. При вызове подпрограммы в стек заносится адрес возврата из подпрограммы. Стек также может использоваться для хранения содержимого регистров общего назначения. В этом случае используются команды PUSH (втолкнуть в стек) и POP (вытолкнуть из стека). В настоящее время использование стека для хранения содержимого регистров общего назначения неактуально ввиду наличия резидентной памяти данных большого объема.

Стек может быть аппаратным или программным. В аппаратном стеке имеются специальные регистры (ячейки памяти), которые предназначены для размещения данных. Количество этих регистров ограничено. Таким образом, объем стековой области (глубина стека) фиксировано. В программном стеке для размещения стековой области используется общее адресное пространство резидентной памяти данных (RAM). Глубина программного стека может быть различна, но максимальный ее объем не может превышать объем резидентной памяти данных. Следует учесть, что в процессе работы программы указатель стека может переместиться в область, где программист размещает оперативные данные. В этом случае стек уничтожит данные. Может быть и обратная ситуация, когда программист может уничтожить информацию в стеке.

В микроконтроллерах семейства AVR моделей Тiny и Мega реализован программный стек типа LIFO, позволяющий использовать многоуровневые вложенные подпрограммы. Стек может быть размещен в любом месте внутренней памяти данных (RAM), имеющей для разных моделей микроконтроллеров различную емкость. Следует учесть, что стек заполняется от старших ячеек к младшим. Для определения "верхушки" стека предназначен регистр указателя стека (SP). У моделей семейства «Tiny» емкость памяти данных (RAM) не превышает 256 байт, следовательно, они имеют восьмиразрядный указатель стека SP (адрес $3DН). У моделей семейства «Mega» емкость памяти данных (RAM) превышает 256 байт, следовательно, они имеют два восьмиразрядных регистра: SPH (адрес $3EН) и SPL (адрес $3DН). Старший байт SPH и младший байт SPL образуют шестнадцатиразрядный регистр указателя стека. По правилу для шестнадцатиразрядных регистров первым в программе должен загружаться старший. Ввиду того, что стек увеличивается от старших адресов к младшим, целесообразно для стека выделить старшие адреса адресного пространства RAM. Например, определяем адрес указателя стека SP на ячейку 085FH. В соответствии с этим содержимое регистра указателя стека определяется:

Регистр Н-адрес Н-код

SPH 3EH 08H

SPL 3DH 5FH

Ниже приведены примеры настройки стека для двух микроконтроллеров семейств Тiny и Мega. Настройка других микроконтроллеров выполняется аналогично, но следует учесть, что объем памяти для разных типов микроконтроллеров различен.

Настройка стека для микроконтроллеров AVR модели Тiny2313:

Микроконтроллер Тiny2313 имеет 128 байт внутренней памяти данных (RAM). Используется восьмиразрядный указатель стека (SP). Адрес последней (старшей) ячейки памяти DFH. В данном примере загружаем в регистр указатель стека (SP) адрес ячейки DFH.

; Загрузка указателя стека SP

ldi r16, $DF ; загрузка константы DFH в регистр R16

out $3D, r16 ; загрузка содержимого R16 в регистр SPL

Настройка стека для микроконтроллеров AVR модели Мega32:

Микроконтроллер Мega32 имеет 2048 байт внутренней памяти данных (IRAM). Используется шестнадцатиразрядный указатель стека SP, который состоит из двух восьмиразрядных регистров. В регистре SPH хранится старшая часть стека, а в регистре SPL – младшая регистра указателя стека SP. Адрес последней (старшей) ячейки памяти 085FH. В данном примере загружаем в регистр указатель стека (SP) адрес ячейки 085FH.

; Загрузка старшей части указателя стека SP

ldi r16, $08 ; загрузка константы 08H в регистр R16

out $3E, r16 ; загрузка содержимого R16 в регистр SPH

; Загрузка младшей части указателя стека SP

ldi r16, $5F ; загрузка константы 5FH в регистр R16

out $3D, r16 ; загрузка содержимого R16 в регистр SPH

Настройка указателя стека с использованием директив:

При использовании директив ассемблера настройку стека можно произвести следующим образом:

Для микроконтроллера Мega32:

.include “m32def.inc” ; подключение библиотеки имен

.def temp = r16 ; определение временной переменной

ldi temp, low (RAMEND) ; загрузка во временный регистр младшей

; части адреса последней ячейки RAM

out SPL, temp ; загрузка в SPL младшей части адреса последней

; ячейки RAM

ldi temp, high (RAMEND) ; загрузка во временный регистр старшей

; части адреса последней ячейки RAM

out SPH, temp ; загрузка в SPH младшей части адреса последней

; ячейки RAM

Для микроконтроллера Тiny2313:

.include “tn2313def.inc” ; включение библиотеки имен

.def temp = r16 ; определение временной переменной

ldi temp, (RAMEND) ; загрузка во временный регистр младшей

; части адреса последней ячейки RAM

out SPL, temp ; загрузка в SPL младшей части адреса последней

; ячейки RAM

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]