Forum: Mikrocontroller und Digitale Elektronik AVR-C: Funktionen aufrufen


von Mkolo (Gast)


Lesenswert?

Hallo,

ich bin ein bisschen ratlos, folgende Beispiele
funktionieren bei meinem Attiny13 nicht und ich
weiss nicht warum:
1
void blub(){
2
PORTB= 1;
3
}
4
5
int main(){
6
DDRB = 1;
7
blub();
8
while(1){}
9
}
Soweit hab ichs runterreduziert...
Es fing damit aber an:
1
void blub(volatile uint8_t *prt){
2
*prt = 1;
3
}
4
5
int main(){
6
DDRB=1;
7
blub(&PORTB);
8
9
[...]
10
}

Verpack ich die Funktionen allerdings nochmal
in eine Funktion, also:
1
void foo(){
2
blub()
3
}
Und rufe foo() dann auf, dann funktioniert es...
Das verwundert mich, eine Eigenheit von avr-c?
Wie funktioniert das Ganze?


lg

von Karl H. (kbuchegg)


Lesenswert?

Zeig den ganzen, compilierbaren Code. Nicht einen ähnlichen, nicht etwas 
von dem du denkst, dass er so ähnlich aussieht, sondern den den du 
tatsächlich benutzt.
Am geposteten ist erst mal nichts falsch (aber es fehlen zb die 
#include). Aber im echten Code könntest du zb die () Klammern beim 
Funktionsaufruf vergessen haben. So was passiert schon mal.

Am besten hängst du das C-File so wie es ist einfach als Attachment an.

von Mkolo (Gast)


Lesenswert?

Ja, es verwundert mich auch sehr:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
5
void foo(){
6
  PORTB = 1;
7
}
8
9
int main() {
10
  DDRB = 1;
11
  foo();
12
  while(1) {}
13
14
}

tut nicht. LED ist an PB0 angeschlossen.
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
void foo(){
5
  PORTB = 1;
6
}
7
8
void foo2(){
9
foo();
10
}
11
12
int main() {
13
  DDRB = 1;
14
  foo2();
15
  while(1) {}
16
17
}

hingegen funktioniert und es ist mir ein Raetsel warum!

von Mkolo (Gast)


Lesenswert?

Mkolo schrieb:
> hingegen funktioniert und es ist mir ein Raetsel warum!

Ok, mir kam grade der Lichtblitz, dass ich ja einfach
ein Makefile aus dem Forum uebernommen hab.
Dort war die Optimierung fuer Dateigroesse drin.
Mit -O0 funktioniert auch das erste Beispiel.
Es ist mir dennoch fraglich, was der Compiler da
im Funktionsaufruf wegoptimiert.



lg

von Peter II (Gast)


Lesenswert?

Mkolo schrieb:
> Es ist mir dennoch fraglich, was der Compiler da
> im Funktionsaufruf wegoptimiert.

erzeuge mal bitte für beide Versionen das lss file und lade es hoch.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Mkolo schrieb:
> tut nicht.

Wie äußert sich das?

Hast du das auf einem realen ATtiny13 getestet, indem du das Signal an
PB0 gemessen oder mit einer LED sichtbar gemacht hast?

Oder hast du das Programm nur im Simulator/Debugger laufen lassen? Da
können je nach verwendeter GCC- bzw. Debugger-Version und je nach
Debug-Option unerwartete Dinge passieren, da die Funktionen bei
eingeschalteter Optimierung geinlinet werden.

von Axel S. (a-za-z0-9)


Lesenswert?

Mkolo schrieb:
> ich bin ein bisschen ratlos, folgende Beispiele
> funktionieren bei meinem Attiny13 nicht und ich
> weiss nicht warum
1
> void blub(){
2
> PORTB= 1;
3
> }
4
> 
5
> int main(){
6
> DDRB = 1;
7
> blub();
8
> while(1){}
9
> }

...

Mkolo schrieb:
> mir kam grade der Lichtblitz, dass ich ja einfach
> ein Makefile aus dem Forum uebernommen hab.
> Dort war die Optimierung fuer Dateigroesse drin.
> Mit -O0 funktioniert auch das erste Beispiel.

Hmm. Vielleicht hast du nur eine merkwürdige Auffassung davon was 
"funktionieren" für deinen Beispieplcode bedeutet. Denn in der Tat wird 
der Compiler mit aktivierter Optimierung den Funktionsaufruf einsparen 
und die Funktion "inlinen" - d.h. an Stelle des Funktionsaufrufs direkt 
den Rumpf der aufgerufenen Funktion in das Programm einfügen.

Für die Funktion des Programms - daß nämlich PB0 auf H gesetzt wird - 
ist diese Optimierung unerheblich. Es verhält sich nach außen genau 
gleich, unabhängig davon ob da intern ein Funktionsaufruf stattfindet 
oder nicht.

von Mkolo (Gast)


Angehängte Dateien:

Lesenswert?

Axel S. schrieb:
> Für die Funktion des Programms - daß nämlich PB0 auf H gesetzt wird -
> ist diese Optimierung unerheblich. Es verhält sich nach außen genau
> gleich, unabhängig davon ob da intern ein Funktionsaufruf stattfindet
> oder nicht.

Das Beispiel wurde mit einem realen Attiny getestet,
und PB0 war laut intakter LED nicht auf High.
Wenn der Compiler ne Funktion inline setzt ist das ja
eine Sache, meinetwegen kann er auch eine ungenutzte
Variable wegmachen, aber es wundert mich doch arg, dass
eine Optimierung die Funktionalitaet des Programms wesentlich
veraendert.



Im Anhang die gewuenschten lss Dateien(heute aber ungetestet).
Und nochmal der code (button.c):
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
5
void test(){
6
  PORTB = 1;
7
}
8
9
10
int main() {
11
  DDRB = 0b00000001;
12
  test();
13
  while (1) {}
14
15
}




lg und nochmals vielen Dank

ps: [alle@foo ~]$ avr-gcc --version
avr-gcc (GCC) 5.2.0

von Tassilo H. (tassilo_h)


Lesenswert?

Bist du sicher, daß die letzte Datei mit Optimierung Os war? Sieht 
identisch zur ersten aus.

von Alexander S. (esko) Benutzerseite


Lesenswert?

Mkolo schrieb:
> button_unoptimiert.lss
> button_unoptimiert.lss
> button_optimiert_mit_s.lss

Alle drei Dateien sind identisch.

von Mkolo (Gast)


Lesenswert?

Ich kann nicht leugnen, dass ihr recht habt,
ich haetts vorher mit diff ueberpruefen koennen.

Zusaetzlich hab ich jetzt optimierte und unoptimierte
Version real getestet... und beide funktionieren.

Gestern bin ich allerdings 2h an diesem Problem
verzweifelt, was jetzt einfach nicht da ist.

Ja ehm... ich fuerchte mein nicht reproduzierbarer
Fehler wird nun auf Inkompetenz meinerseits
zurueckgefuehrt. Damit muss ich dann wohl leben.

Aber damit schliesse ich und danke nochmals!

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.