【问题标题】:How to read/write FPSCR on Cortex-A9?如何在 Cortex-A9 上读/写 FPSCR?
【发布时间】:2013-08-08 16:54:34
【问题描述】:

我正在开发基于 ARM Cortex-A9 的系统运行软件,该软件使用嵌套中断;然而,实现嵌套中断的方法似乎存在缺陷,因为浮点值和操作可能会被破坏。

为了缓解这种情况,我尝试在进入中断例程时保存浮点寄存器的状态。我为 FPSCR 尝试的方法是这样的:

asm ("VMRS %0, FPSCR " : "=r" ( savedReg)); //Save

asm ("VMSR FPSCR, %0 " : "=r" ( savedReg)); //Restore

读取似乎有效,但写入无效,它会导致 A9 重新启动。

是否可以通过这种方式访问​​ FPSCR?还有什么方法推荐?

【问题讨论】:

    标签: arm inline-assembly neon


    【解决方案1】:

    您正在向 FPSCR 和 savedReg 写入一个未定义的值。你想要:

    asm volatile ("VMSR FPSCR, %0 " : : "r" ( savedReg)); //Restore
    

    也不能保证浮点运算保持在内联汇编程序之间(尽管volatile"memory" 可能有帮助),请使用独立汇编程序。

    【讨论】:

    • 哦,问题出在 GCC 汇编器上,而不是 ARM 指令上。
    【解决方案2】:

    据我所知,只有在主管模式下才允许修改协处理器。

    【讨论】:

    • 我不确定你在这里想说什么,但在用户模式下绝对允许编写 FPSCR。例如,它是重置累积异常标志或更改舍入模式的方法 - 您可以通过 从标准 C 代码执行这些操作。
    【解决方案3】:

    我使用 linux 内核模块来运行汇编代码,以便在加载时让用户模式访问有趣的协处理器寄存器。这仅对实验/诊断有用,显然不适用于运输代码。

    【讨论】:

    • 我没有运行 Linux 或任何其他操作系统,只是一个“裸机”应用程序。我应该已经处于主管模式了,对吧?
    • 一旦进入用户模式,切换回来的唯一方法是通过异常,并且可以在主管模式下设置异常处理程序。这意味着,您必须修改启动代码。
    • 老实说,一旦初始设置完成,我看不出有任何理由在主管模式下执行某些操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2011-10-06
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    相关资源
    最近更新 更多