我在ARM cortex-a9上有一个设备,并试图为此设备的OS实施“懒惰浮动切换”。 “懒切换”是当手臂; VFP;浮点扩展;未定义的指令;
- VFP支持被禁用,
- 线程试图执行任何VFP指令,并生成VFP的例外,
- 异常处理程序反过来,管理线程上下文&回报所以同样的指令将再次尝试,
- 调度程序在切换线程之前关闭VFP。
问题是几乎所有的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
; - VFPv3提供并实现完整的硬件FPU指令集;
MVFR0
&MVFR1
也表示所有功能都已实现并且不需要软件模拟。
任何想法可能是这些额外例外的原因是什么?
PS:
应用程序是建立瓦特/ -mcpu=cortex-a9 -marm -mfpu=vfpv3-fp16 -mfloat-abi=hard -ffast-math
;
vpush...
,vldr...
产生例外仅当VFP关闭(像预期的那样)
我想你说你的异常处理程序启用VFP并返回重试'vadd.f32 s19,s19,s17',用户空间代码产生另一个异常。我花了一段时间才弄清楚什么*在第一时间让处理器打开VFP *说,因为它被翻译成英文很糟糕。 :(请进行编辑以改善这一点;如果我正确地猜测了你的意思,请自由复制我的第一句话 –
@PeterCordes谢谢,修正 – user3124812