Возникло непреодолимое желание увеличить количество ОЗУ, с этой целью было подключено внешняя SRAM размером 64к.
Теперь пытаюсь обьяснить компилятору что у меня подключено внешнее ОЗУ:
1) Пишу в make-файле
Код
EXTMEMOPTS = -Wl,-Tdata=0x802200,--defsym=__heap_end=0x80ffff
адрес 0x802200 т.к. у нас atmega1280, а там 8к байт ОЗУ.
2) Далее читаю FAQ по avr-libc, одновременно передирая код
ОТ СЮДА (ссылка)Код
#include <avr/io.h>
/*
* place a function in the '.init1' section to enable external RAM so
* that the C runtime startup can initialize it during C startup.
*/
void enable_external_ram (void) __attribute__ ((naked)) __attribute__ ((section (".init1")));
void enable_external_ram(void)
{
/*
* enable external memory, no wait states
*/
MCUCR |= _BV(SRE);
}
После этих манипуляций, в теле программы я пишу следующий код
Код
int massiv[100][100];
void TTechnolog::Exec()
{
........
/* Заполняем ОЗУ какими-то данными */
for(i=0;i<100;i++)
for(j=0;j<100;j++)
if(i%2)
massiv[i][j]=0x55;
else
massiv[i][j]=0x11;
........
таким образом я добиваюсь того что у меня
Цитата
Size after:
main.elf :
section size addr
.data 192 8389120
.text 32744 0
.bss 24400 8389312
.stab 66576 0
.stabstr 26615 0
Total 150527
Т.е. получаем полностью заполненное внутренее ОЗУ, и немного заполненное внешнее (насколько я понимаю сам процесс). До всех манипуляций секция .bss была равна 4400 и мы получили ожидаемое приращение в размере в 20к байт!
Следовательно, ожидаю увидеть работающий процессор, но вместо этого он "висит"... Вероятность ошибки в других участках кода низка, т.к. когда я привожу файлы в исходное состояние, то плата полностью работает и весело моргает светодиодами!
В идеале хочется просто расширить адресное пространство ОЗУ без учета потери производительности из-за увеличения времени доступа к внешней памяти!
Для компиляции используется avr-c++, WinAVR 20070525.
Что я неправильно делаю???