Получил я заветный LCD TFT 320x240 ну и начал «моргать». Через некоторое время, освоившись с библиотекой и научившись довольно шустро управляться с рисованием я решил, что пора кодить. Соответственно, экран для вывода, а девайс должен быть красивым.
Быстренько накидал в фотошопе бекграунд для вывода на экран размером ровно с сам LCD. Дальше-больше. Включаю конвертер и кодирую jpg файл бекграунда в .c файлик. Файлик подключаю к проекту. Забиваю соответствие в массив. Отправляю комплилиться и на загрузку и тут:
"array 'back' is too large"
Ежу понятно, что массив великоват, но ежу не понятно с какого это вдруг. Через некоторое время неторопливых поисков я узнаю, что у микроконтроллеров AVR есть пресловутая «модель памяти», которую надо бы изменить на «small» в настройках и все, якобы, будет пучком.
Поиски расположения этой модели не увенчались успехом.
В связи с этим вопрос: как изменить модель памяти у AVR микроконтроллера ATMega 2560?
Да, по умолчанию компилятор пытается создать массив в RAM. При помощи ключевого слова progmem можно явно указать, что массив находится во flash. Правда тогда уже не получится менять содержимое этого массива в рантайме. Точнее, не получится без плясок с бубном (см. Selfprogramming).
Тогда давайте ссылку на тот пример, будем его ковырять.
> extern unsigned int info[0x400];
Это не инициализация. Слово extern говорит, что переменная объявлена где-то в другом файле. Как именно она там объявлена — надо смотреть. 0x400 = 1024, при 4-байтном int под этот массив нужно всего 4кб памяти => в RAM влезает. Скорее всего, в примере картинка хранится во flash, а на экран загружается кусками.
Нашел. Инициализируется в самом файле с кодированным изображением. Есть пресловутый PROGMEM, который забивает массив во flash память. И unsigned short. unsighed long занимает 4 байта. Получается, что тоже не влезет?