www.mikrocontroller.net

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


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...und ich habe es gefunden. Also sorry für diesen Thread. Danke

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass uns doch bitte an Deinen Erkenntnissen teilhaben!!!
Danke

Autor: Cortexianer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Hanno (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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/

Autor: Noname (Gast)
Datum:

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

Autor: Hanno (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wer lädt mir die Vectoren ins RAM?

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hanno wrote:
> Und wer lädt mir die Vectoren ins RAM?

Dein Bootloader.

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

Autor: Cortexianer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Mario Pieschel (mariopieschel)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.