PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm platzierung



baracuda
07.07.2005, 16:53
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.

PicNick
07.07.2005, 17:13
Das ist irgendwie ein Widerspruch. Entweder Assembler mit ORG und Section oder höhere Sprache

baracuda
07.07.2005, 17:17
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.

PicNick
07.07.2005, 17:22
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.

baracuda
07.07.2005, 19:35
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


S0130000626F6F746C6F61646572432E73726563A3
S11300000C942A000C9445000C9445000C94450073
S11300100C9445000C9445000C9445000C94450048
S11300200C9445000C9445000C9445000C94450038
S11300300C9445000C9445000C9445000C94450028
S11300400C9445000C9445000C9445000C94450018
S11300500C94450011241FBECFE5D4E0DEBFCDBF14
S113006010E0A0E6B0E0EEE8F0E002C005900D92EA
S1130070A036B107D9F710E0A0E6B0E001C01D92A8
S1110080A036B107E1F70C94000E0C940000BA

So hier beginnt das eigentliche Programm
S1131C00CFE5D4E0DEBFCDBFF8948FEF80933400EE
S10B1C108FEA80933500FFCF39
S9030000FC

Der dazugehörige quellcode meines kleinen Programms sieht so aus


#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)
{

}
}

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

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

PicNick
07.07.2005, 19:45
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
??

baracuda
07.07.2005, 20:06
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.



%.srec: %.aout
$(OBJCOPY) $(OCFLAGS) -j .bootloader $< $@
@chmod ugo-x $@

%.aout: %.c
$(CC) $(LDFLAGS) -o $@ $< -Wl,--section-start=.bootl

PicNick
07.07.2005, 20:47
Na super, werd ich mir gleich einrahmen.

Ich sag's ja, kaum macht man's richtig, geht's auch schon.

wieder was gelernt !