gpt4 book ai didi

c++ - 中断处理程序中的浮点运算(PowerPC、VxWorks)

转载 作者:太空狗 更新时间:2023-10-29 19:49:47 26 4
gpt4 key购买 nike

我还没有找到任何资源来准确回答我在我正在使用的软件中看到的问题,所以我会问这里的天才!

首先,我在 PowerPC 处理器上运行 VxWorks。

在尝试调试一个单独的问题时,我尝试在中断处理例程中抛出一些快速而肮脏的调试代码。它涉及一个 double 浮点运算来存储一个感兴趣的值(即,自从我看到最后一次中断进入以来已经过了多长时间),我后来在运行线程的处理程序之外使用了它。我没有看到这方面的问题(当然,它需要更长的时间,但在时间上我很满意;中断不会来得太快)但是 VxWorks 肯定不喜欢它。当它到达该代码时,它始终会崩溃,这是导致系统重新启动的严重崩溃之一。我花了一些时间才找到问题的根源是双重操作,我意识到它甚至不是双重“操作”,甚至从中断中调用的例程中返回常量 double 值也惨遭失败。

在 PowerPC(或其他一般体系结构)上,在中断处理程序中执行浮点运算并在中断处理程序调用的函数中返回浮点(或其他类型)值通常会出现问题吗?我不知道为什么这会导致程序崩溃。

(解决方法是将自上次中断以来的“滴答”转换为自上次中断以来的“时间”,直到代码超出处理程序为止,因为它似乎可以很好地处理长整数操作。)

最佳答案

在 VxWorks 中,每个使用浮点的任务都必须在创建任务时指定,以便在上下文切换期间保存 FP 寄存器,但仅当从使用浮点的任务切换时。这允许非浮点任务具有更快的上下文切换时间。

然而,当中断抢占浮点任务时,很可能是 FP 寄存器未保存的情况。为此,中断处理程序需要确定哪个任务被抢占,以及它是否已被指定为浮点任务;这会使中断延迟更高且可变,这在实时系统中通常是不可取的。

因此,要使其正常工作,任何使用 float 的中断例程都必须明确保存和恢复 FP 寄存器本身。任何使用 float 的任务在任何情况下都必须如此指定,但如果您只有一个这样的任务,您可以不用它。

如果浮点任务被抢占,您的中断将修改该任务使用的浮点寄存器值,当 FP 任务恢复时的结果是不确定的,但包括导致浮点异常 - 如果例如,先前非零寄存器变为零,随后用作除法运算的右侧。

然而在我看来,在这种情况下,浮点运算可能完全没有必要。您的“解决方法”实际上是最传统、最安全和最具确定性的方法,应该被视为对您的设计的修正,而不是解决方法

关于c++ - 中断处理程序中的浮点运算(PowerPC、VxWorks),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6597030/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com