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

4

我在处理一个软件问题时,尝试在中断处理程序中加入了一些快速且简单的调试代码。其中包括一个双精度浮点运算,用于存储感兴趣的值(即自上次中断以来的时间),稍后在我的运行线程中使用。我认为这没有问题(虽然它需要更长的时间,但从时间上来看,我有足够的时间;中断并不会太快地到达),但是VxWorks确实不喜欢它。当代码到达那里时,它会一直崩溃,这是一个糟糕的崩溃,会重新启动系统。我花了一点时间追踪双操作作为问题来源,并意识到甚至在中断中调用的例程返回一个常量双时也会失败。

在PowerPC(或其他体系结构)中,在中断处理程序中进行浮点运算并在由中断处理程序调用的函数中返回浮点(或其他类型)值是否普遍存在问题?我不知道为什么这会导致程序崩溃。

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


难道你不能使用64位定点值吗?应该足够大了... - Kerrek SB
正如我之前提到的,那是一种解决方法。通常情况下,我不会在中断处理程序中使用浮点运算,因为它们往往需要大量的操作才能完成,而中断处理程序需要快速执行。我的问题在于“为什么它不起作用”,而不是“我应该做什么”。我理解后者,但前者让我感到困惑。 - Anthony
它应该能够正常工作,没有任何神奇或特殊之处,应该和任何其他变量类型或结构一样正常工作。我会反汇编编译器生成的内容,以了解它将值放在哪里以及另一端从哪里获取值,将其与传递无符号整数或其他内容进行比较,并查看其中的差异。 - old_timer
1
不了解PowerPC,但保存浮点状态可能会很昂贵,并且通常不会在需要之前进行。如果始终如此,则中断响应时间将受到严重影响。 - Bo Persson
6个回答

7
在VxWorks中,每个使用浮点数的任务都必须在任务创建时指定为此类任务,以便在上下文切换期间保存FP寄存器,但仅在从使用浮点数的任务切换时才保存。这使得非浮点数任务具有更快的上下文切换时间。
然而,当中断抢占浮点数任务时,很可能不会保存FP寄存器。为了做到这一点,中断处理程序需要确定被抢占的任务是哪个,并且是否已将其指定为浮点数任务;这将使中断延迟时间更长且不确定,这通常不适用于实时系统。
因此,为了使其正常工作,任何使用浮点数的中断例程都必须显式保存和恢复FP寄存器。无论如何,任何使用浮点数的任务都必须指定为此类任务,但如果只有一个这样的任务,则可以不指定。
如果浮点数任务被抢占,则您的中断将修改该任务正在使用的浮点寄存器值,当FP任务恢复时,结果是不确定的,但包括导致浮点异常-例如,如果先前为非零寄存器变为零,随后用作除法操作的右操作数。
然而,在这种情况下,我认为浮点运算可能是完全不必要的。您的“解决方法”实际上是传统的、最安全和最确定的方法,应该被视为设计的一种纠正而不是“解决方法”。

5

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

如果没有,那么ISR可能会破坏现有任务正在使用的FP寄存器。

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


0

我在开发裸机应用程序时使用过e300内核,可以说当中断发生时,内核会关闭FPU,您可以通过检查MSR的FP位来观察。在对浮点寄存器进行任何操作之前,必须通过将1写入MSR的FP位来重新启用FPU。然后,在ISR中可以按照需要对FPU寄存器进行操作。


0
在VxWorks中,至少对于PPC体系结构,浮点操作会导致FP Unavilable异常。这是因为当发生中断时,MSR中的FP位被清除,因为VxWorks假定不会有FP操作。这加速了ISR / Task上下文切换,因为不需要保存/恢复FP寄存器。
话虽如此,曾经我们有一段调试代码,需要在中断上下文中进行FP操作。我们修改了调用特定ISR的VxWorks代码,以便1)设置MSR [FP],进行fpsave调用,调用ISR,进行fprestore调用,然后清除MSR [FP]。这解决了我们遇到的问题。
话虽如此,我同意这里其他人的观点,即应在ISR上下文中不使用FP操作,因为ISRs应该快速执行,而FP操作通常不是快速的。

0

VxWorks中的一般假设是浮点寄存器不需要由ISR保存和恢复。主要是因为ISR通常不会对它们进行操作。历史上,大多数实时任务也不使用FP,但这显然已经改变了。不明显的是,许多没有明确使用浮点数的任务仍然使用浮点寄存器。我相信任何使用C++编写代码的任务都会使用浮点寄存器(至少在某些处理器/编译器上),即使没有明显的浮点运算。这些任务应该被赋予FP_?(我忘记了确切的拼写)任务属性,以导致在上下文切换期间保存它们的FP寄存器。


-1

我认为你会发现this篇文章有趣。也许你遇到了浮点异常。

我从未使用过PowerPC,但我善于使用Google :P


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接