WinAver C, указатель стека
WinAver C, указатель стека
Проект на меге8, довольно большой, компилирован на WinAvr C. С одной из последних модификаций, происходит циклический рестар (заметил по отладочной инфе, передаваемой на UART).
Не поленился, собрал эмуляцию в Proteus. Там выводит сообщение "PC 0xFFFF is out of programm memory size 0x2000". Понятно, переполнение стека.
Загрузил всю эту басню в AVRStudio, обратил внимание, что указатель стека находится на значении 0x025F - то есть не на самом верху памяти (0x2000), а гораздо ниже.
Кто знает, как поднять границу на самый верх?
Не поленился, собрал эмуляцию в Proteus. Там выводит сообщение "PC 0xFFFF is out of programm memory size 0x2000". Понятно, переполнение стека.
Загрузил всю эту басню в AVRStudio, обратил внимание, что указатель стека находится на значении 0x025F - то есть не на самом верху памяти (0x2000), а гораздо ниже.
Кто знает, как поднять границу на самый верх?
[url=http:///]
[/url]
Re: WinAver C, указатель стека
Указатель стека растёт сверху вниз и указывает последнюю ячейку,разве не так.По умолчанию указатель стека становится на RAMEND.
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: WinAver C, указатель стека
Я думаю что скомпилированный код получился более чем 8192 байта.."PC 0xFFFF is out of programm memory size 0x2000"
Re: WinAver C, указатель стека
Стек, правильно, растет сверху вниз. но становится не на RAMEND,а на какое-то непонятным образом полученное значение 0x25F. То есть для этого значения должны быть свои причины, которых я не знаю, но хотел бы узнать.
Программный код занимает 3072 байта, никак не 8к.
Пытался изменить параметры компиляции (не линковки), с опцией -minit-stack=0x2000 и 0x450. Откуда взял второе значение? в AVRStudio, в режиме отладки elf, если открыть страницу дампа секции data, то отображает именно этот объем. причем они забито все 0xFF - то есть явно не используется и не инициализировалось ничем. Примечательно, что после компиляции с этой опцией, Stack Pointer в AVRStudio не изменился, и имеет старое значение в 0x25F.
Программный код занимает 3072 байта, никак не 8к.
Пытался изменить параметры компиляции (не линковки), с опцией -minit-stack=0x2000 и 0x450. Откуда взял второе значение? в AVRStudio, в режиме отладки elf, если открыть страницу дампа секции data, то отображает именно этот объем. причем они забито все 0xFF - то есть явно не используется и не инициализировалось ничем. Примечательно, что после компиляции с этой опцией, Stack Pointer в AVRStudio не изменился, и имеет старое значение в 0x25F.
[url=http:///]
[/url]
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: WinAver C, указатель стека
ошибка, выдаваемая протеусом - это баг протеуса, я уже об этом писал. на самом деле протеус не понимает, что счетчик команд в AVR физически не содержит битов для адресов больше, чем размер памяти, поэтому переход на адрес 0xFF00 протеус воспринимает как ошибку, а микроконтроллер AVR - как нормальный переход куда-то в начало своей памяти. WinAVR любит делать такие переходы, а протеус не любит.
что касается пересброса, то надо тщательно анализировать код программы, потому как переполнение стека - это что-то из разряда дикостей для AVR: говорит о грубейших просчетах программиста (например, рекурсия, в том числе и непредвиденная, ошибки с указателями и т.п.).
чаще пересброс возникает от более простых вещей, например, нет обработчика для разрешенного прерывания.
что касается пересброса, то надо тщательно анализировать код программы, потому как переполнение стека - это что-то из разряда дикостей для AVR: говорит о грубейших просчетах программиста (например, рекурсия, в том числе и непредвиденная, ошибки с указателями и т.п.).
чаще пересброс возникает от более простых вещей, например, нет обработчика для разрешенного прерывания.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: WinAver C, указатель стека
Вот сообщение студии на реакцию программы: AVR Simulator: Excessive stack overflow, stop sim
Мня смущает то, что stack pointer имеет катастрофически малое значение, сопоставимое с размером памяти самых мелких tiny.
Мня смущает то, что stack pointer имеет катастрофически малое значение, сопоставимое с размером памяти самых мелких tiny.
[url=http:///]
[/url]
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: WinAver C, указатель стека
вообще-то 0x45F должно быть - размер RAM 1024 + смещение 0х60 ... и того 1024+0х60-1 = 0x45F , а 0x25F для 512-байтной RAM ... может вы что то путаете?svd71 писал(а):Стек, правильно, растет сверху вниз. но становится не на RAMEND,а на какое-то непонятным образом полученное значение 0x25F.
Re: WinAver C, указатель стека
нет. не путаю. сейчас сделал обж-дамп. там такой код
не ожидал этого от winAVR. со значение разобрался, точно был не прав. Но вот передать желаемое значение не удается
Код: Выделить всё
00000152 <__ctors_end>:
152: 11 24 eor r1, r1
154: 1f be out 0x3f, r1 ; 63
156: cf e5 ldi r28, 0x5F ; 95
158: d2 e0 ldi r29, 0x02 ; 2
15a: de bf out 0x3e, r29 ; 62
15c: cd bf out 0x3d, r28 ; 61
не ожидал этого от winAVR. со значение разобрался, точно был не прав. Но вот передать желаемое значение не удается
Код: Выделить всё
rm -f dimmer.o
avr-gcc -g3 -gdwarf-2 -mmcu=atmega8 -minit-stack=1000 -DF_CPU=1000000UL -O1 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -ffunction-secti
ons -Wall -Wextra -Wstrict-prototypes -Wundef -Wsign-compare -Wa,-adhlns=./cbdlight/dimmer.lst -std=gnu99 -O1 -c cbdlight/dimmer.c
cc1.exe: error: unrecognized command line option "-minit-stack=1000"
make.EXE: *** [dimmer.o] Error 1
[url=http:///]
[/url]
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: WinAver C, указатель стека
.. такое ощущение, что настройки сделаны под Mega48 - там как раз 0x25F и должно быть (RAM=512 байт)
Re: WinAver C, указатель стека
ChipKiller писал(а):.. такое ощущение, что настройки сделаны под Mega48 - там как раз 0x25F и должно быть (RAM=512 байт)
ладно, выяснили, что дерьмо. теперь нужно весло придумать, как в нем грести.
кто знает, как передать правильно параметр стека ?
[url=http:///]
[/url]
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: WinAver C, указатель стека
параметр RAMEND определен в *.h файле, так что ИМХО и смотреть нужно туда ...а на -mmcu=atmega8 -minit-stack=0x45F -msize -D ошибку выдает?
Re: WinAver C, указатель стека
Код: Выделить всё
avr-gcc -g3 -gdwarf-2 -mmcu=atmega8 -minit-stack=0x45F -msize -DF_CPU=1000000UL -O1 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -ffunct
ion-sections -Wall -Wextra -Wstrict-prototypes -Wundef -Wsign-compare -Wa,-adhlns=./cbdlight/dimmer.lst -std=gnu99 -O1 -c cbdlight/dimmer.c
cc1.exe: error: unrecognized command line option "-minit-stack=0x45F"
make.EXE: *** [dimmer.o] Error 1[url=http:///]
[/url]
Re: WinAver C, указатель стека
ChipKiller писал(а):параметр RAMEND определен в *.h файле, так что ИМХО и смотреть нужно туда ...а на -mmcu=atmega8 -minit-stack=0x45F -msize -D ошибку выдает?
avr/io8.h
Код: Выделить всё
/* Constants */
#define SPM_PAGESIZE 64
#define RAMEND 0x45F
#define XRAMEND RAMEND
#define E2END 0x1FF
#define E2PAGESIZE 4
#define FLASHEND 0x1FFF
так что там все впорядке
[url=http:///]
[/url]
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: WinAver C, указатель стека
... тогда проблема именно в Makefile
Re: WinAver C, указатель стека
ChipKiller писал(а):... тогда проблема именно в Makefile
проблема в самом winavr, а вот решение в makefile.
[url=http:///]
[/url]