Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МПС (Влада).docx
Скачиваний:
104
Добавлен:
05.05.2021
Размер:
4.89 Mб
Скачать

7. Виды памяти микроконтроллеров (на примере семейства avr). Стек и его инициализация.

В МК AVR реализована Гарвардская архитектура, в соответствии с которой разделены не только адресные пространства памяти программ и памяти данных, но также и шины доступа к ним.

2 вида памяти:

  • Память программ: FLASH;

  • Память данных: оперативная память (ОЗУ) SRAM (Static RAM) и энергонезависимая память данных EEPROM.

Адресные пространства указанных видов памяти, как правило, разделены. Способы адресации и доступа к этим областям памяти также различны. Такая структура позволяет центральному процессору работать одновременно как с памятью программ, так и с памятью данных, что существенно увеличивает производительность. Каждая из областей памяти данных (SRAM и EEPROM) также расположена в своем адресном пространстве.

Обобщенная карта памяти AVR микроконтроллеров приведена на рисунке 1.

Рисунок 1 – Структура памяти МК AVR

Память программ

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

Память программ представляет собой электрически стираемое программируемое постоянное запоминающее устройство (ППЗУ, FLASH ПЗУ). Так как длина всех команд кратна одному слову (16 бит), память программы имеет 16-разрядную организацию.

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

[Не знаю насколько это нужно писать в билете, но знать стоит…

Если возможность самопрограммирования не используется, то прикладная программа может располагаться и в области загрузчика.

Для адресации памяти программ используется счетчик команд. Размер счетчика команд составляет 12…16 разрядов, в зависимости от объема адресуемой памяти.

По адресу 0х0000 памяти программ находится вектор сброса. После инициализации МК (сброса) выполнение программы начинается с этого адреса. Начиная с адреса 0х0001 или 0х0002 памяти программ, располагается таблица векторов прерываний. Размер этой области зависит от МК.

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

Положение вектора сброса и таблицы векторов прерываний может быть перенесено из секции прикладных программ в секцию загрузчика.

В моделях с объемом памяти менее 8 Кбайт в качестве этих команд используются команды относительного перехода (RJMP), а в остальных моделях – команды абсолютного перехода (JMP).

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

РОН делятся на три группы:

  1. Младшие 0 – 15 обычные регистры общего назначения, в некоторым смысле неполноценные. С ними не работают многие команды (загрузка непосредственного числа).

  2. Старшие 16 – 31 полноценные регистры, работающие со всеми командами.

  3. Индексные 26 – 31 шесть последних регистров из старшей группы отличаются от остальных. Их можно использовать и как обычные регистры, но также они могут образовывать регистровые пары X(R26:R27), Y(R28:R29), Z(R30:R31), которые используются как указатели при работе с памятью …]

Память данных

Память данных разделена на 3 части:

  • регистровая память;

  • оперативная память (статическое ОЗУ);

  • энергонезависимое EEPROM (ЭСППЗУ – электрически стираемое перепрограммируемое ПЗУ). 

Регистровая память включает 32 РОН, объединенных в файл, и служебные регистры ввода/вывода (РВВ – регистры управления мк, регистры состояния). И те и другие расположены в адресном пространстве ОЗУ, но не являются его частью.

В старших моделях мк имеется область дополнительных (Extended) регистров ввода/вывода (ДРВВ). РВВ – 64 байта в памяти, ДРВВ – 160 байт. Введение дополнительных РВВ связано с тем, что для поддержки всех периферийных устройств этих моделей обычных 64 регистров недостаточно.

Оперативная память (ОЗУ), предназначенная для временного хранения переменных. Она есть не везде. Оперативная память представляет собой несколько сотен ячеек для временного хранения данных, от 64 байт до 4 килобайт, в зависимости от модели. В этих ячейках могут храниться любые данные, а доступ к ним осуществляется через команды LOAD и STORE.

Для некоторых микроконтроллеров возможна организация подключения внешнего статического ОЗУ объемом до 64К.

EEPROM-память предназначена для долговременного хранения различной информации, которая может изменяться в процессе функционирования микроконтроллерной системы. Все AVR имеют блок энергонезависимой электрически перезаписываемой памяти данных EEPROM от 512 Байт до 4 КБайт. Эта память расположена в отдельном адресном пространстве, а доступ к ней осуществляется с помощью определенных РВВ.

Этот тип памяти, доступный программе микроконтроллера непосредственно в ходе ее выполнения, удобен для хранения промежуточных данных, различных констант, коэффициентов, серийных номеров, ключей и т.п. EEPROM может быть загружена извне как через SPI интерфейс, так и с помощью обычного программатора. Число циклов стирание/запись - не менее 100 тыс.

Стек

Стек представляет собой область памяти, которую ядро МК использует для сохранения и восстановления адресов возврата из подпрограмм и прерываний. Практически у всех микроконтроллеров AVR стек размещается в оперативной памяти.

Для адресации текущего элемента (вершины стека) используется указатель стека SP (Stack Pointer). Это однобайтовый регистр ввода-вывода SPL у моделей с объемом памяти данных до 256 байт, или двухбайтовый SPH:SPL (SPH – старший байт, SPL – младший байт) у старших моделей с большим объемом памяти.

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

Вызов подпрограммы

Возврат из подпрограммы

1. Адрес команды, стоящей за командой вызова сохраняется в стеке

2. Значение указателя стека уменьшается на 2 байта

1. Адрес извлекается из стека

2. Загружается в счетчик команд

3. Значение указателя стека увеличивается на 2 байта

2 байта, так как для хранения счетчика команд требуется два байта.

То же происходит и во время вызова прерываний.

Схематичное расположение стека в памяти данных представлено на рисунке 2.

Рисунок 2 – Расположение стека в памяти данных

Во всех моделях AVR стек доступен со стороны пользовательской программы и может быть использован в процессе выполнения программы. Для работы со стеком существует всего две команды: занесение в стек (PUSH) и извлечение из стека (POP).

Инициализация стека:

LDI R16, Low (RAMEND); устанавливаем SP = RAMEND

OUT SPL, R16

LDI R16, High (RAMEND)

OUT SPH, R16

RAMEND – это макроопределение, указывающее на конец ОЗУ для каждого конкретного мк.

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

Очень важно предварительно оценить максимальный размер стека (глубину стека). Может случиться так, что вершина стека поднимется слишком высоко и начнет “затирать” пользовательские данные, а это одна из самых сложно-выявляемых ошибок!

Стек AVR, помимо сохранения адресов возврата позволяет сохранять любые данные специально предназначенными для этого командами push Rr (загрузка в стек) и pop Rd (выгрузка из стека).

Соседние файлы в предмете Микропроцессорные системы