Moin.
Ich kann einfach meinen Denkfehler nicht finden und weiß auch nicht so
richtig, wie ich nach dem Problem suchen kann, deswegen ein neuer
Beitrag.
Also:
Eigentlich ganz einfach. In einem externen C-File gibts eine STATIC
Variable, ich nenne sie mal BUSY. Die möchte ich abfragen, also gibts
eine Funktion
uint8_t read_busy (void)
{ return busy; }
und im Header passed ein extern uin8t_t read_busy (void);
Auf diese Busy-Variable möchte ich jetzt in meine Main warten, was ich
nach meinem derzeitigen C-Kenntnissstand so löse:
while (read_busy());
Geht aber nicht. Ob die Variable nun 0 oder 1 ist, ist meiner
while-Funktion völlig egal und sie bleibt ewig hängen, so, als würde sie
die Adresse von der read_busy-Funktion sehen. Im Debugger (AVR STUDIO 6)
springt der Controller aber immer fleißig zum return busy; also wird das
Ding ja scheinbar schon aufgerufen.
Ist das ein Optimierungsproblem von dem Compiler? Auch wenn ich es nicht
in Kurzschreibweise versuche, also while (read_busy() != 0); geht's auch
nicht. Zusätzlich ist die busy-Variable auch noch als volatile
deklariert.
Funktionieren tut's bis jetzt nur mit einer extra Variable in der Main,
die erst zugewiesen (extra = read_busy()) und dann abgefragt wird.
Compilerfehler? Anwenderfehler? Irgendwasjemand eine Idee?
Danke und Gruß,
Timo
Zeige dein richtiges Programm! beschreibe nicht deinen Code sondern zeige ihn! Und zwar genau den Code, den du auch compilierst! In C ist jedes einzelne Zeichen wichtig, daher ist es vital, dass wir exakt und 100% den Code sehen können, den du auch tatsächlich benutzt. Du kannst die C und H Files ganz einfach als Attachment anhängen. Das ist überhaupt kein Problem.
Timo schrieb: > In einem externen C-File gibts eine STATIC > Variable, ich nenne sie mal BUSY. Ist die Deklaration wirklich in einem .c-File, oder doch zufällig in einem .h-File? Was steht im .c-file, was steht im .h-File? Timo schrieb: > extern uin8t_t read_busy (void); Das extern dort ist nicht nötig. Oliver
Timo schrieb: > Auf diese Busy-Variable möchte ich jetzt in meine Main warten Das hat nur Sinn, wenn sich diese Variable irgendwie verändern kann. Wenn Du in main() darauf warten willst, scheint diese Änderung durch einen Interrupt zu erfolgen --> Stichwort volatile.
Autsch, ich glaub, ich hab's gefunden... Ich hatte in meiner main.c das #include von dem Headerfile vergessen, danach ging's dann. Dank dem AVR Studio wird ja scheinbar alles irgendwie mit reingelinkt und es gibt keine ehrlichen Fehlermeldungen mehr... Trotzdem danke für die Antworten! @Oliver: Mit diesem extern oder nicht extern bin ich mir immer nicht so sicher. Gibts da irgendwo mal eine schöne Übersicht, was denn offiziell richtig ist. Ich hatte früher alle meine .H-Dateien ohne extern, ging ja auch, und dann meinte ich, dass ich mal gelesen hätte, dass das mit extern richtiger wäre. Timo
Timo schrieb: > und es gibt > keine ehrlichen Fehlermeldungen mehr... Da die Fehlermeldungen acuh im Studio immer noch vom Compiler und vom Limker kommen, und die immer pingeliger werden, kann das Studio nichts dafür. Wenn der Compiler nichts auszusetzen hat, und er Linker auch nicht, das Programm aber nicht das tut, was du von ihm erwartest, dann liegt es an deinem Programm. Der Fehler steckt immer im Sourcecode. Ehrlich ;) Zum Thema extern: Externe Variablen (die in einem anderen .c-File deklariert sind) benötigen "extern" im Headerfile. Bei Funktionen braucht es das nicht. Oliver
Timo schrieb: > Mit diesem extern oder nicht extern bin ich mir immer nicht so sicher. > Gibts da irgendwo mal eine schöne Übersicht, was denn offiziell richtig > ist. Ich hatte früher alle meine .H-Dateien ohne extern, ging ja auch, > und dann meinte ich, dass ich mal gelesen hätte, dass das mit extern > richtiger wäre. FAQ Punkt 6: Header File, wie geht das? sowie Punkt 8: Globale Variablen über mehrere Dateien
Timo schrieb: > Autsch, ich glaub, ich hab's gefunden... Ich hatte in meiner main.c das > #include von dem Headerfile vergessen, danach ging's dann. Dank dem AVR > Studio wird ja scheinbar alles irgendwie mit reingelinkt und es gibt > keine ehrlichen Fehlermeldungen mehr... Aber Warnungen gibt es. Sollte etwas in der Art "Benutzung der Funktion read_busy ohne vorherige Deklaration/Definition" sein. Schalte darum den Warnlevel hoch, beachte die Warnungen und behebe deren Ursache.
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.