3 votes

Comment comprendre pourquoi une exception ARM se produit ?

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 :

  1. Quelle peut être la cause de cette valeur de SP dans les contextes ABT et IRQ ?
  2. 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.

0voto

wiesniak Points 478

Deux semaines plus tard...

La procédure de démarrage est la suivante :

  1. Le chargeur de démarrage de deuxième étape charge l'application en mémoire

  2. La deuxième étape du bootloader saute au début de l'application.

  3. la fonction principale de l'application est saisie.

Il s'avère que parfois, les valeurs initialisées statiquement de l'application ont des valeurs correctes après une étape du démarrage, mais qu'après trois étapes, elles sont corrompues. Je veux dire que l'image de l'application est corrompue.

Les caches n'ont pas été vidés correctement entre les étapes 1 et 2.

La désactivation des caches au niveau de la 2ème étape du bootloader n'a pas du tout réglé le problème. Il faut maintenant le réparer correctement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X