Указатель стека AVR

Микроконтроллеры / Для начинающих / Архитектура /

Микроконтроллеры для начинающих Что нужно для того, чтобы стать профессиональным разработчиком программ для микроконтроллеров и выйти на такой уровень мастерства, который позволит с лёгкостью найти и устроиться на работу с высокой зарплатой (средняя зарплата программиста микроконтроллеров по России на начало 2017 года составляет 80 000 рублей). Подробнее...

Стек в основном используется для хранения временных данных, локальных переменных и обратных адресов после прерываний и вызовов подпрограмм. Регистр Указателя Стека (Stack Pointer Register) всегда указывает на верхнюю часть стека.

Обратите внимание, что Стек выполнен как растущий из более высоких расположений памяти в более низкие. То есть визуально Стек как бы перевёрнут (см. рис.). Это означает, что команда PUSH уменьшает указатель стека.

Стек AVR

Указатель Cтека (Stack Pointer) указывает на область данных SRAM Stack (статическая память, выделенная для стека), в которой расположены стеки подпрограмм и прерываний.

Указатель Стека - это область стека в данных SRAM, которая определяется автоматически. Указатель стека содержит последний адрес в SRAM, записанный туда перед выключением питания.

Указатель стека должен быть установлен выше 0x60.

Указатель стека уменьшается на единицу, когда данные помещаются в стек с помощью инструкции PUSH, и на два, когда возвращаемый адрес помещается в стек с помощью команды PUSH подпрограммой вызова или прерывания.

Указатель стека увеличивается на единицу, когда данные извлекаются из стека с помощью инструкции POP, и увеличивается на два, когда данные извлекаются из стека при возвращении из подпрограммы с помощью инструкции RET, или при возвращении из прерывания с помощью инструкции RETI.

Указатель стека AVR выполнен в виде двух 8-разрядных регистров в пространстве ввода-вывода. Это регистры SPL (Stack Pointer Low) и SPH (Stack Pointer High).

Количество фактически используемых разрядов зависит от исполнения. Обратите внимание, что пространство данных в некоторых исполнениях архитектуры AVR настолько мало, что требуется только младший регистр указателя стека (Stack Pointer Low - SPL). В этом случае регистр SPH (старший регистр указателя стека) отсутствует.

Stack Pointer Low - SPL - младший регистр указателя стека

На рисунке показана структура регистра SPL, который расположен по адресу 0х3D. Все биты регистра доступны как для чтения, так и для записи. Начальные значения битов (Initial Value) также показаны на рисунке.

В регистры SPL и SPH необходимо загружать адрес вершины стека (адрес верхней границы ОЗУ).

Адрес вершины стека хранится в константе RAMEND, которая определена в подключаемом файле для данной модели микроконтроллера. Например, для микроконтроллера ATtiny13A в начале файла исходного кода программы надо подключить файл tn13def.inc.

Младший байт константы RAMEND надо загрузить в регистр SPL, а старший - в регистр SPH. Это установит указатель стека на конец ОЗУ. Сделать это можно, например, так:

.def temp = r16

ldi temp, LOW(RAMEND) ;Указатель стека указывает
out SPL,  temp        ;на последний адрес ОЗУ
ldi temp, HIGH(RAMEND)
;out SPH,  temp       ;!!! Не для всех моделей МК

Обратите внимание на последнюю строку. Поскольку регистр SPH используется не во всех моделях серии AVR, то в некоторых случаях (например, для ATtiny13A) это приведёт к ошибке компиляции (в моделях с объёмом ОЗУ до 128 байт - ATtiny13A имеет память 64 байта).

Этот код надо разместить до вызова каких-либо подпрограмм.


Вступить в группу "Основы программирования"

Подписаться на RUTUBE-канал

Подписаться на Дзен-канал

Подписаться на рассылки по программированию

Микроконтроллеры для ЧАЙНИКОВ Микроконтроллеры для ЧАЙНИКОВ

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

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su