我得到一个未定义的指令异常时执行:
0xED2D8B0E VPUSH {D8-D14}
(注意:该语句是由编译器作为C语言函数入口协议的一部分生成的)
初始化代码:
;; Initialize VFP (if needed).
;; BL __iar_init_vfp HJ REMOVED AND REPLACED WITH BELOW
MRC p15, #0, r1, c1, c0, #2 ; r1 = Access Control Register
ORR r1, r1, #(0xf << 20) ; enable full access for p10,11
MCR p15, #0, r1, c1, c0, #2 ; Access Control Register = r1
MOV r1, #0
MCR p15, #0, r1, c7, c5, #4 ; flush prefetch buffer because of FMXR below
; and CP 10 & 11 were only just enabled
; Enable VFP itself
MOV r0,#0x40000000
FMXR FPEXC, r0 ; FPEXC = r0
当目标FPU被设置为VFPv3或VFPv3 + NEON时,我得到未定义的异常。
初始化代码放在"cstartup.c"文件中,在__iar_program_start
和?cstartup
代码处,以下代码段:
MRC p15,0,R1,C1,C0,0
LDR R0,=CP_DIS_MASK ;; 0xFFFFEFFA
AND R1,R1,R0
ORR R1,R1,#(1<<12)
MCR p15,0,R1,C1,C0,0
寄存器(在VPUSH之前):
CPSR: 0x80000113
APSR: 0x80000000
SPSR: 0x000001D3
工具:
- IAR嵌入式工作台IDE &编译器- 7.40
- I-Jet调试探头
- Zoom AM3517 eval board TI AM35X Cortex-A8处理器
问题:
- 在上面的初始化代码中,需要哪些语句NEON和VFP哪个?
- 是否有任何初始化指令我错过了NEON和VFP初始化?
- 是否有语句我需要放置在宏文件的调试探针吗?
问题中给出的代码正确地初始化了Cortex-A8处理器上的浮点处理器。
得到未定义指令异常的问题(导致这个问题),是由操作系统向FPEXC寄存器写入无效值引起的,导致浮点处理器被禁用。