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.
> Aber irgendwie werden die Funktionen nicht abgearbeitet.
Die wird wegoptimiert, weil sie nichts (sinnvolles) tut.
Abhilfe:
Optimierung ausschalten oder _delay_ms() verwenden.
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.
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
vielleicht geht das led auch so schnell wieder an und aus das du es gar nicht sehen kannst.
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...
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.
> 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.
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)
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.