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

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