GNU GCC und ISR auf Cortex-M3

Gast #1113813
Lesenswert?

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...
Gast #1115647
Lesenswert?

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?
Persönliche Seite #1115814
Lesenswert?

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/
Gast #1116327
Lesenswert?

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.
Gast #1137768
Lesenswert?

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 ?
#1144190
Lesenswert?

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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren