PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : frage zum compilen



sahra
21.12.2010, 14:47
hallo, kann mir jemand bitte sagen wo der Fehler in diesem Prog ist, wenn ich das Prog schrittweise laufen lasse hängt er bei else der geht gar nicht in der For schleife. liegt das an dem Prog oder an Hardware oder an irgend eine Bibliotek die man einfügen soll.
danke.
hier ist das Prog

#include <avr/io.h>
#include <stdint.h>
#include<stdio.h>



int main (void) {
int8_t i;

DDRB = 0xff; /*als Ausgang definieren */
PORTB = 1<<0;

while(1)
{
if(PORTB==0x01)
{ PORTB = 0x04;
}
else if(PORTB==0x04)
{ PORTB=0x01;
}
for( i=0 ;i<255;i++)
{
}

}
return 0;
}

markusj
21.12.2010, 18:26
1. Bitte das nächste Mal Quellcode

hier rein
2. Die For-Schleife tut nichts - Der Compiler darf (und wird) sie wegoptimieren.

Wie wäre es, wenn du Mal beschreibst was der Code eigentlich tun sollte, vielleicht können wir dir dann auf den richtigen Weg helfen.

mfG
Markus

sahra
22.12.2010, 11:36
1. Bitte das nächste Mal Quellcode

hier rein
2. Die For-Schleife tut nichts - Der Compiler darf (und wird) sie wegoptimieren.

Wie wäre es, wenn du Mal beschreibst was der Code eigentlich tun sollte, vielleicht können wir dir dann auf den richtigen Weg helfen.

mfG
Markus
danke

das Programm soll einfach led an pb0 einschlaten und nach einer Warteschleife pb0 aus und pb2 einschalten und Umgekhert.


#include <avr/io.h>
#include <stdint.h>


int main (void) {
int8_t i;

DDRB = 0xff; /*als Ausgang definieren */
PORTB = 1<<0;


while(1)
{

if(PORTB==0x01)
PORTB = 0x04;

else if(PORTB==0x04)
PORTB=0x01;
for( i=0;i<20; i++)
{
}

}
return 0;
}

markusj
22.12.2010, 11:44
Hallo sahra,

dann sieh dir Mal die Funktionen _delay_ms und _delay_us (Header util/delay.h (http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html)) an.

Deine For-Schleife tut nichts was einen bleibenden Effekt hat, die Zählvariable wird nie wirklich verwendet, ergo kann der Compiler sie wegoptimieren. Damit läuft dein Programm einfach nur mit Maximalgeschwindigkeit.
Ersetze die Schleife daher durch eines der oben genannten Funktionen, die erzeugen dann die gewünschte Verzögerung.

Wichtig bei der Verwendung von Funktionen aus delay.h ist nur, dass du das Makro F_CPU entweder beim Compileraufruf oder vor der include-Direktive definierst. Normalerweise ist ersteres Variante bereits im Makefile enthalten und muss nur auf die Frequenz des AVR angepasst werden.

mfG
Markus

sahra
22.12.2010, 11:56
ja klar mit _delya_ms hat es super funktionniert, aber in diesem Prog zeigt er keinen Fehler, und warum geht er nicht in For Schleife rein. auch in der Datei Test.lss ist die Funktion for gar nicht übersetzt.
VG
sahra

askazo
22.12.2010, 12:04
Wie markus schon schrieb: Deine for-Schleife ist leer, daher wird sie vom Compiler als sinnlos angesehen und wegoptimiert. Wenn Du einfach nur 20 Taktzyklen warten möchtest, kannst Du das so machen:


for (i=0; i<20; i++)
{
asm volatile ("nop");
}


Gruß,
askazo

Jaecko
22.12.2010, 14:47
Da steht deswegen kein Fehler, weil es eben kein Fehler ist.
Ein grosszügiger Compiler könnte natürlich anmerken, dass die for-Schleife ein "Statement with no effect" ist.
Wenn du es unbedingt so machen willst, kannst du i auch als volatile deklarieren. Dann wird der Compiler die for-Schleife trotzdem durchzählen, auch wenn nix gemacht wird.

So spontan wüsst ich jetzt auch garnicht, ob



uint8_t i;
for (i=0; i<20; i++)
{
asm volatile ("nop");
}


das gleiche ist wie:



volatile uint8_t i;
for (i=0; i<20; i++)
{
}


Wobei ich glaub, dass die volatile-for schneller geht, da der NOP nicht gemacht wird.