WinAver C, указатель стека

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс фев 06, 2011 16:18:39

Сообщение svd71 »

Проект на меге8, довольно большой, компилирован на WinAvr C. С одной из последних модификаций, происходит циклический рестар (заметил по отладочной инфе, передаваемой на UART).
Не поленился, собрал эмуляцию в Proteus. Там выводит сообщение "PC 0xFFFF is out of programm memory size 0x2000". Понятно, переполнение стека.
Загрузил всю эту басню в AVRStudio, обратил внимание, что указатель стека находится на значении 0x025F - то есть не на самом верху памяти (0x2000), а гораздо ниже.
Кто знает, как поднять границу на самый верх?
[url=http:///]:-)[/url]
Реклама
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

Указатель стека растёт сверху вниз и указывает последнюю ячейку,разве не так.По умолчанию указатель стека становится на RAMEND.
Реклама
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

"PC 0xFFFF is out of programm memory size 0x2000"
Я думаю что скомпилированный код получился более чем 8192 байта..
Контактная информация:
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс фев 06, 2011 16:18:39

Сообщение svd71 »

Стек, правильно, растет сверху вниз. но становится не на RAMEND,а на какое-то непонятным образом полученное значение 0x25F. То есть для этого значения должны быть свои причины, которых я не знаю, но хотел бы узнать.

Программный код занимает 3072 байта, никак не 8к.

Пытался изменить параметры компиляции (не линковки), с опцией -minit-stack=0x2000 и 0x450. Откуда взял второе значение? в AVRStudio, в режиме отладки elf, если открыть страницу дампа секции data, то отображает именно этот объем. причем они забито все 0xFF - то есть явно не используется и не инициализировалось ничем. Примечательно, что после компиляции с этой опцией, Stack Pointer в AVRStudio не изменился, и имеет старое значение в 0x25F.
[url=http:///]:-)[/url]
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ошибка, выдаваемая протеусом - это баг протеуса, я уже об этом писал. на самом деле протеус не понимает, что счетчик команд в AVR физически не содержит битов для адресов больше, чем размер памяти, поэтому переход на адрес 0xFF00 протеус воспринимает как ошибку, а микроконтроллер AVR - как нормальный переход куда-то в начало своей памяти. WinAVR любит делать такие переходы, а протеус не любит.

что касается пересброса, то надо тщательно анализировать код программы, потому как переполнение стека - это что-то из разряда дикостей для AVR: говорит о грубейших просчетах программиста (например, рекурсия, в том числе и непредвиденная, ошибки с указателями и т.п.).

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс фев 06, 2011 16:18:39

Сообщение svd71 »

Вот сообщение студии на реакцию программы: AVR Simulator: Excessive stack overflow, stop sim

Мня смущает то, что stack pointer имеет катастрофически малое значение, сопоставимое с размером памяти самых мелких tiny.
[url=http:///]:-)[/url]
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

svd71 писал(а):Стек, правильно, растет сверху вниз. но становится не на RAMEND,а на какое-то непонятным образом полученное значение 0x25F.
вообще-то 0x45F должно быть - размер RAM 1024 + смещение 0х60 ... и того 1024+0х60-1 = 0x45F , а 0x25F для 512-байтной RAM ... может вы что то путаете?
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс фев 06, 2011 16:18:39

Сообщение svd71 »

нет. не путаю. сейчас сделал обж-дамп. там такой код

Код: Выделить всё

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]
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

.. такое ощущение, что настройки сделаны под Mega48 - там как раз 0x25F и должно быть (RAM=512 байт)
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс фев 06, 2011 16:18:39

Сообщение svd71 »

ChipKiller писал(а):.. такое ощущение, что настройки сделаны под Mega48 - там как раз 0x25F и должно быть (RAM=512 байт)
ладно, выяснили, что дерьмо. теперь нужно весло придумать, как в нем грести.
кто знает, как передать правильно параметр стека ?
[url=http:///]:-)[/url]
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

параметр RAMEND определен в *.h файле, так что ИМХО и смотреть нужно туда ...а на -mmcu=atmega8 -minit-stack=0x45F -msize -D ошибку выдает?
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс фев 06, 2011 16:18:39

Сообщение svd71 »

Код: Выделить всё

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]
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс фев 06, 2011 16:18:39

Сообщение svd71 »

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]
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

... тогда проблема именно в Makefile
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс фев 06, 2011 16:18:39

Сообщение svd71 »

ChipKiller писал(а):... тогда проблема именно в Makefile


проблема в самом winavr, а вот решение в makefile.
[url=http:///]:-)[/url]
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»