2009-10-19 4 views
3

У меня есть проект, где ATtiny2313V управляет матрицей 7x5 LED для отображения прокручиваемого текста. Чтобы отобразить текст, я создал шрифт, который хранится во флэш-памяти с остальной частью программы.Я переполняю флеш-память AVR с слишком большой программой?

Вся программа, включая весь шрифт, занимает 1106 байт. Но когда я загружаю его в чип, он, похоже, не работает; вместо этого он просто зажигает пару светодиодов, и все.

Однако, когда я удаляю большую часть шрифта и компилирую только с буквами от A до J, размер программы составляет 878 байт и работает отлично.

Это из-за переполнения флэш-памяти AVR?

Техническое описание для ATtiny2313V говорит о наличии 2 Кбайт вспышки! Как может быть 1106 байт слишком много?

ОБНОВЛЕНИЕ: Для того чтобы быть ясным, я использую цепочку инструментов, которую я использую, - это AVR Studio (для компиляции кода), а затем AVRDude для ее загрузки на микроконтроллер. Насколько мне известно, AVR Studio использует версию avr-gcc для компиляции кода.

+0

Как вы передаете файлы на avr? Какие инструменты вы используете?Например, AVRDude проверяет размер программы до передачи данных. – theomega

+0

Я использую AVRDude, который общается через Arduino, который был запрограммирован как программист ISP. AVRDude действительно проверяет размер отчетов о том, какая часть памяти была использована. Он говорит, что есть более 1106 байт, и что я использую менее 60% флэш-памяти. Область eeprom использует только 2 байта. Вот и все. – scraimer

ответ

2

Клянусь, есть что-то волшебное о ТАК; Я целыми неделями размахивал мозгами, пытаясь понять это, и, задав здесь вопрос, я наконец вижу, что смотрит на меня в лицо!

Ниже использование памяти для компиляции только с буквами AJ в шрифте:

AVR Memory Usage 
---------------- 
Device: attiny2313 

Program:  872 bytes (42.6% Full) 
(.text + .data + .bootloader) 

Data:   82 bytes (64.1% Full) 
(.data + .bss + .noinit) 

И здесь снова, с буквами AZ:

AVR Memory Usage 
---------------- 
Device: attiny2313 

Program:  952 bytes (46.5% Full) 
(.text + .data + .bootloader) 

Data:  162 bytes (126.6% Full) 
(.data + .bss + .noinit) 

Смотрите 126.6% в Данные? К сожалению! Я действительно переполнил!

+1

Scraimer, вы можете это исправить! Похоже, ваш шрифт использует Flash и RAM, а это означает, что вы не можете использовать специальные ключевые слова, чтобы сохранить данные шрифта только в Flash. См. Ответ Питера Гибсона и эту страницу для информации: http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html – dwhall

+0

Да, это я и сделал; переместил его на Flash. Благодаря :-) – scraimer

1

Проверьте, не переполнен ли стек? Это может привести к сбоям, которые трудно обнаружить. Вы можете либо установить размер стека где-нибудь в настройках компилятора/компоновщика, либо вы можете преобразовать некоторые локальные переменные в глобальные переменные. Вложенный процессор обычно не имеет никаких проверок для переполнения стека, он просто падает.

6

Я не уверен, какой инструмент цепи вы используете, но в Avr-GCC вам нужно использовать заголовок <avr/pgmspace.h> для хранения & доступа к данным вспышки - это не просто достаточно, чтобы объявить данные const как это по-прежнему загружается в память во время выполнения, и как таковая занимает место как в flash, так и в ram (как и любая другая инициализированная переменная).

Для получения дополнительной информации ознакомьтесь с User Manual и Header Docs. Useage довольно просто, чтобы объявить массив символов во флэш-памяти, используйте PROGMEM макросъемки:

char data[] PROGMEM = {0xc4, 0x77}; // etc 

Тогда для того, чтобы получить доступ к данным, необходимо использовать поставляемые макросы

char d = pgm_read_byte(&(data[i])); 

Edit: Кроме того имейте в виду, что avrdude только сообщает статически выделенные части ram (.data и .bss) для глобальных и статических переменных и т. д. Вам нужно оставить место для стека - насколько точно зависит ваша программа (подсказка: рекурсия плохая) ,