mikrocontroller.net

Forum: Compiler & IDEs Funktionen aufrufen aber wie?


Autor: Nick Olaus (lpt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Nach dem jetzt endlich die Hardware läuft und auch die ersten 
Gehversuche (seit Jahren) mit dem C-Programmieren gelungen sind wollte 
ich jetzt mal das Programm Strukturieren und in Funktionen gliedern.

Aber irgendwie werden die Funktionen nicht abgearbeitet.

muss man für Funktionen noch eine Headerdatei einbinden?
Soweit ich weiß reicht dafür die <stdio.h>

Hier mal ein einfaches Beispeil für ein Blinklicht.
Aber selbst das geht nicht.
Kann mir bitte jemand helfen?


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


void Zeit(void);              // Deklarationen


int main (void)
  {
  DDRB = 0xFF;


  while (1)
    {
     PORTB = 0xFF;
    Zeit();
    PORTB = 0x00;
    Zeit();
    }
        return 0;
        }
//*******************************************************
void Zeit (void)
    {
    unsigned int i=60000;

  while (i)
    {
    i = i-1;
    }
  }

//******************************************************

Danke schon mal im vorraus
mfg
N.O.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Aber irgendwie werden die Funktionen nicht abgearbeitet.
Die wird wegoptimiert, weil sie nichts (sinnvolles) tut.

Abhilfe:
Optimierung ausschalten oder _delay_ms() verwenden.

Autor: Nick Olaus (lpt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die Hilfe.

Ich merke schon ich hatte zulange nix mit C zu tun.
bei     delay     musste man doch die <time.h> einbinden oder?
Gibt aber nur Fehlermeldungen.

Wie schalte ich den die Optimierung aus.
Ich verwende AVR Studio mit der GCC Applikation.

mfg
N.O.

Autor: moins (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
waaas?
aus welchem grund soll da der compiler was wegoptimieren? er entscheidet 
nicht was "sinnvoll" ist oder nicht....

wenn du festgelegte genaue zeiten brauchst ohne den uC dauern zu 
belasten, verwendest du besser einen timerinterrupt

Autor: Ch D. (chrisu) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielleicht geht das led auch so schnell wieder an und aus das du es gar 
nicht sehen kannst.

Autor: moins (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was hast du für eine taktfrequenz?

Autor: Andi ... (xaos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moins schrieb:
> waaas?
> aus welchem grund soll da der compiler was wegoptimieren? er entscheidet
> nicht was "sinnvoll" ist oder nicht....

sich dich mal mit optimierungsprozessen auseinander...

Autor: Nick Olaus (lpt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit den Interrupts will ich mir später mal wieder in Erinnerung 
rufen.

Im Augenblick geht erst mal nur darum Funktionen aufrufen zu können.
und leider geht das bei mir nicht.

Die LED's leuchten für das Menschliche Auge Dauerhaft.
Und beim Simulieren sieht man das die Funktion gar nicht Abgeharbeit 
wir.

Sondern halt nur das Main Programm.
Also Leds an Leds aus Leds wieder an.

Die Taktfrequens ist noch die Interne als 1MHz

mfg
N.O.

Autor: Gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
miss mal mit dem KO an der LED ob da wos kommt....

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> aus welchem grund soll da der compiler was wegoptimieren?
> er entscheidet nicht was "sinnvoll" ist oder nicht....
Der Compiler sieht, dass diese Funktion:
void Zeit (void)
{
  unsigned int i=60000;

  while (i)
  {
     i = i-1;
  }
}
genau das selbe ist, wie diese:
void Zeit (void)
{
   unsigned int i=0;
}
und entscheidet dann, dass sich ein Aufruf dieser Funktion an sich 
erübrigt, weil sie keinerlei logische Auswirkungen auf den 
Programmablauf hat.

Es ist nirgends dokumentiert, wie lange eine Operation wie i=i-1 dauert. 
Und daher kann der Compiler für diese Operation genausogut die Zeit 0 
ansetzen.

Das ist aber wirklich die allerunterste Optimierungs-Schublade :-o
Ich kann mich da nur Andi D. im 
Beitrag "Re: Funktionen aufrufen aber wie?" anschliessen.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nick Olaus schrieb:
> bei     delay     musste man doch die <time.h> einbinden oder?
#include <util/delay.h>
Es geht ganz speziell um _delay_ms(), nicht irgend ein anderes delay...

> Wie schalte ich den die Optimierung aus.
> Ich verwende AVR Studio mit der GCC Applikation.
Project -> Configuration Options -> General -> Optimization
Default ist -Os = Optimierung auf Codegröße
Du brauchst für deinen Code -O0 (minus Optimization Zero)

Autor: Nick Olaus (lpt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schön aber wie kann ich die Optimierung ausschalten.
Ich finde nur die Konfigurations-Optionen und da find ich kein 
Optimierung Butten ON/Off.

Aber selbst bei dem Programm

  while (1)
          {
     PORTB = 0xFF;
      //Zeit();
    k=0;
    PORTB = 0x00;
    k=1;
    //Zeit();
    }

Setzt der Simulator "k" nicht sondern überspringt den Befehl.
Hätte nicht gedacht das so ein blöder sch... einem das WE versauen kann.

mfg
N.O.

Autor: Nick Olaus (lpt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:

> Project -> Configuration Options -> General -> Optimization
> Default ist -Os = Optimierung auf Codegröße
> Du brauchst für deinen Code -O0 (minus Optimization Zero)

DANKE das war wonach ich gesucht hab.
Soll auch mal einer drauf kommen was -0s bedeuten soll.

Auf jeden fall funktioniert es jetzt und "k" wir jetzt auch gesetzt.

mfg
N.O.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Optimierung ausschalten ist völliger Quatsch.
Wenn die Programme ein µ größer werden, fällt Dir das voll auf die Nase.

Der AVR-GCC hat eine delay.h, benutze sie einfach.

Und der große Vorteil ist, die Zeiten muß man nicht rumprobieren, die 
stimmen (wenn die Interruptlast nicht extrem hoch ist).


Peter

Autor: Georg A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn unbedingt so NOP-Schleifen sein müssen, kann man die Zählvariable 
als volatile deklarieren.

BTW: Dass sowas wegoptimiert wird, ist AFAIK ein Verhalten neuerer 
gcc-Versionen. Die frühern (2.x ganz sicher) hatten extra eine Erkennung 
für sowas.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.