Hallo,
ich habe lange gezögert den Beitrag hier reinzustellen weil er eigl
primitiv ist aber iwie finde ich keine lösung.
beim funktionsaufruf will ich die varible x überwachen (AVR studio -->
watch)...
dabei bekomme ich immer wieder die meldung "Unknown identifier x
error"....
aber x habe ich doch deklariert???? würde mich über hilfe freuen.
vielleicht sollte ich noch erwähnen das es sich hierbei um die usart -
schnittstelle handelt
/* die Funktion der verzweiflung...*/
void putch(unsigned char x) // warten und Zeichen senden
{
while( ! (UCSRA & (1 << UDRE))); // warte solange Sender besetzt
UDR = x; // Zeichen nach Sender
}
/* der mainpart*/
int main(void)
{
DDRA = 0xff;
DDRD=0b00000010;
PORTD = 0x00;
PORTD=0x00;
initusart(); // USART init
sbi(UCSRB, RXCIE); // Empfängerinterrupt frei
sei(); // Interrupts global enable
while(1)
{
putch('>'); //hex 62
}
return 0;
}
Peter schrieb:> dabei bekomme ich immer wieder die meldung "Unknown identifier x> error"....> aber x habe ich doch deklariert????
Jein, sie existiert nur "temporär", falls/wenn die putch() Funktion
aufgerufen wird. Dann wird das Argument nämlich auf dem Stack platziert
und über den Namen "x" referenziert. Ansonsten ist "x" nicht existent.
Ist das ev. das Problem für den Debugger?
Der springende Punkt liegt hier
> beim funktionsaufruf will ich die varible x überwachen> (AVR studio -->watch)...> dabei bekomme ich immer wieder die meldung "Unknown identifier x> error"....
Du redest vom Debugger.
x existiert nur, solange sich die Programmausführung innerhalb der
Funktion putch befindet. Ausserhalb dieser Funktion gibt es kein x,
daher kann der Debugger auch eine nicht existente Variable nicht
überwachen.
wow danke für die antworten...
-ja leider sagt der debugger mir auch den fehler wenn ich mich in der
fkt putch befinde....
-hilfsvariable bringt leider nichts
Karl Heinz Buchegger schrieb:> daher kann der Debugger auch eine nicht existente Variable nicht> überwachen.
Zum Test kann man sie ja auch "static" machen.
mfg mf
Peter schrieb:> wow danke für die antworten...> -ja leider sagt der debugger mir auch den fehler wenn ich mich in der> fkt putch befinde....
Dann hat zusätzlich noch der Optimizer des Compilers zugeschlagen und
die Variable wegoptimiert indem er Funktionsinlining betrieben hat.
Sprich: Er hat den Code der Funktion direkt an der Aufrufstelle
eingebaut und braucht daher das x nicht mehr.
das passiert beim AVR studio sehr oft wenn man mit optimierung debuggen
will
manchmal kommen sehr kuriose sprünge zustande
weil man selbst zu kompliziert gedacht hat
( ging mir sehr oft so ^^ ... aber man hat was zu lernen wenn man
durchsteppt :) )
entweder optimierng weghauen oder :
- variable als static
- variable als volatile
- oder globale variable
fdssd schrieb:> entweder optimierng weghauen oder :> - variable als static> - variable als volatile> - oder globale variable
Oder in diesem Fall noch besser:
Assemblerlisting lesen :-)
Nur so zur Diskussion:
Genau genommen ist x ja keine Variable sondern ein Parameter. Soweit ich
das verstehe wird dafür kein Speicher belegt sondern der Wert auf dem
Stack vorgehalten (was zwar auch Speicher ist, aber im Ggs. zu
Variablen, keine Labels hat).
Demnach halte ich es für plausibel, wenn auch nicht für wünschenswert,
das der Debugger diesen Namen nicht kennt. Ich habe es nicht
systematisch ausprobiert bin aber der Meinung, das nur Parameter die in
der Funktion auch noch manipuliert werden (links vom Gleichheitszeichen
auftreten) auch im Debugger zu sehen sind. Soweit ich weiss ist das
unabhängig von einem evtl. Inlining.
Apropos: Hat der TO mal probiert sämtliche Optimierungen abzuschalten?
Was passiert dann?
omg...
also mit optimize none funktioniert alles super, danke wäre ich nie
darauf gekommen.
das problen ist aber das ich schon optimize auf level 3 halten möchte..
ich habe jetzt die variable als global volatile und static deklariert...
ohne erfolg... deklariere ich die variable global behält sie diesen wert
und verändert diesen bei fkt- aufruf nicht :(
wie kann ich dem compiler x verbergen?
>das problen ist aber das ich schon optimize auf level 3 halten möchte..
Das wäre schon fast einen eigenen Thread wert.
Wie Du siehst kannst Du dann schonmal nicht debuggen.
Also schalte die Optimierungen aus.
>ich habe jetzt die variable als global volatile und static deklariert...
ohne erfolg...
Wundert mich nicht. Ob volatile oder static interessiert den Optimierer
an der Stelle garnicht denke ich.
>deklariere ich die variable global behält sie diesen wert>und verändert diesen bei fkt- aufruf nicht
Huch? Wieso sollte sich x verändern? In der fraglichen Funktion wird ja
x garnichts zugewiesen. Ein Missverständnis?
>wie kann ich dem compiler x verbergen?
Da fallen mir nur Scherzantworten ein. :-)
sollte es gehen.
ALlerdings ist das zweifelhaft. Da kannst du auch gleich den Optimizer
vorübergehend ausschalten und dich davon überzeugen, dass putch so
funktioniert wie du dir das vorstellst (was du mit dem Simulator sowieso
nicht kannst) und danach den Optimizer gleich wieder einschalten.
Entweder du akzeptierst, dass der Optimizer den Code umbaut (ohne die
eigentliche Funktionalität zu verändern), dann musst du damit leben,
dass du im Debugger seltsame Dinge siehst.
Oder du akzeptierst letzters nicht und willst haben, dass im Debugger
alles so ausgeführt wird, wie du das hingeschrieben hast, dann darfst du
den Optimizer nicht einschalten.
natürlich wird x ein wert zugewiesen
mit
putch('>');....
wenn ich optimierung wegmache, stimmen wunderlicherweise meiene delays
nicht mehr deswegen....
Peter schrieb:> natürlich wird x ein wert zugewiesen> mit> putch('>');....>> wenn ich optimierung wegmache, stimmen wunderlicherweise meiene delays> nicht mehr deswegen....
Davon sieht man aber im Originalcode nichts.
Und meistens ist es sowieso so: _delay_ms wird überschätzt :-)
Vor allen Dingen im Debugger.
Deine Funktion putch funktioniert sowieso, da brauchst du nicht viel
debuggen.
Peter schrieb:> natürlich wird x ein wert zugewiesen> mit> putch('>');....
? -- "x" aus dem Funktionsprototypen "putch(char x)" ist eine temporäre
Variable (Argument bei Funktionsaufruf).
> wenn ich optimierung wegmache, stimmen wunderlicherweise meiene delays> nicht mehr deswegen....
Das ist ein bekanntes Feature der avr-libc und auch so dokumentiert,
siehe Doku zu util/delay.h, wo es heisst: "In order for these functions
to work as intended, compiler optimizations must be enabled..."
>Peter schrieb:> natürlich wird x ein wert zugewiesen
Hm. Also ein Missverständnis. Da x keine Variable ist, sondern ein
Parameter wird auch nichts "zugewiesen". Anders ausgedrückt ist die
Übergabe eines Parameters keine Zuweisung.
Aber naja. Wohl eher eine akademische Frage. Finde gerade meine K&R
nicht.
>wenn ich optimierung wegmache, stimmen wunderlicherweise meiene delays>nicht mehr deswegen....
... ein trefflicher Grund über Sinn und Unsinn von Optimierungen zu
diskutieren. Ein Programm sollte mit Optimierungen auf besser, schöner,
weiter funktionieren aber keine Dysfunktion zeigen.
Karl Heinz schrieb:
>Deine Funktion putch funktioniert sowieso, da brauchst du nicht viel
debuggen.
Eben. :-)
also nochmal danke!
ich habe jetzt einfach den wert vorher, also von Variable zu Variable
zugewiesen.
x=y;
und danach putch(); aufgerufen...
dann sehe ich zumindest was sich in meiner fkt tut.
_attribute_ ((noinline)) hat leider nicht funktioniert
(bekomme ich eine fehlermeldung)
MfG Peter
Peter schrieb:> also nochmal danke!> ich habe jetzt einfach den wert vorher, also von Variable zu Variable> zugewiesen.> x=y;> und danach putch(); aufgerufen...> dann sehe ich zumindest was sich in meiner fkt tut.>> _attribute_ ((noinline)) hat leider nicht funktioniert> (bekomme ich eine fehlermeldung)
Mein Fehler.
Das Attribut muss vor die Funktion