Forum: Compiler & IDEs Funktionen aufrufen aber wie?


von Nick O. (lpt)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

Abhilfe:
Optimierung ausschalten oder _delay_ms() verwenden.

von Nick O. (lpt)


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.

von moins (Gast)


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

von Ch D. (chrisu) Benutzerseite


Lesenswert?

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

von moins (Gast)


Lesenswert?

was hast du für eine taktfrequenz?

von TestX .. (xaos)


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...

von Nick O. (lpt)


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.

von Gerd (Gast)


Lesenswert?

miss mal mit dem KO an der LED ob da wos kommt....

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> aus welchem grund soll da der compiler was wegoptimieren?
> er entscheidet nicht was "sinnvoll" ist oder nicht....
Der Compiler sieht, dass diese Funktion:
1
void Zeit (void)
2
{
3
  unsigned int i=60000;
4
5
  while (i)
6
  {
7
     i = i-1;
8
  }
9
}
genau das selbe ist, wie diese:
1
void Zeit (void)
2
{
3
   unsigned int i=0;
4
}
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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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)

von Nick O. (lpt)


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.

von Nick O. (lpt)


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.

von Peter D. (peda)


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

von Georg A. (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.