Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVR Studio 5 вопросы по компилятору
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
egor_spqr
Доброго времени суток народ sm.gif

Столкнулся с проблемами в AVR Studio 5.

1. При отладке в дебаге на железе, в следующие процедуре
void main()
{
<операции инициализации>
for(;;)
{
<основной бесконечный цикл>
}
}
по идее программа должна крутится в бесконечном цикле оператора for. А она крутится то в main то в for.

2. Есть серия операций присвоения констант структуре в ходе выполнения программы.
E2.IDCode[0]=0xAF;
E2.IDCode[1]=0x5B;
E2.IDCode[2]=0x8D;
E2.IDCode[3]=0x5A;
E2.IDCode[4]=0x3D;
E2.IDCode[5]=0x91;
E2.IDCode[6]=0x00;
ассемблерный листинг от компиляции к компиляции может выкидывать инициализацию переменным с IDCode[2] по IDCode[6]
3. В проекте используются прерывания аппаратных модулей авр. Существует ситуация, когда при приходе прерывания в структуру данных, объявленную глобально, записывается некая информация - буквально байт. При приходе следующего прерывания этот байт самопроизвольно очищается, причем в теле обработчика прерываний эта область памяти не используется и операций с ней не проводится. Дебаггер показывает, что память портится именно в тот момент, когда приходит следующее прерывание.
ПыСы
Если тупо попытаться исключить ошибки дебаггера, и залить скомпиленую прошивку в авр, то глюки присутствуют -* авр не фурычит. А если идти по Ф11 по коду в процессе отладки то перечисленные баги 1 и 2 можно раза с третьего(с третьей компиляции) избежать, а вот третий баг вообще не поддается.
ПыСыСы
Проект портирован из IAR. И без ошибок компилится. Только вот неправильно sm.gif

Поможите ! Может кто сталкивался с этими вещами ?
IgorKossak
Стек маловат.
_Pasha
Цитата(IgorKossak @ Jan 19 2012, 11:56) *
Стек маловат.

Или не -Os
egor_spqr
поподробнее пожалуйста про стек. что вы имели ввиду, и если не трудно, применительно к AVR Studio 5

по поводу ключей компилятора: пробовал и без оптимизации - не помогает
IgorKossak
С AVR Studio не работаю, но если там есть способ указать размер стека, то это следует сделать (увеличить).
Обычно указатель стека инициализируется адресом верха ОЗУ.
Вообще то, если Вы отлаживаетесь на железе, то можете увидеть причину порчи переменных.
_Pasha
Цитата(egor_spqr @ Jan 19 2012, 15:34) *
по поводу ключей компилятора: пробовал и без оптимизации - не помогает

Как раз без оптимизации - самое и убьёт, не только не поможет.

Цитата(IgorKossak @ Jan 19 2012, 15:54) *
Вообще то, если Вы отлаживаетесь на железе, то можете увидеть причину порчи переменных.

Кстати, если с консолью - можно выводить значение SP из прерывания. Реалтайм, правда, не пойдет.
MrYuran
Цитата(IgorKossak @ Jan 19 2012, 15:54) *
С AVR Studio не работаю, но если там есть способ указать размер стека, то это следует сделать (увеличить).

В GCC (WinAVR) стек обычно движется навстречу переменным. Увеличить его можно, только уменьшив количество используемых глобальных и статических переменных.

Предложу ещё два магических заклинания:
1. volatile для переменных, изменяемых в прерываниях
2. __attribute__((used)) для структуры, чтобы её не коцал компилятор. Или тоже volatile, если выкидывает обращения к полям

А ещё лучше почитать документацию к WinAVR, там наверняка все тонкости оговорены отдельно
egor_spqr
Привет всем ишшо разик.
Значится так:

проблемы 1 и 3 оказались взаимосвязанными! Как показал дебаг в дисассемблере, AVR Studio не смогла корректно обработать неиспользуемые вектора внутренних прерываний.
В частности: инициализирован таймер, но вектор прерывания не описан, в этом случае процессор просто резетится.

Вывод: если уж решили чтото использовать в своем проекте, обязательно используйте, в противном случае необходимо или выпиливать инициализацию модулей, или описывать вектор хотя бы return'ом.
ARV
вообще-то говоря, что касается обработчиков прерываний - это очевиднейшая вещь sm.gif
MrYuran
Цитата(ARV @ Jan 20 2012, 17:11) *
вообще-то говоря, что касается обработчиков прерываний - это очевиднейшая вещь sm.gif

Странно, что WinAVR не ставит заглушки.
MSPGCC - ставит по умолчанию вектор _unexpected_
IgorKossak
Компилятор не обязан ставить никакие заглушки.
Подобные заглушки обычно находятся в файле startup.S или ему подобном или в предкомпиленной библиотеке или вообще отдаётся на откуп пользователю, а это уже никак не относится к компилятору.
ReAl
Цитата(MrYuran @ Jan 20 2012, 15:14) *
Странно, что WinAVR не ставит заглушки.
MSPGCC - ставит по умолчанию вектор _unexpected_

Заглушка есть (именно в стартап-файле) и называется __bad_interrupt.
Код
Disassembly of section .text:

00000000 <__vectors>:
   0:   12 c0           rjmp    .+36         ; 0x26 <__ctors_end>
   2:   2c c0           rjmp    .+88         ; 0x5c <__bad_interrupt>
   4:   2b c0           rjmp    .+86         ; 0x5c <__bad_interrupt>
   6:   2a c0           rjmp    .+84         ; 0x5c <__bad_interrupt>
Но она по умолчанию делает рестарт программы с адреса 0 (делает переход на weak-метку __vector_default)
Код
0000005c <__bad_interrupt>:
  5c:   d1 cf           rjmp    .-94         ; 0x0 <__vectors>

Можно в своём коде ловушку переопределить
Код
ISR(BADISR_vect) // это __vector_default и будет
{
}
и в ней сделать свои действия, корректно сворачивающие работу и, к примеру, мигающие светодиодом «караул».
Но ведь для этого надо сначал почитать документацию на WinAVR, описание библиотеки, файла avr/interrupt.h, параграфа «Catch-all interrupt vector». Гораздо проще документацию не читать, а при проблемах обвинять компилятор, он-де «неправильно собирает».
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.