реклама на сайте
подробности

 
 
> AVR Studio 5 вопросы по компилятору, Компилятор некорректно собирает Си-шный код
egor_spqr
сообщение Jan 19 2012, 05:34
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 3-02-11
Пользователь №: 62 683



Доброго времени суток народ 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

Поможите ! Может кто сталкивался с этими вещами ?

Сообщение отредактировал egor_spqr - Jan 19 2012, 05:35
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 11)
IgorKossak
сообщение Jan 19 2012, 07:56
Сообщение #2


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Стек маловат.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 19 2012, 10:30
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(IgorKossak @ Jan 19 2012, 11:56) *
Стек маловат.

Или не -Os
Go to the top of the page
 
+Quote Post
egor_spqr
сообщение Jan 19 2012, 11:34
Сообщение #4





Группа: Новичок
Сообщений: 3
Регистрация: 3-02-11
Пользователь №: 62 683



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

по поводу ключей компилятора: пробовал и без оптимизации - не помогает
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 19 2012, 11:54
Сообщение #5


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



С AVR Studio не работаю, но если там есть способ указать размер стека, то это следует сделать (увеличить).
Обычно указатель стека инициализируется адресом верха ОЗУ.
Вообще то, если Вы отлаживаетесь на железе, то можете увидеть причину порчи переменных.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 19 2012, 11:56
Сообщение #6


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(egor_spqr @ Jan 19 2012, 15:34) *
по поводу ключей компилятора: пробовал и без оптимизации - не помогает

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

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

Кстати, если с консолью - можно выводить значение SP из прерывания. Реалтайм, правда, не пойдет.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jan 19 2012, 12:52
Сообщение #7


Беспросветный оптимист
******

Группа: Свой
Сообщений: 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 =)
Go to the top of the page
 
+Quote Post
egor_spqr
сообщение Jan 20 2012, 12:44
Сообщение #8





Группа: Новичок
Сообщений: 3
Регистрация: 3-02-11
Пользователь №: 62 683



Привет всем ишшо разик.
Значится так:

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

Вывод: если уж решили чтото использовать в своем проекте, обязательно используйте, в противном случае необходимо или выпиливать инициализацию модулей, или описывать вектор хотя бы return'ом.
Go to the top of the page
 
+Quote Post
ARV
сообщение Jan 20 2012, 13:11
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



вообще-то говоря, что касается обработчиков прерываний - это очевиднейшая вещь sm.gif


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jan 20 2012, 13:14
Сообщение #10


Беспросветный оптимист
******

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



Цитата(ARV @ Jan 20 2012, 17:11) *
вообще-то говоря, что касается обработчиков прерываний - это очевиднейшая вещь sm.gif

Странно, что WinAVR не ставит заглушки.
MSPGCC - ставит по умолчанию вектор _unexpected_


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 20 2012, 13:19
Сообщение #11


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Компилятор не обязан ставить никакие заглушки.
Подобные заглушки обычно находятся в файле startup.S или ему подобном или в предкомпиленной библиотеке или вообще отдаётся на откуп пользователю, а это уже никак не относится к компилятору.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 22 2012, 17:34
Сообщение #12


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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». Гораздо проще документацию не читать, а при проблемах обвинять компилятор, он-де «неправильно собирает».


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 05:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01466 секунд с 7
ELECTRONIX ©2004-2016