Любая программа представляет собой определенный алгоритм действий, которые должен выполнять микроконтроллер. Для хранения программы и ее последовательного выполнения в микроконтроллерах AVR предназначена встроенная FLASH-память программ. В данной области памяти хранится откомпилированная, то есть переведенная в машинный язык программа.
Объем памяти данного типа варьируется от 1 килобайта до 256 килобайт. Первое число в наименовании конкретной модели микроконтроллера указывает на размер памяти программ в килобайтах из ряда: 1, 2, 4, 8, 16, 32, 64, 128 и 256. Например, у ATtiny11 объем памяти программ составляет 1 килобайт, а у ATmega2560 — 256 килобайт. Число циклов перепрограммирования FLASH-памяти программ у микроконтроллеров AVR может достигать 10 тысяч. Организация памяти программ представлена на следующем рисунке.
Структура памяти программ
Память программ состоит из набора пар 8-разрядных регистров, другими словами отдельная ячейка памяти программ представляет собой двухбайтное слово со своим адресом. Двухбайтовая организация памяти программ не случайна. Дело в том, что любая команда микроконтроллеров архитектуры AVR имеет длину ровно два байта. Исключением являются команды типа JMP, CALL, LPM и другие, оперирующие с 16-разрядными и более длинными адресами и занимающие 4 байта, эти команды используются в моделях с объемом памяти программ более 8 килобайт. Во всех остальных случаях при выполнении очередной команды программный счетчик сдвигается ровно на два байта. Исходя из количества команд, используемых в программе, можно подсчитать необходимый объем памяти программ для выбора модели микроконтроллера.
При сбросе микроконтроллера или включении питания программный счетчик обнуляется и начинается выполнение программы с ячейки памяти программ с адресом $0000. Обычно, начиная с этого адреса, то есть в самом начале программы располагают таблицу векторов прерываний, смысл которой мы рассмотрим позже. Однако, если в программе прерывания не используются, то прямо отсюда могут начинаться непосредственные указания к действию. Конечный адрес зависит от объема памяти программ и для удобства обозначается константой FLASHEND.
Следует отметить, что в последних адресах памяти программ может располагаться специальный загрузчик, который может управлять загрузкой и выгрузкой прикладных программ из основного объема памяти. Данная функция доступна только для микроконтроллеров семейства mega и будет подробнее описана в других статьях.
|