МИКРОКОНТРОЛЛЕРЫ AVR: ОРГАНИЗАЦИЯ ПАМЯТИ

   Почитав наш форум, стало ясно, что не все понимают разницу между прошивкой и исходником, FLASH и EEPROM. Чтобы данных вопросов больше не возникало, решил написать этот краткий обзор. Возьмем, к примеру, МК ATMega16. Внутри данного контроллера имеются 2 основные области памяти: ПЗУ, она же память программ или flash-память, и ОЗУ, она же память данных или SRAM. В довесок ко всему этому идет память для хранения данных (EEPROM).

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

   Память программ используется для хранения так называемой прошивки. Прошивка представляет из себя набор инструкций (команды и операнды) в машинных кодах, понятных контроллеру, в соответствии с которыми контроллер выполняет требуемую последовательность действий. Прошивку получают посредством компилятора. Компилятор – это программа, которая выполняет преобразование текста, написанного на каком-либо языке программирования (исходник), в код машинных инструкций (прошивка, hex-файл). Каждая инструкция имеет длину 16 или 32 бита (в основном 16 бит), а также имеет адрес, под которым она хранится во flash-памяти.

flash-память, и ОЗУ

   Так как объем flash-памяти контроллера составляет 16 кбайт (16384 байта), то в него можно впихнуть 8192 16-ти битных инструкции (8К х 16). Кроме основной программы во flash-памяти могут быть размещены различные константы, значения которых используются при выполнении программы и которые не могут быть изменены, а также может быть секция бутлоадера (сморим статью про fuse-биты). Число циклов перепрограммирования flash-памяти составляет 10000. Т.е. после 10000 (или около того) циклов возможно будет запись с ошибками, либо вообще программа не запишется. Пугаться не стоит, если немного посчитать, то получается чтобы дойти до этого надо шить контроллер каждую минуту в течение примерно семи дней без отрыва на сон, перекуры, распитие пива и прочие радости холостой или семейной (у кого как) жизни.

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

память данных состоит из: регистрового файла

   Как видно из рисунка, память данных состоит из: регистрового файла, в который входят 32 регистра общего назначения (РОН); 64-х регистров периферии – регистры ввода/вывода (I/O регистры); 1024 байт самой ОЗУ. Все операции, происходящие внутри МК (логические, арифметические и т.д.), а также его общение с периферией (АЦП, таймеры/счетчики, порты ввода/вывода и т.д.) происходит через регистры. Все регистры имеют разрядность 8 бит – отсюда и 8-ми битные контроллеры. Конечно есть и 16-ти разрядные регистры, но они опять же состоят из 2-х восьмибитных. Регистры ввода/вывода (РВВ) предназначены для работы с периферией МК и ее конфигурирования.

   Возьмем, к примеру, порты ввода/вывода (самый простой пример). Для каждого порта есть 3 РВВ: 

 1) регистр, определяющий направление передачи данных через выводы порта (вход или выход);

 2) регистр, считывающий состояние выводов порта, если выводы настроены на прием (вход) информации;

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

   Для того, чтобы настроить порт под свои требования, а также выдать в порт информацию или принять ее, необходимо считать данные из РВВ либо загрузить в них данные. Эти данные представляют собой 8-ми разрядные числа, но особенность МК AVR в том, что в РВВ нельзя напрямую загрузить данные либо считать эти данные из РВВ. Для этих целей необходимо использовать РОН, т.е. для записи в РВВ мы сначала наши данные помещаем в РОН, а потом пересылаем их в РВВ. Аналогично для чтения данных из РВВ нам необходимо их сначала загрузить из РВВ в РОН, а потом произвести с ними всякие непотребства.

   Следует заметить, что блок РОН можно разделить на 2 группы: РОН младшей половины регистрового файла (R0…R15) и РОН старшей половины регистрового файла (R16…R31). Разница заключается в том, что не все команды, относящиеся к старшей половине регистров, можно применить к младшей половине, то есть регистры R0…R15 получаются немного урезанными по набору команд.

   И теперь само ОЗУ. Это оперативная память, как в компьютере, предназначенная для хранения различных переменных, сохранение которых не требуется после отключения питания. Выделение места под переменные (задается в программе) идет он начала к концу ОЗУ. Также ОЗУ нужно для такой штуковины как стек, который является частью ОЗУ и служит для сохранения различных данных, а также для сохранения адресов при вызове подпрограмм и прерываний. Стек работает по принципу «первым зашел – последним вышел» и растет от конца ОЗУ к началу. 

   При использовании ОЗУ под переменные и стек необходимо следить за тем, чтобы одно не наехало на другое.

EEPROM

электрически стираемая программируемая постоянная память

   Тут все просто – электрически стираемая программируемая постоянная память размером 512 байт. В отличии от flash-памяти здесь адресация побайтная.

   Сюда можно сохранять всякие константы, данные, которые используются при работе программы, либо необходимо сохранить перед отключением питания и т.п. В EEPROM данные можно писать непосредственно при выполнении программы либо путем прошивки через прошивальщик (eep-файл). Если чтение из EEPROM в процессе работы МК осуществляется очень быстро, то запись в него происходит очень долго, несколько миллисекунд. Тут надо быть осторожным, чтоб при процессе записи в EEPROM не выскочило прерывание, а то запишем в итоге какую-либо бяку. Так что тут надо быть внимательней. Число циклов запись/стирание в EEPROM составляет 100000. Автор материала: skateman.

Originally posted 2019-09-26 04:47:30. Republished by Blog Post Promoter

Оставьте комментарий