Forum: Mikrocontroller und Digitale Elektronik GNU GCC und ISR auf Cortex-M3


von Stefan (Gast)


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

von Stefan (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

...und ich habe es gefunden. Also sorry für diesen Thread. Danke

von Mario (Gast)


Lesenswert?

Lass uns doch bitte an Deinen Erkenntnissen teilhaben!!!
Danke

von Cortexianer (Gast)


Lesenswert?

>Lass uns doch bitte an Deinen Erkenntnissen teilhaben!!!

Wie wäre es mit RTFM?

Schau mal unter
   vector table offset register (Addresse 0xE000ED08)
nach...

von Hanno (Gast)


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?

von Marcus H. (mharnisch) Benutzerseite


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/

von Noname (Gast)


Lesenswert?

Wie wärs mit Vector Table im RAM? Dafür muss im passenden Register das 
Bit 29?? gesetzt werden.

von Hanno (Gast)


Lesenswert?

Und wer lädt mir die Vectoren ins RAM?

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Hanno wrote:
> Und wer lädt mir die Vectoren ins RAM?

Dein Bootloader.

Gruß
Marcus
http://www.doulos.com/arm/

von Cortexianer (Gast)


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.

von Matthias (Gast)


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 ?

von Mario P. (mariopieschel)


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
}

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
Noch kein Account? Hier anmelden.