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