Hey ich habe momentan folgendes Problem:
Ich programmiere einen Atmega128 und will Funktionen extern auslagern.
Wenn ich alles in meine Hauptdatei packe (prog.c) funktioniert es
tadellos. Aber sobald ich Funktionen extern einbinde, geht nichts mehr
am Controller, obwohl der Compiler avr-gcc mir problemlos die
prog.hex-Datei erstellt.
So sieht das momentan aus:
http://pastebin.com/D8EyeYzj
Wenn ich dummy() in prog.c auskommentiere, bekomme ich im
Millisekunden-Abstand ein Signal am entsprechenden Port. Wenn ich es
drin lasse (bedenke: es macht überhaupt nichts), ´passiert an diesem
Port leider nichts.
Wäre cool wenn jemand einen Hinweis hat, was falsch läuft
Das ist noch das Makefile http://pastebin.com/Q6tUWPcW
Anonym schrieb:> Wenn ich dummy() in prog.c auskommentiere, bekomme ich im> Millisekunden-Abstand ein Signal am entsprechenden Port.
Laut Deinem posting ist dummy() in bus.c definiert. Hast Du vielleicht
Warnungen übersehen, die hilfreich wären?
Ja ist es auch ;)
"Build succeeded with 0 Warnings..." bekomme ich jedes mal.
Mir ist das zum ersten mal aufgefallen (habe eben erst angefangen), als
ich den ganzen Block
PORTA |= (1<<2);
_delay_ms(10);
PORTA &= ~(1<<2);
_delay_ms(10);
ausgelagert und eingebunden habe. Aber es ist wohl ein grundsätzliches
Problem, dass der Controller nicht mitmacht, sobald eine Funktion von
außerhalb aufgerufen wird
Der liegt schon eine Weile rum, aber programmiertechnisch ist er "neu".
Das weiß ich im Moment nicht, da ich nur das AVR-Studio-Projekt
griffbereit hab. Physischen Zugriff hab ich erst morgen wieder ;)
Anonym schrieb:> Wenn ich dummy() in prog.c auskommentiere, bekomme ich im> Millisekunden-Abstand ein Signal am entsprechenden Port. Wenn ich es> drin lasse (bedenke: es macht überhaupt nichts), ´passiert an diesem> Port leider nichts.
Erzeuge doch mal Assembler Dateien (Flag -S) und lade diese hoch!
>Der Mega128 ist 'neu'?>Die M103 Fuse ist deaktiviert?
Fehler bei den Fuses sind unwahrscheinlich, wenn es in anderer
Kombination (alles in main.c) funktioniert.
>Aber es ist wohl ein grundsätzliches>Problem, dass der Controller nicht mitmacht, sobald eine Funktion von>außerhalb aufgerufen wird
Von wo her eine Funktion aufgerufen wird bekommt der Controller gar
nicht mit. Der arbeitet einen Programmbereich nach dem anderen ab.
Sowohl innerhalb als auch außerhalb von main.c aufgerufene Funktionen
erscheinen nur als call oder jump an die entsprechende Stelle.
Wie genau mache ich das mit der Assembler-Datei und Flag-S?
Habe dazu in den Projektoptionen nichts gefunden :/
Momentan kann ich mit .o, .map, .lss, .hex, .elf und .eep dienen
Frage an Radio Eriwan:
Kannst Du mit einem eventuell ellenlangen Assebler-Listning überhaupt
etwas anfangen?
Schalte nach dem Kompilieren mal die Ansicht auf Assembler um und schau
Dir das Resultat an.
Sebastian S. schrieb:> Fehler bei den Fuses sind unwahrscheinlich, wenn es in anderer> Kombination (alles in main.c) funktioniert.
Doch, hier schon. Bei falscher Fuse liegt der Stack im Wald. Ohne echtem
Funktionsaufruf wird der Stack in diesem Code aber nicht verwendet. Und
den Aufruf gibts nur bei externer Funktion, weil die Funktion sonst
inlined wird.
Sebastian S. schrieb:>>Der Mega128 ist 'neu'?>>Die M103 Fuse ist deaktiviert?> Fehler bei den Fuses sind unwahrscheinlich, wenn es in anderer> Kombination (alles in main.c) funktioniert.
Nicht wenn die Funktionen so läppisch sind, dass sie vom Compiler
geinlined werden.
Liegt die Funktion so, dass der Compiler kein inline machen kann, dann
muss ein echter Funktionsaufruf her. Wenn dann der M128 noch auf M103
steht, dann kracht es.
Also der Debugger sagt dass die Ports funktionieren sollten.
Vom Stack Pointer hör ich grad zum ersten mal, aber ich bin auf dem
Gebiet auch komplett neu
Karl Heinz schrieb:> Die M103 Fuse ist deaktiviert?
Vermutlich nicht. Siehe AVR Fuses. Bei kurzen Dummy Programmen kann
der Compiler oftmals alle Stack-Operationen wegoptimieren - aber nicht
wenn Function calls über mehrere C Dateien verstreut sind.
Deshalb funtionieren die Tests, bei denen alles in einem File ist.