Problem beim Auslagern von Funktionen

Gast #4082869
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
Gast #4082897
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
Gast #4082912
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 ;)
Gast #4082913
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!
#4082916
>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.
Gast #4082928
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
#4082954
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.
#4082958
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.
Gast #4082989
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.