我正在开发一个运行使用嵌套中断的软件的基于ARM Cortex-A9的系统;但是,实现嵌套中断的方法似乎有缺陷,因为浮点值和操作可能会被破坏。
为了缓解这种情况,我试图在进入中断例程时保存浮点寄存器的状态。我正在为FPSCR尝试的方法是:
asm ("VMRS %0, FPSCR " : "=r" ( savedReg)); //Save
asm ("VMSR FPSCR, %0 " : "=r" ( savedReg)); //Restore
读取似乎有效,但不是写入,它会导致A9重新启动。
是否可以通过这种方式访问FPSCR?建议采用其他什么方法?
答案 0 :(得分:1)
据我所知,仅在管理员模式下才允许修改协处理器。
答案 1 :(得分:1)
您正在为FPSCR和savedReg写一个未定义的值。你想要:
asm volatile ("VMSR FPSCR, %0 " : : "r" ( savedReg)); //Restore
此外,无法保证浮点运算保持在内联汇编程序之间(尽管volatile
和"memory"
可能有帮助),请使用独立汇编程序。
答案 2 :(得分:0)
我使用Linux内核模块来运行汇编代码,以便在加载时为用户模式访问有趣的协处理器寄存器。这仅适用于实验/诊断,显然不适用于运输代码。