Forum: Compiler & IDEs Problem beim Auslagern von Funktionen


von Anonym (Gast)


Lesenswert?

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

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

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?

von Anonym (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Der Mega128 ist 'neu'?
Die M103 Fuse ist deaktiviert?

von Anonym (Gast)


Lesenswert?

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 ;)

von klausro (Gast)


Lesenswert?

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!

von Sebastian S. (amateur)


Lesenswert?

>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.

von Anonym (Gast)


Lesenswert?

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

von Sebastian S. (amateur)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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.

von Anonym (Gast)


Angehängte Dateien:

Lesenswert?

Hier die Assembler-Dateien :)
Das mit der Fuse check ich morgen mal. Da kann man glaub echt viel 
falsch machen...

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Kann es sein, dass der Stack-Pointer nicht richtig initialisiert ist? 
Kannst Du da mit einem Debugger im single step durch gehen?

: Bearbeitet durch User
von Anonym (Gast)


Lesenswert?

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

von Jim M. (turboj)


Lesenswert?

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.

: Bearbeitet durch User
von Anonym (Gast)


Lesenswert?

Es lag tatsächlich an der Fuse M103... :) Vielen Dank Leute!!

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.