J'essaie de comprendre la raison de l'exception ARM que je rencontre. Elle se produit de manière aléatoire lors du démarrage du système, et peut se présenter de différentes manières.
L'un des plus simples est le suivant :
0x8004e810 in ti_sysbios_family_arm_a8_intcps_Hwi_vectors ()
#0 0x8004e810 in ti_sysbios_family_arm_a8_intcps_Hwi_vectors ()
#1 0x80002f04 in ti_sysbios_family_arm_exc_Exception_excHandlerDataAsm(int0_t) ()
at /home/rnd_share/sysbios/bios_6_51_00_15/packages/ti/sysbios/family/arm/exc/Exception_asm_gnu.asm:103
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
r0 0x20000197 536871319
r1 0x20000197 536871319
r2 0x20000197 536871319
r3 0x20000197 536871319
r4 0x20000197 536871319
r5 0x6 6
r6 0x80000024 2147483684
r7 0x80007a0c 2147514892
r8 0x8004f0a8 2147807400
r9 0x80041340 2147750720
r10 0x80040a3c 2147748412
r11 0xffffffff 4294967295
r12 0x20000197 536871319
sp 0x7fffff88 0x7fffff88
lr 0x80002f04 2147495684
pc 0x8004e810 0x8004e810 <ti_sysbios_family_arm_a8_intcps_Hwi_vectors+16>
cpsr 0x20000197 536871319
PC = 8004E810, CPSR = 20000197 (ABORT mode, ARM IRQ dis.)
R0 = 20000197, R1 = 20000197, R2 = 20000197, R3 = 20000197
R4 = 20000197, R5 = 00000006, R6 = 80000024, R7 = 80007A0C
USR: R8 =8004F0A8, R9 =80041340, R10=80040A3C, R11 =FFFFFFFF, R12 =20000197
R13=80212590, R14=80040A3C
FIQ: R8 =AEE1D6FA, R9 =C07BA930, R10=1B0B137A, R11 =7EC3F1DF, R12 =2000019F
R13=80065CF8, R14=00000000, SPSR=00000000
SVC: R13=4030CB20, R14=00022071, SPSR=00000000
ABT: R13=7FFFFF88, R14=80002F04, SPSR=20000197
IRQ: R13=F4ADFD8A, R14=80041020, SPSR=8000011F
UND: R13=80085CF8, R14=ED0F7EF1, SPSR=00000000
(gdb) frame
#0 0x8004e810 in ti_sysbios_family_arm_a8_intcps_Hwi_vectors ()
(gdb) frame 1
#1 0x80002f04 in ti_sysbios_family_arm_exc_Exception_excHandlerDataAsm(int0_t) ()
at /home/rnd_share/sysbios/bios_6_51_00_15/packages/ti/sysbios/family/arm/exc/Exception_asm_gnu.asm:103
103 mrc p15, #0, r12, c5, c0, #0 @ read DFSR into r12
(gdb) list
98 .func ti_sysbios_family_arm_exc_Exception_excHandlerDataAsm__I
99
100 ti_sysbios_family_arm_exc_Exception_excHandlerDataAsm__I:
101 stmfd sp!, {r0-r12} @ save r4-r12 while we're at it
102
103 mrc p15, #0, r12, c5, c0, #0 @ read DFSR into r12
104 stmfd sp!, {r12} @ save DFSR
105 mrc p15, #0, r12, c5, c0, #1 @ read IFSR into r12
106 stmfd sp!, {r12} @ save DFSR
107 mrc p15, #0, r12, c6, c0, #0 @ read DFAR into r12
(gdb) monitor cp15 6 0 0 0
Reading CP15 register (6,0,0,0 = 0x7FFFFF54)
J'ai cru comprendre qu'il y avait une exception en cours, que l'on peut voir dans l'image 1. Il essaie de sauvegarder les registres sur la pile :
101 stmfd sp !, {r0-r12} @ save r4-r12 while we're at it
Mais, le pointeur de pile était incorrect à :
ABT : R13=7FFFFF88
Je ne comprends pas les deux :
- Quelle peut être la cause de cette valeur de SP dans les contextes ABT et IRQ ?
- Que se passe-t-il réellement dans la trame 0 ? En d'autres termes, comment Cortex a-t-il réagi à l'abandon des données alors qu'il se trouvait déjà dans le gestionnaire d'exceptions ?
Cet appareil démarre normalement, cette situation se produit environ 3 fois par 10 démarrages. Cela n'arrive jamais quand on démarre à partir du débogueur, seulement à partir du release et seulement quand on démarre à partir du bootloader.