我在ARM cortex-a9上有一个设备,试图实现"懒惰浮动切换"用于此设备的操作系统。 "懒惰切换"是什么时候
问题是,当启用VFP时,几乎所有VFP指令都会生成同步异常。 简单来说就是
vadd.f32 s19, s19, s17
第一个异常处理程序启用VFP并返回重试vadd.f32 s19, s19, s17
,用户空间代码生成另一个异常
第二次生成同步异常。
异常寄存器,FPEXC为FPEXC.EX == 0, FPEXC.EN == 1, FPEXC.DEX == 1
我无法理解这种同步异常的原因是什么。我查了一下
FPSCR[15, 12-8] == 0
; MVFR0
& MVFR1
也表示所有功能都已实现,并且不需要进行软件模拟。任何想法可能是这些额外例外的原因?
PS:
应用已构建w / -mcpu=cortex-a9 -marm -mfpu=vfpv3-fp16 -mfloat-abi=hard -ffast-math
;
vpush...
,vldr...
仅在VFP关闭时生成异常(按预期行事)
答案 0 :(得分:3)
根据the Cortex-A9 FPU docs,设置FPEXC.DEX的唯一原因是,如果该东西被错误地配置为尝试短向量操作。自从NEON出现以来,VFP中的“V”已经被弃用,并且除了Cortex-A8之外的任何东西都不受支持。
您需要确保FPSCR.Len和FPSCR.Stride * 设置为0.
*好吧,严格来说,当Len == 0时,Stride的值无关紧要,但是,嘿,没有充分的理由不来......