|
AVR Studio 5 вопросы по компилятору, Компилятор некорректно собирает Си-шный код |
|
|
|
Jan 19 2012, 05:34
|
Группа: Новичок
Сообщений: 3
Регистрация: 3-02-11
Пользователь №: 62 683

|
Доброго времени суток народ  Столкнулся с проблемами в 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. И без ошибок компилится. Только вот неправильно  Поможите ! Может кто сталкивался с этими вещами ?
Сообщение отредактировал egor_spqr - Jan 19 2012, 05:35
|
|
|
|
|
 |
Ответов
(1 - 11)
|
Jan 19 2012, 11:34
|
Группа: Новичок
Сообщений: 3
Регистрация: 3-02-11
Пользователь №: 62 683

|
поподробнее пожалуйста про стек. что вы имели ввиду, и если не трудно, применительно к AVR Studio 5
по поводу ключей компилятора: пробовал и без оптимизации - не помогает
|
|
|
|
|
Jan 19 2012, 11:56
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(egor_spqr @ Jan 19 2012, 15:34)  по поводу ключей компилятора: пробовал и без оптимизации - не помогает Как раз без оптимизации - самое и убьёт, не только не поможет. Цитата(IgorKossak @ Jan 19 2012, 15:54)  Вообще то, если Вы отлаживаетесь на железе, то можете увидеть причину порчи переменных. Кстати, если с консолью - можно выводить значение SP из прерывания. Реалтайм, правда, не пойдет.
|
|
|
|
|
Jan 19 2012, 12:52
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(IgorKossak @ Jan 19 2012, 15:54)  С AVR Studio не работаю, но если там есть способ указать размер стека, то это следует сделать (увеличить). В GCC (WinAVR) стек обычно движется навстречу переменным. Увеличить его можно, только уменьшив количество используемых глобальных и статических переменных. Предложу ещё два магических заклинания: 1. volatile для переменных, изменяемых в прерываниях 2. __attribute__((used)) для структуры, чтобы её не коцал компилятор. Или тоже volatile, если выкидывает обращения к полям А ещё лучше почитать документацию к WinAVR, там наверняка все тонкости оговорены отдельно
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jan 20 2012, 12:44
|
Группа: Новичок
Сообщений: 3
Регистрация: 3-02-11
Пользователь №: 62 683

|
Привет всем ишшо разик. Значится так:
проблемы 1 и 3 оказались взаимосвязанными! Как показал дебаг в дисассемблере, AVR Studio не смогла корректно обработать неиспользуемые вектора внутренних прерываний. В частности: инициализирован таймер, но вектор прерывания не описан, в этом случае процессор просто резетится.
Вывод: если уж решили чтото использовать в своем проекте, обязательно используйте, в противном случае необходимо или выпиливать инициализацию модулей, или описывать вектор хотя бы return'ом.
|
|
|
|
|
Jan 22 2012, 17:34
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(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». Гораздо проще документацию не читать, а при проблемах обвинять компилятор, он-де «неправильно собирает».
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|