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

 
 
> 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
Ответов
IgorKossak
сообщение Jan 19 2012, 11:54
Сообщение #2


Шаман
******

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



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


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

Группа: Свой
Сообщений: 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



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

 


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


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