ограничение размера программы atmega8?

Я новичок в atmega8. Я конвертирую старый код FreeSacle в atmega8. а кажется мой чип не может вместить код больше 2400 байт? ниже результат, когда код 2412 байт... все становится беспорядком.

код ниже avrdude взят из «cat /dev/ttyUSB0». моя отладочная информация.

avrdude: verifying ...
avrdude: 2412 bytes of flash verified
avrdude: safemode: Fuses OK
avrdude done.  Thank you.

55432111001-0000 6Gn�H(�h�X0443234554321190 6Gn�H        (�h�X0443234554321100-FD-90-6F55432111001-0000 6Gn�H    (�h�X0443234554321190 6Gn�H(�h�X0443234554321100-FD-90-6F^C

но если я уменьшил код (только аудиоданные), я получил правильный результат.

avrdude: verifying ...
avrdude: 2312 bytes of flash verified
avrdude: safemode: Fuses OK
avrdude done.  Thank you.

AVR-IrDA-Tone-Audio start.
version 1.2
--IrDA--    Bin: 1001-0000      Hex: 90     Complete Hex: 00-FD-90-6F

все биты hfuse, lfuse, lock имеют исходное значение. мой код может быть 6k с некоторыми аудиоданными.

если это из-за раздела boot flash?

Дополнение: ------------------------------------------------ --------------------------------------------------

Сейчас меняю кристалл на 8М.

● ll h8-*
-rw-rw-r-- 1 eexp eexp 933  9月 22 00:27 h8-reduce.c
-rw-rw-r-- 1 eexp eexp 14K  9月 22 00:26 h8-org.c

● cp h8-org.c h8.c

● avr.sh main.c
......
avrdude: 5272 bytes of flash verified

теперь все идет бардак.

● cp h8-reduce.c h8.c

● avr.sh main.c
.....
avrdude: 1872 bytes of flash verified

теперь все идет хорошо, но я потерял почти все аудиоданные.

ниже h8.c.

● head h8.c
const unsigned char h8[] =
{
    36,14,0,0,129,129,128,129,130,127,126,128,128,127,128,130,131,128,127,127,127,126,127,129,130,130,129,129,128,128,128,128,128,126,126,129,128,127,127,130,133,130,126,126,129,128,125,127,128,129,128,127,129,128,127,127,127,128,128,129,127,127,129,128,130,130,128,128,127,126,128,128,128,130,129,128,129,126,126,125,127,132,130,127,126,129,131,127,127,133,133,127,122,125,129,130,127,127,130,129,
    126,125,127,128,129,128,128,128,128,127,127,129,128,129,129,128,126,127,129,127,128,127,128,130,129,129,128,128,127,127,129,130,128,128,129,129,127,127,128,128,128,128,128,128,126,126,129,129,127,129,130,130,126,126,128,128,127,128,131,130,127,126,126,128,129,125,128,130,131,128,126,129,128,129,125,126,130,129,131,130,131,129,125,128,129,131,130,127,130,129,127,128,127,129,128,126,126,127,128,126,
    127,127,128,128,128,127,127,127,127,127,129,128,129,128,128,129,129,128,128,129,128,128,128,129,0xff,
};

person eexpress    schedule 21.09.2012    source источник


Ответы (1)


Я думаю, вы загружаете аудиоданные в оперативную память. объявление переменной, например

  char* data = "somerandomdata"; 

помещает все данные в SRAM, и у вас есть только 1 КБ SRAM в mega8 (который также содержит стек и т. д.).

если биты блокировки находятся в исходном состоянии, механизм загрузчика не должен вызывать эту ошибку.

вы должны указать аудиоданные как пространство программы, вот описание того, как:

Avr LibC PGM Space

вот как должен выглядеть ваш код: h4.c

       #include <avr/pgmspace.h>

       const unsigned char h4[] PROGMEM = { 18,7,0,0,128,128,128,127,127,129,129,127,126,128,130,129,128,129,127,127,128,12‌​8,132,127,129,126,128,128,127,127,127,129,127,127,130,129,127,127,129,130,129,125‌​,

вам нужно настроить функцию set_audio, каждое чтение указателя h4 должно выполняться таким образом: например, изменить

  value = *h4_copy++;

to

  value = pgm_read_byte(h4_copy); h4_copy++;    
person user287107    schedule 21.09.2012
comment
мой код здесь: ● ​​grep h4 irda.c 33: if(i==0){set_audio((char *)h4);return;} ● head -n 3 h4.c const unsigned char h4[] = { 18 , 7,0,0,128,128,128,127,127,129,129,127,126,128,130,129,128,129,127,127,128,128,132,127,129,126,128,128,127,127,127,129,127,127,130,129,127,127,129,130,129,125,129,129,128,129,129,132,123,129,129,128,127,125,129,127,128,127,129,129,127,128,127,129,129,128,127,128,129,129,127,127,128,128,126,129,128,131,126,128,126,131,127,127,128,127,130,127,129,126,129,130,130,126,130,129,129,128,128,128, - person eexpress; 21.09.2012
comment
комментарии не могут вводить ‹Enter›. извините за сумбурный пост. Я также вижу свой шестнадцатеричный файл. все h4[] находятся в коде. - person eexpress; 21.09.2012
comment
Хорошо, именно так данные помещаются в очень ограниченную SRAM. Я редактирую свой пост, чтобы показать, как он должен выглядеть - person user287107; 21.09.2012
comment
спасибо, возможно вы правы. я прочитал это. теперь я делаю так: ; const PROGMEM unsigned char sinwave[] ={.....}; и может видеть, что sinwave находится во флэш-памяти. asm показывает этот код. тон=(char *)sinwave; я = pgm_read_byte (тон); тон++; затем прочитать данные. Кажется, все может быть в порядке, но все же, если массив слишком длинный, процессор сбрасывается, когда я запускаю событие. когда я сокращаю свои аудиоданные, это работает. теперь я путаю, куда идут эти данные, когда я не использую PROGMEM. потому что я вижу, что эти данные находятся в моем шестнадцатеричном файле, который может быть записан в чип и все еще может работать. каждый раз загружаться в оперативку? - person eexpress; 22.09.2012
comment
затем вы загружаете весь контент в свою маленькую SRAM. вам нужно изменить свой код для производительности памяти, поэтому вам нужно изменить функцию тона, чтобы считывать память из флэш-памяти непосредственно перед тем, как потребуются данные. в данный момент вы используете буфер, которому нужно много памяти. - person user287107; 22.09.2012
comment
все готово... спасибо. я обнаружил, что прерывание T2_OVF включено, и я никогда не записываю код ISR. я выключил его. - person eexpress; 22.09.2012
comment
Для голосования требуется 15 репутации. простите - person eexpress; 22.09.2012