MIPS ISR verschieben

Gast #6146343
Lesenswert?
• ▲
▼
Ich möchte die ISR meines MIPS Programms verschieben (PIC32MX).

Dazu muss:
 - Die Basisadresse im EBASE-Register verändert werden.
 - Die ISR an der richtigen Stelle im Speicher stehen.

Die Änderung des EBASE ist relativ leicht:
1
This register is initialized with the value of the _ebase_address symbol by the PIC32 start-up code.  _ebase_address is provided by the linker script with a default value of the start of KSEG1 program memory. The user can change this value by providing the command line option -–defsym _ebase_address=A to the linker.

Aber der Compiler muss die ISR ja dann auch an der korrekten Stelle im 
Speicher platzieren.  Wie wird das eingestellt?

Im Linkerscript ist folgendes enthalten:
1
$ cat procdefs.ld
2
[...]
3
/*************************************************************************
4
 * Symbols used for interrupt-vector table generation
5
 * To override the defaults, define the _vector_spacing & _ebase_address
6
 * symbols using the --defsym linker opt as shown in these examples:
7
 *   xc32-gcc src.c -Wl,--defsym=_vector_spacing=2
8
 *   xc32-gcc src.c -Wl,--defsym=_ebase_address=0x9D001000
9
 *************************************************************************/
10
PROVIDE(_vector_spacing = 0x0001);
11
PROVIDE(_ebase_address = 0x9FC01000);
12
[...]

Das klingt so als würde es genügen, dem Linker die neue EBASE 
mitzuteilen, sodass dieser sich dann auch darum kümmert, dass die ISR an 
der richtigen Stelle steht.  Aber der Linker weiß doch nichts darüber, 
wo in der Objektdatei die ISR steht (oder?).
#6146351
Lesenswert?
• ▲
▼
Der Compiler kann die Vektortabelle in eine bestimmte Section legen (die 
du mit __attribute__((section(.name))) mitteilst) und diese Section im 
Linkerscript an eine bestimmte Adresse legen.

Oder du machst das zur Laufzeit, indem du die Vektortabelle irgendwie 
alloziierst, passend ausrichtest, den Pointer darauf nach uintptr_t 
castest und dann die entsprechenden Bits ins Register schreibst. Das 
hätte den Vorteil, dass du den Speicher nicht schon im Linkerscript 
fragmentierst.

Wo die Tabelle genau landet, ist in deinem Fall ja egal.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.