我在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