На главную страницу | Новости | FAQ | Ссылки | Для детей | Контакты
Если ОЗУ не хватает, то можно более эффективно использовать flash-память. Это возможно потому, что
- МК 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), и расширяется вниз, по направлению к области кучи. Область стека расширяется и освобождается при необходимости вызова других функций. В нём же хранятся локальные переменные.
Надо помнить, что:
1) все C-строки также хранятся в оперативной памяти
2) все C-строки также хранятся во флэш-памяти. Одна из задач, выполняемых при запуске С-кода, состоит в том чтобы скопировать все строки из флэш-памяти в оперативную память.
3) Флэш-память организована в слова.
На самом деле макросом PROGMEM я никогда не пользовался. Вместо этого в Wirgin есть макрос F(),
который в принципе решает проблему. Типичный пример его использования, когда мало RAM и много FLASH:
Serial.print(F("Write something on the Serial Monitor that is stored in FLASH"));
Now 24.11.24 5:22:05, Your IP: 3.133.133.39; arduino.zl3p.com/avr/flash
ePN