中断处理程序中的浮点运算(PowerPC,VxWorks)

Ant*_*ony 4 c++ embedded powerpc vxworks interrupt-handling

我没有找到任何资源来完全回答我正在尝试理解的问题我在一个我正在研究的软件中看到的问题,所以我会问这些天才!

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

在尝试调试单独的问题时,我尝试在中断处理例程中抛出一些快速而脏的调试代码.它涉及一个双精度浮点运算来存储一个感兴趣的值(即,自从我看到最后一个中断进入以来已经存在多长时间),我后来在运行线程中的处理程序之外使用了它.我没有看到这方面的问题(当然,它需要更长的时间,但时间方面我很快;中断不会太快)但是VxWorks肯定不喜欢它.当它到达那个代码时,它一直崩溃,这是重新启动系统的一个糟糕的崩溃.我花了一些时间来追踪双重操作作为问题的根源,我意识到它甚至不是双重"操作",即使从中断中调用的例程返回一个常量的双重失败也是如此.

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

(解决方法是延迟将自上次中断后的"滴答"转换为"时间",因为laster中断直到代码超出处理程序,因为它似乎处理长整数操作就好了.)

Cli*_*ord 7

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

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

因此,为了使其工作,任何使用浮点的中断例程必须明确地保存和恢复FP寄存器本身.在任何情况下,任何使用浮点的任务都必须这样指定,但如果你只有一个这样的任务就可以逃脱它.

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

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


Ben*_*oit 5

您的ISR是否调用fppSave()/ fppRestore()函数?

如果没有,则ISR会踩踏现有任务可能正在使用的FP寄存器.

具体来说,FP寄存器由PPC架构上的C++编译器使用(我认为处理throw/catch).