prosty delay i avrdude.

0

Siedzę dziś i jestem załamany.
Prosta funkcja delay:

void delay(void){
uint16_t x, y;
  for (x=0xffff; x!=0; x--){
    for (y=0xffff; y!=0; y--){;;}
}

Kompiluje się bez błędów, a działać nie chce. Program ją wywołuje bo jak zrobie while(1) w niej to się zatrzymuje. A delay nie działa.
Co jest grane? czy avrdude coś knoci??? czy może ja coś źle robię??
Próbowałem rówież standardowo:

void delay(void){
uint16_t x, y;
  for (x=0; x<0xffff; x++){
    for (y=0; y<0xffff; y++){;;}
}

Ale nic z tego. Delay nie działa.
Na sdcc dla 8051 wszystko ładnie działa. Na eclips+avrplugin nie.

0

A może po prostu kompilator jest na tyle sprytny że sobie to optymalizuje i usuwa taką pętlę bo widzi że nic się w niej nie dzieje? ;)

1

Sugerujesz wyłączenie (chociaż na moment) optymalizacji.. hmm Jak piszesz to Ty to coś musi być na rzeczy ;). Zaraz będzie doświadczenie....

dodanie do zmiennej volatile załatwiło problem. Miałeś rację. Ech... ciężki temat z kompilatorami. jeden tak, drugi tak...

0

Skompiluj to sobie do poziomu asemblera (sam taki fragment) i zobacz co ci kompilator z tego zrobi. Ja zakładam że pętli tam nie będzie po prostu ;]

0

Trudno jest pisać „kod który nic nie robi”, bo optymalizator do tego służy, by go wycinać, jak coś takiego znajdzie...

0
Azarien napisał(a):

Trudno jest pisać „kod który nic nie robi”, bo optymalizator do tego służy, by go wycinać, jak coś takiego znajdzie...

Tak masz rację, ale na etapie nauki, takie zachowania kompilatora często zaskakują osobę pisząca. Mnie zaskoczyło to dlatego ze używam też sdcc, który nie robi problemu z takimi funkcjami (widać to po kodzie i jego wielkości- oczywiście na jego niekorzyść). Dla tego zostałem "wkręcony".

1 użytkowników online, w tym zalogowanych: 0, gości: 1