На главную страницу | Новости | FAQ | Ссылки | Для детей | Контакты

ARDUINO ROBOTS
Arduino для начинающих электронщиков. Модули и проекты на базе Arduino. Разработка роботов


Как хранить данные в flash-памяти AVR


Некоторые особенности работы с (flash) памятью микроконтроллеров AVR (Arduino)


Если ОЗУ не хватает, то можно более эффективно использовать flash-память. Это возможно потому, что

- МК AVR имеют гарвардскую архитектуру.

Некоторые особенности микроконтроллеров AVR


Гарвардская архитектура --- специальная архитектура ЭВМ, отличительной особенностью которой является то, что инструкции и данные хранятся отдельно на разных физических устройствах; канал инструкций и канал данных так же физически разделены.

Язык C/C++ разрабатывался не для гарвардской архитектуры. Тем не менее использование макро-опреденией позволяет устранить этот недостаток.

Проблемы памяти


Чтобы хранить данные в памяти программ (flash-память), можно используется макрос PROGMEM. Он помещается в декларации переменной перед инициализатором. Подробнее здесь http://microsin.net/programming/avr/avrstudio-gcc-progmem.html

 #include < avr/pgmspace.h >
 const unsigned char mydata[11][10] PROGMEM = { }

Массив строк:

Чтобы поместить строки во flash, нужно явно объявить каждую строку:

const char string_1[] PROGMEM = "String 1";
const char string_2[] PROGMEM = "String 2";

И потом использовать новые символы в массиве:

PGM_P string_table[] PROGMEM = 
{
    string_1,
    string_2
};

void foo(void)
{
    char buffer[10];
    for (unsigned char i = 0; i < 5; i++)
    {
        strcpy_P(buffer, (PGM_P)pgm_read_word(&(string_table[i]))); 
       // Display buffer on LCD.
    }
    return;
}

Смысл приведенного кода очевиден - получение данных из массива происходит через указатель, выбираемый как 16-битное беззнаковое целое макросом pgm_read_word. Далее строка копируется функцией strcpy_P. Имеется множество функций для манипуляции строками в памяти программ с индексом _P, работающих так же, как и обычные строковые функции. Все эти функции с индексом _P также определены в заголовке .

В оперативной памяти (RAM), есть три области:

статических данных - в ней хранятся глобальные переменные, а также массиви и строки.

«куча»(heap) - используется при вызове функций malloc() и free();

«cтек»(stack) - используется, когда одна функция вызывает другую.

RAM

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

Надо помнить, что:

1) все C-строки также хранятся в оперативной памяти

2) все C-строки также хранятся во флэш-памяти. Одна из задач, выполняемых при запуске С-кода, состоит в том чтобы скопировать все строки из флэш-памяти в оперативную память.

3) Флэш-память организована в слова.

Использование FLASH-памяти на Arduino


На самом деле макросом PROGMEM я никогда не пользовался. Вместо этого в Wirgin есть макрос F(),

который в принципе решает проблему. Типичный пример его использования, когда мало RAM и много FLASH:

Serial.print(F("Write something on the Serial Monitor that is stored in FLASH"));




Платы ARDUINO по низкой цене

Нажми на изображение, чтобы заказать в интернет-магазине:


arduino NANO купить дешево arduino UNO купить дешево arduino UNO R3 ORIG купить дешево arduino MEGA купить дешево arduino DUE купить дешево



Now 23.04.24 14:27:37, Your IP: 18.218.184.214; arduino.zl3p.com/avr/flash
ePN