首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解为什么手臂异常会发生?

如何理解为什么手臂异常会发生?
EN

Stack Overflow用户
提问于 2018-05-04 08:17:58
回答 1查看 428关注 0票数 3

我正在努力理解我遇到的手臂异常的原因是什么。它在系统启动过程中随机发生,可能以几种不同的方式出现。

最简单的方法之一是:

代码语言:javascript
复制
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)

我的理解是,有一些正在进行的异常,可以在框架1中看到。它试图将寄存器保存到堆栈中:

101 stmfd sp!,{r0-r12} @保存r4-r12

但是,堆栈指针在以下位置不正确:

ABT: R13=7FFFFF88

我不明白这两点:

  1. 在ABT和IRQ上下文中,SP值这么高的原因是什么?
  2. 框架0中的实际内容是什么?换句话说,在已经处于异常处理程序中的时候,Cortex是如何对数据中止作出反应的?

该设备通常正常启动,这种情况发生在每10只靴子上3次。从调试器启动、只发布和从引导加载程序启动时,都不会发生这种情况。

EN

回答 1

Stack Overflow用户

发布于 2018-05-14 10:42:40

两周后..。

引导过程如下:

  1. 第二阶段引导加载程序将应用程序加载到内存。
  2. 第二阶段引导加载程序跳转到应用程序启动。
  3. 输入应用程序的主要功能。

结果表明,有时静态初始化的应用程序值在启动1步后具有正确的值,但在第3步中它们就被破坏了。我的意思是应用程序图像被破坏了。

缓存在第一步和第二步之间没有被正确地刷新。

在第二阶段禁用缓存引导加载程序修复问题。现在需要正确地解决这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50170339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档