Hallo, ich verwende den GNU GCC für einen Cortex-M3. Mein Problem: Ich habe im Adressbereich 00000-03FFF eine Art Bootloader. Mein eigentliches Programm startet oberhalb von 04000. Der Programmteil ändert sich immer mal wieder und die ISR sind nicht sicher immer auf der gleichen Adresse. GCC schreibt eine Vektortabelle an den Anfang des Programmteils. Die Interrupts wandern natürlich alle nach ganz unten. Wie kann ich die Interrupts in mein Programm umleiten? Meine Idee ist, im Bootloader die Interrupts in eine Routine springen zu lassen, die dann die Adresse der tatsächlichen ISR aus der Tabelle des Programmteils holt und dort hinspringt. Also Quasi so: Boot-ISR() { final-adr=(0x4000+32); jump final-adr; } Ich weiß, das geht so in C nicht. Aber wie kann ich sowas in C programmieren? Kann mir da jemand weiterhelfen? Danke...
Nochmal ich: Oder kann man die Vektor-Tabelle verschieben? Ich habe da was von "relocatable vector table" im Internet gelesen, kann aber bis jetzt nicht finden, wie man die verschiebt
>Lass uns doch bitte an Deinen Erkenntnissen teilhaben!!!
Wie wäre es mit RTFM?
Schau mal unter
vector table offset register (Addresse 0xE000ED08)
nach...
Hm, aber nach einem Power-On Reset erwartet er die IR-Vector-Tabelle doch erst einmal an Adresse 0. Dann kann ich dort ja das Register umschreiben, aber wie sage ich dem Linker, dass er die Tabelle dann an Adresse 04000 (in diesem Beispiel) legt? @Stefan: Ich will auch sowas realisieren, Du könntest mir nicht zufällig etwas Code von dir geben?
Hanno wrote: > Hm, aber nach einem Power-On Reset erwartet er die IR-Vector-Tabelle > doch erst einmal an Adresse 0. Dann kann ich dort ja das Register > umschreiben, aber wie sage ich dem Linker, dass er die Tabelle dann an > Adresse 04000 (in diesem Beispiel) legt? Die Vektor Tabelle kann in einer Struktur untergebracht werden, deren Adresse mit Tool-spezifischen Mechanismen (scatter file, _attribute_, usw.) festgelegt werden kann. Die initiale Vektor Tabelle kann dann ggf. minimal (SP, Reset, NMI, Hard Fault) gehalten werden. Gruß Marcus http://www.doulos.com/arm/
Wie wärs mit Vector Table im RAM? Dafür muss im passenden Register das Bit 29?? gesetzt werden.
Hanno wrote: > Und wer lädt mir die Vectoren ins RAM? Dein Bootloader. Gruß Marcus http://www.doulos.com/arm/
Das bisschen Kopieren ist ja nun wirklich nicht schwer, hier mal aus dem Kopf in ASM (natürlich ohne Garantie, im konkreten Fall nochmal nachprüfen): .equ NVIC_VECTTBL, 0xE000ED08 ldr r0,=0 ldr r1,=VecTabBase ldmia r0!,{r2-r5} stmia r1!,{r2-r5} dsb ldr r0,=NVIC_VECTTBL ldr r1,=VecTabBase str r1,[r0] .align VecTabBase: Im Allgemeinen hat man natürlich mehr als nur den SP sowie die drei notwendigen Exception Vectors, dann muss man in den obigen Code noch einige Kopierbefehle mehr einfügen.
Hallo, ich muss für mein Cortex-M3 Projekt auch einen Bootloader bauen, der im Flash vor dem eigentlichen Programm liegt. Mein Problem ist der Sprung aus dem Bootloader zum eigentlichen Programm. Wie kann man diesen Sprung realisieren ?
mit einem Funktionszeiger auf eine absolute Adresse: void (* func) (void); func = 0x1234; func(); Für Bootloader und Anwenderprogramm würde ich per Linkerscript zwei Speicherbereiche festlegen. z.B. Bootloader: 0 bis 0xfff Anwenderprogramm: 0x1000 bis 32k Bootloader: /* Memory Definitions */ MEMORY { ROM (rx) : ORIGIN = 0x00000000, 0x00000FFF RAM (rw) : ORIGIN = 0x40000000, LENGTH = 8k } Anwenderprogramm: * Memory Definitions */ MEMORY { ROM (rx) : ORIGIN = 0x00001000, , LENGTH = 32k -1k RAM (rw) : ORIGIN = 0x40000000, LENGTH = 8k }
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.