Проект на меге8, довольно большой, компилирован на WinAvr C. С одной из последних модификаций, происходит циклический рестар (заметил по отладочной инфе, передаваемой на UART).
Не поленился, собрал эмуляцию в Proteus. Там выводит сообщение "PC 0xFFFF is out of programm memory size 0x2000". Понятно, переполнение стека.
Загрузил всю эту басню в AVRStudio, обратил внимание, что указатель стека находится на значении 0x025F - то есть не на самом верху памяти (0x2000), а гораздо ниже.
Кто знает, как поднять границу на самый верх?
Стек, правильно, растет сверху вниз. но становится не на RAMEND,а на какое-то непонятным образом полученное значение 0x25F. То есть для этого значения должны быть свои причины, которых я не знаю, но хотел бы узнать.
Программный код занимает 3072 байта, никак не 8к.
Пытался изменить параметры компиляции (не линковки), с опцией -minit-stack=0x2000 и 0x450. Откуда взял второе значение? в AVRStudio, в режиме отладки elf, если открыть страницу дампа секции data, то отображает именно этот объем. причем они забито все 0xFF - то есть явно не используется и не инициализировалось ничем. Примечательно, что после компиляции с этой опцией, Stack Pointer в AVRStudio не изменился, и имеет старое значение в 0x25F.
ошибка, выдаваемая протеусом - это баг протеуса, я уже об этом писал. на самом деле протеус не понимает, что счетчик команд в AVR физически не содержит битов для адресов больше, чем размер памяти, поэтому переход на адрес 0xFF00 протеус воспринимает как ошибку, а микроконтроллер AVR - как нормальный переход куда-то в начало своей памяти. WinAVR любит делать такие переходы, а протеус не любит.
что касается пересброса, то надо тщательно анализировать код программы, потому как переполнение стека - это что-то из разряда дикостей для AVR: говорит о грубейших просчетах программиста (например, рекурсия, в том числе и непредвиденная, ошибки с указателями и т.п.).
чаще пересброс возникает от более простых вещей, например, нет обработчика для разрешенного прерывания.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
svd71 писал(а):Стек, правильно, растет сверху вниз. но становится не на RAMEND,а на какое-то непонятным образом полученное значение 0x25F.
вообще-то 0x45F должно быть - размер RAM 1024 + смещение 0х60 ... и того 1024+0х60-1 = 0x45F , а 0x25F для 512-байтной RAM ... может вы что то путаете?
ChipKiller писал(а):параметр RAMEND определен в *.h файле, так что ИМХО и смотреть нужно туда ...а на -mmcu=atmega8 -minit-stack=0x45F -msize -D ошибку выдает?