-         

Ergebnis 1 bis 8 von 8

Thema: Programm platzierung

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    05.06.2005
    Beiträge
    10

    Programm platzierung

    Anzeige

    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.

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    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.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    05.06.2005
    Beiträge
    10
    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.

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    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.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    05.06.2005
    Beiträge
    10
    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

    Code:
    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
    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)
    	{	
    		
    	}
    }
    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

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    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.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    05.06.2005
    Beiträge
    10
    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

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •