Das ist irgendwie ein Widerspruch. Entweder Assembler mit ORG und Section oder höhere Sprache
Wie kann ich in C dem Compiler anweisen den Prgrammcode an einer beliebigen Adresse ungleich 0x0000 zu platzieren? In asm geht das einfach mit .org . Ich hab versucht das mit einem Inlinebefehl zu machen. DAs funkt aber nicht richtg, bzw. selbst wenns funktiuonieren würde hätte ich gerne eine Lösung in C.
Das ist irgendwie ein Widerspruch. Entweder Assembler mit ORG und Section oder höhere Sprache
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Inwiefern?
Das Ding ist folgendes. Ich möcht eine Bootloader schreiben. In assemlber hab ich ein kleines Prgramm zum des der Booloaderoption des ATEMGA16 geschrieben, und mittles .org an den Start der Bootloader section geschrieben. Das funktioniert auch. Ich möchte aber nicht das komplette Prgramm in assembler schreiben, weil das einfach zach ist, sondern halt in C. Dazu muss ich doch irgendwie den Programmcode doch irgendwie auf die entsprechene Adresse schieben.
Normalerweise ist das eher Sache des Linkers, einen Code an eine andere Stelle zu verschieben.
Vielleicht gibt's aber was bei den Präprozessor -Anweisungen. Ich fürcht, da müssen wir ein bißchen lesen.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Danke für den Hinweis mit dem Linker. Hat mich auf den richtigen weg gebracht.
Ich habe nun mittes __attribute__ ((section (".bootloader"))) eine neue section eingeführt die ich anschliessend mittels der Option -Wl,--section-start=.bootloader=0x1C00 beim linken an die entsprechende Stelle platziere.
Nun habe ich aber dennoch folgendes Problem. Der Eigentliche Code ist zwar an der gewünschen stelle, nur wird auch ein code erzeugt der (habe den flash mittels pony prog ausgelesen) an 0x0000 gespielt wird.
Ich erzeuge ein srec file das folgendermaßen aussieht
Der dazugehörige quellcode meines kleinen Programms sieht so ausCode:S0130000626F6F746C6F61646572432E73726563A3 S11300000C942A000C9445000C9445000C94450073 S11300100C9445000C9445000C9445000C94450048 S11300200C9445000C9445000C9445000C94450038 S11300300C9445000C9445000C9445000C94450028 S11300400C9445000C9445000C9445000C94450018 S11300500C94450011241FBECFE5D4E0DEBFCDBF14 S113006010E0A0E6B0E0EEE8F0E002C005900D92EA S1130070A036B107D9F710E0A0E6B0E001C01D92A8 S1110080A036B107E1F70C94000E0C940000BA So hier beginnt das eigentliche Programm S1131C00CFE5D4E0DEBFCDBFF8948FEF80933400EE S10B1C108FEA80933500FFCF39 S9030000FC
Also nur Leds einschalgten und dann nix mehr tun. Meine frage ist, was ist der code der an den Anfang geschrieben wird? Ist das die Interrupt vector tabelle??Code:#include <avr/io.h> #include <avr/boot.h> int main(void) __attribute__ ((section (".bootloader"))); int main(void) { __asm("cli;"); DDRC = 0xFF; PORTC = 0xaf; while(1) { } }
Eine weitere frage ist, ob ich wenn ich nur __attribute__ ((section (".bootloader"))); schreibe die foglenden Anweisungen automatisch in die bootsection gespielt werden?
PS: Bin a ein Wiener
a wiena , na bumm !
Da Zeugs schaut aus wie die ISR-Vectoren.
Jetzt müßt' man wieder im datasheet von der AVR-Silizium-Pletsche nachlesen, wie das mit dem Bootloaden und den Vectoren so funktioniert.
Ich geb's gern zu, hab das bisher immer überlesen.
Vielleicht find' sich noch ein Wissender hier im Forum und hilft.
Ser's !
EDIT: Vielleicht ist das mit den Vectoren eh' normal, du hast ja keine belegt, und die bepflastert er ja mit dummies.
Und wenn er dann Boot-loaded, überchreibt er sie sowieso
??
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Vielen Dank für die schnelle Antwort. Ich hab mir meine frage selber beantwortet.
Zur Erklärung, vielleicht bringts ja jemanden was, meine Schilderung was fals war:
Um mein srec file zu erzeugen mach ich ein OBJCOPY vom aout file. Dem Befehl muss ich die Option übergeben, dass nur die .bootsection kopiert werden soll. Mittels -j bootloader.
Code:%.srec: %.aout $(OBJCOPY) $(OCFLAGS) -j .bootloader $< $@ @chmod ugo-x $@ %.aout: %.c $(CC) $(LDFLAGS) -o $@ $< -Wl,--section-start=.bootl
Na super, werd ich mir gleich einrahmen.
Ich sag's ja, kaum macht man's richtig, geht's auch schon.
wieder was gelernt !
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Lesezeichen