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

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

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

Сообщение svd71 »

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

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

Сообщение Vov123 »

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

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

Сообщение phanis »

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

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

Сообщение svd71 »

Стек, правильно, растет сверху вниз. но становится не на RAMEND,а на какое-то непонятным образом полученное значение 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, указатель стека

Сообщение ARV »

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

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

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

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

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

Сообщение svd71 »

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

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

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

Сообщение ChipKiller »

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

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

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

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

Сообщение ChipKiller »

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

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

Сообщение svd71 »

ChipKiller писал(а):.. такое ощущение, что настройки сделаны под Mega48 - там как раз 0x25F и должно быть (RAM=512 байт)

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

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

Сообщение ChipKiller »

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

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

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

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

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

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

Сообщение ChipKiller »

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

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

Сообщение svd71 »

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




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

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