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

 
 
 
Reply to this topicStart new topic
> ATmega128, Оптимизация и стек
RAmsi
сообщение Nov 13 2010, 18:57
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 5-04-09
Пользователь №: 47 200



Всем доброго времени суток.
Вопрос в следующем. Решил попробовать на зуб Мегу128.
Написал простенькую программку мигания светодиодами.
В AVR Studio нормально все эмулируется. В железе - глюки. Светодиоды нормально мигают только при оптимизации -03. При остальных вариантах оптимизации - молчание.
Проблема полностью исчезает при жестком указании нижней границы стека Specify Initial Stack Address 0x1000. Мигают при любой установке оптимизатора, в том числе и при его отключении.
Объяснить такое поведение не могу - знаний и опыта маловато. Каким образом подъем начального адреса стека оказывает такое влияние - не могу понять.
Интуитивно догадываюсь, что проблемы связаны с адресацией памяти.
По старой привычке прошиваю КодВижном через AVR910. Тактирую кварцем 4МГц. Все фъюзы, в том числе и М103С = 1.
Подскажите, пожалуйста, куда копать. Железяка хоть и работает, и программка - проще некуда, но не хочется дальше двигаться не разобравшись.
Спасибо.
CODE
#define F_CPU 4000000UL
#include <util/delay.h>
#include <avr/io.h>

#define SET_bit(x) |=(1<<x)
#define CLEAR_bit(x) &=~(1<<x)
#define INVERT_bit(x) ^=(1<<x)


void blink(void)
{
PORTA = 0b00000000;
_delay_ms(70);
PORTA = 0b11111111;
_delay_ms(70);
PORTA = 0b00000000;
_delay_ms(70);
PORTA = 0b11111111;
_delay_ms(70);
PORTA = 0b00000000;
_delay_ms(70);
PORTA = 0b11111111;
_delay_ms(70);
PORTA = 0b00000000;
_delay_ms(200);
}

void IOinit(void)
{
PORTA = 0b00000000; // Port A all LL
DDRA = 0b11111111; // all OUT

PORTB = 0b11111111; // Port B all pull-up
DDRB = 0b00000000; // all IN

PORTC = 0b00000000; // Port C all LL
DDRC = 0b11111111; // all OUT

PORTD = 0b11111111; // Port D all pull-up
DDRD = 0b00000000; // all IN

PORTE = 0b11111111; // Port E all pull-up
DDRE = 0b00000000; // all IN

PORTF = 0b11111111; // Port F all pull-up
DDRF = 0b00000000; // all IN

PORTG = 0b00011111; // Port G all pull-up
DDRG = 0b00000000; // all IN

// Timer/Counter 0
ASSR=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;

// Timer/Counter 2
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// Timer/Counter 3
TCCR3A=0x00;
TCCR3B=0x00;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;

// External Interrupt(s)
EICRA=0x00;
EICRB=0x00;
EIMSK=0x00;

// Timer(s)/Counter(s) Interrupt(s)
TIMSK=0x00;
ETIMSK=0x00;

// Analog Comparator
ACSR=0x80;
SFIOR=0x00;
}


int main ()
{

IOinit();

while (1)
{

blink();

};
return (0);
}


Сообщение отредактировал IgorKossak - Nov 13 2010, 19:34
Причина редактирования: Используйте тэги codebox
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 13 2010, 19:35
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Обычно стек инициализируется примерно так: SP=RAMEND;
В Вашем случае объём ОЗУ = 4096 = 0x1000.
RAMEND=0x0fff

При каком объёме стека перестаёт работать программа?

Что у Вас со сторожевым таймером?
Он внутри процедуры _delay_ms(xxx) сбрасывается?
Что за компилятор?
Инициализацию всей периферии можно выкинуть (посмотрите чему равны значения регистров периферии после включения контроллера).
Оставьте только DDRA = 0xff;

Цитата(RAmsi @ Nov 13 2010, 21:57) *
Все фъюзы... = 1.
это смущает тоже.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
RAmsi
сообщение Nov 13 2010, 20:32
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 5-04-09
Пользователь №: 47 200



Компиляция в WinAVR - GCC.
Нижнюю границу стека выставлял в Memory Settings. В Makefile появляется --defsym=__stack=0x1000 -Wl. С нижней границей памяти не экспериментировал - пробовал только одно значение 0х1000. Ну и судя по всему - нижний предел 0х10FF когда не выставлял границу принудительно. При эмуляции в Студии сбоев нет. Ну а до каких объемов он вырастает в железе - кто его знает.
Сторожевой таймер не активировал. WDE = 0x00.

PS
Глюки наступают при границе --defsym=__stack=0x1002 -Wl и ниже. Но все начинает работать, как только выставляю оптимизацию -O3

Сообщение отредактировал RAmsi - Nov 13 2010, 21:20
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 14 2010, 09:22
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(RAmsi @ Nov 13 2010, 23:32) *
Ну а до каких объемов он вырастает в железе - кто его знает.
Судя по "сложности" тестовой программы ни до каких пор он не вырастает - максимум байт на 10.

Вы внешнюю RAM цепляеете?
Из-за чего танцы со стеком?

Цитата(RAmsi @ Nov 13 2010, 23:32) *
Компиляция в WinAVR - GCC.
Какая версия?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
RAmsi
сообщение Nov 14 2010, 10:02
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 5-04-09
Пользователь №: 47 200



Цитата(demiurg_spb @ Nov 14 2010, 12:22) *
Судя по "сложности" тестовой программ ни до каких пор он не вырастает - максимум байт на 10.


Разбухать ему действительно не на чем. Памяти много. Затирание стека данными отпадает.

Цитата(demiurg_spb @ Nov 14 2010, 12:22) *
Вы внешнюю RAM цепляеете?
Из-за чего танцы со стеком?


Не из-за чего. Дополнительно память не цеплял. Просто менял разные параметры и смотрел на реакцию. Вот и наткнулся на стек.

Цитата(demiurg_spb @ Nov 14 2010, 12:22) *
Какая версия?


WinAVR - 20090313, AVRStudio - 4.16.628

Сообщение отредактировал RAmsi - Nov 14 2010, 10:03
Go to the top of the page
 
+Quote Post

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

 


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


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