Deiner Ausgabe fehlt die Interrupt-Vektor-Tabelle. Normalerweise müsste
bei 0 ein Sprung zum Startup-Code stehen, der dann mit main() weiter
macht. Bei dir fängt's aber direkt mit der ersten Funktion an.
Zeig doch lieber mal den vom Compiler erzeugten Assembler-Code statt
eines wieder disassemblierten Binaries. Das wäre etwas übersichtlicher.
Peter II schrieb:> monad schrieb:>> Makefile:>> bin mir nicht sicher, aber der linker muss auch wissen was es für ein µC> ist. Das sehen ich bei dir nicht.
CFLAGS=-mmcu=attiny13 -Os -c
Kurt schrieb:> -Os Keine Optimierung.>> Die leere Funktion wird nicht entfernt.
und? Damit darf das Programm aber nicht fehlerhaft werden. Sein linker
aufruf ist falsch.
Kurt schrieb:> Peter II schrieb:>> monad schrieb:>>> Makefile:>>>> bin mir nicht sicher, aber der linker muss auch wissen was es für ein µC>> ist. Das sehen ich bei dir nicht.>> CFLAGS=-mmcu=attiny13 -Os -c
linker ist doch
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
also LDFLAGS.
Kurt schrieb:>> CFLAGS=-mmcu=attiny13 -Os -c>> -Os Keine Optimierung.
-Os steht für Größenoptimierung, nicht für keine Optimierung.
> Die leere Funktion wird nicht entfernt.
Kann sie auch gar nicht, da der Compiler nicht weiß, ob die Funktion von
irgendwo anders aus aufgerufen wird. Wenn schon, müßte das der Linker
tun.
Aber davon abgesehen: Ja, und? Auch wenn die Funktion nicht entfernt
wird, sollte sie den Rest trotzdem nicht stören.
Ich lege beim Linkeraufruf immer noch die CFLAGS dazu, weil das bei
bestimmten Optimierungen (LTO) notwendig ist. Schaden tut es m.W. nie.
Die LFLAGS sind dann nur für den Linkeraufruf bestimmt.
Ääääh ...
und jetzt ist der Code fehlerfrei?
Oder funktioniert der Code 'nur', wie man sich das vorgestellt hat, da
die leere Funktion weg-optimiert wurde?
Tip:
Pack die unschöne Funktion ans Ende, dann kann Die auch drin bleiben
ohne zu stören - braucht dann aber halt trotzdem Speicher.
Würde das wohl .elf File beim Assembler mit dem .lst File gleichsetzen
...
Dann sieht man, daß MIT der Funktion, daß dort ein RET an 3.ter stelle
steht.
(Wie der Compiler auf r24 und r25 kommt ... kA)
Da zuvor aber nicht bestimmt zur main gesprungen wird, beginnt der µC
bei 0 mit dem Programm - und da kommt nach 3 Befehlen das 'ret' und ein
Stapel-Überlauf nimmt seinen Lauf - durch das Return wird die
Rücksprung-Adresse vom Stapel runter geholt, was hier wohl dann 0x80e0
oder 0xe080 als Ziel ergeben wird - und da steht dann auch nur Müll, was
dann nicht ganz der erwarteten Funktion des Programm entsprechen könnte.
MfG
Patrick J. schrieb:> Ääääh ...>> und jetzt ist der Code fehlerfrei?
ja, warum denn nicht?
Wenn er dem linker nicht die cpu übergibt, dann kann er den STartcode
nicht einfügen, deswegen sieht der code so merkwürdig aus.