- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 7 von 7

Thema: frage zum compilen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    31.03.2010
    Beiträge
    33

    frage zum compilen

    Anzeige

    Praxistest und DIY Projekte
    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;
    }

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    1. Bitte das nächste Mal Quellcode
    Code:
    Code:
    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

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    31.03.2010
    Beiträge
    33
    Zitat Zitat von markusj
    1. Bitte das nächste Mal Quellcode
    Code:
    Code:
    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.

    Code:
     #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;                
    }

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Hallo sahra,

    dann sieh dir Mal die Funktionen _delay_ms und _delay_us (Header util/delay.h) 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

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    31.03.2010
    Beiträge
    33
    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

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    48
    Beiträge
    1.146
    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:
    Code:
    for (i=0; i<20; i++)
    {
           asm volatile ("nop");
    }
    Gruß,
    askazo

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    41
    Beiträge
    2.009
    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

    Code:
    uint8_t i;
    for (i=0; i<20; i++)
    {
           asm volatile ("nop");
    }
    das gleiche ist wie:

    Code:
    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.
    #ifndef MfG
    #define MfG

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test