2016-06-21 109 views
0

我在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关闭(像预期的那样)

+0

我想你说你的异常处理程序启用VFP并返回重试'vadd.f32 s19,s19,s17',用户空间代码产生另一个异常。我花了一段时间才弄清楚什么*在第一时间让处理器打开VFP *说,因为它被翻译成英文很糟糕。 :(请进行编辑以改善这一点;如果我正确地猜测了你的意思,请自由复制我的第一句话 –

+0

@PeterCordes谢谢,修正 – user3124812

回答

3

根据the Cortex-A9 FPU docs,对于FPEXC.DEX要设置的唯一原因是,如果事情被错误地配置为尝试短向量运算。 VFP中的“V”由于NEON出现而被弃用,并且在任何比Cortex-A8更新的任何东西上都不被支持。

你需要确保FPSCR.Len和FPSCR.Stride *设置为0

* OK,跨跃所以严格的价值不应该无论何时莱恩== 0,但嘿,没有很好的理由不是 ...

+0

你是对的当Len&Stride被清除时处理程序,应用程序工作。从参考手册“ARM反对使用这些字段的非零值”。BTW你有什么想法如何不零值进入FPSCR.Len&FPSCR.Stride在第一个地方吗?我经常得到他们'7' &'3' – user3124812

+1

抱歉,我的错误是没有正确清理存储缓冲区,并在切换过程中从某些垃圾中恢复FPSCR。 – user3124812