2011-07-06 27 views
3

我還沒有發現任何資源恰好回答什麼,我想用我在一塊的軟件看到我工作的問題來了解,所以我會問這裏的天才!浮點運算(PowerPC的,VxWorks的)

對於初學者,我在PowerPC處理器上運行VxWorks。

在嘗試調試一個單獨的問題,我想在中斷處理程序拋出一些快速和骯髒的調試代碼。它涉及一個雙精度浮點運算來存儲一個感興趣的值(也就是自從看到最後一箇中斷進入之後已經過了多長時間),後來我在運行線程的處理程序之外使用了這個值。我沒有看到這方面的問題(當然,這需要更長的時間,但是時間上我有很多樂趣;中斷不會太快),但VxWorks肯定不喜歡它。它一直崩潰,當它到達代碼,重新啓動系統的壞崩潰之一。我花了一點時間來追蹤雙重操作的問題來源,並且我意識到它甚至不是雙重的「操作」,即使從中斷中調用的例程中返回一個不變的雙重值,也很糟糕。

在PowerPC(或其它架構一般)的存在一般問題做浮點運算的中斷處理程序,並通過中斷處理程序調用的函數返回浮點(或其他類型)值?我不知道爲什麼這會導致程序崩潰。

(解決方法是推遲上次中斷「滴答」轉化爲「時間」,因爲拉斯特中斷,直到代碼落在該處理的,因爲它似乎處理長整數操作就好了。)

+0

您不能使用64位定點值嗎?應該足夠大...... –

+0

正如我所提到的,這是解決方法。一般來說,我不會在中斷處理程序中使用浮點運算,因爲它們往往需要很多操作才能完成,並且中斷處理程序需要很快。我的問題真的是「爲什麼不行」而不是「我該怎麼做」。我瞭解後者,但前者讓我難以置信。 – Anthony

+0

它應該工作,沒有任何魔術或特殊的,應該工作以及任何其他變量類型或結構。我將反彙編編譯器生成的內容,以瞭解它將值放在哪裏以及另一端在何處拾取值,並將其與傳遞一個無符號整型或其他值進行比較並查看斷開連接。 –

回答

7

在VxWorks中,各利用浮點任務具有使得FP寄存器期間上下文切換保存到被指定爲這樣的任務創建,但僅來自該使用浮點任務切換時。這允許非浮點任務具有更快的上下文切換時間。

當中斷搶佔了一個浮點任務然而,它最有可能是FP寄存器沒有保存的情況。爲此,中斷處理程序需要確定哪些任務被預佔,以及它是否被指定爲浮點任務;這會使中斷延遲變得更高和變化,這在實時系統中通常是不希望的。

因此,要使其工作,任何使用浮點的中斷例程都必須明確地保存和恢復FP寄存器本身。任何使用浮點的任務在任何情況下都必須被指定,儘管如果你只有一個這樣的任務,你就可以避開它。

如果一個浮點任務被搶佔,你的中斷將修改該任務使用的浮點寄存器值,當FP任務恢復時的結果是非確定性的,但包括引起一個浮點異常 - 例如,如果先前的非零寄存器變爲零,並且隨後被用作除法操作的右側。

然而在我看來,在這種情況下,浮點運算可能完全沒有必要。您的「解決辦法」實際上是傳統的,最安全和最確定的方法,並可能應該算是設計的校正而非解決方法

-1

我想你會發現this文章有趣。也許你正在進入一個浮點異常。

我從來沒有使用的PowerPC,但我好與谷歌:P

5

請問您的ISR調用fppSave()/ fppRestore()函數?

如果沒有,那麼ISR正在跺腳現有任務可能正在使用的FP寄存器。

具體地,FP寄存器通過在PPC架構(我想處理擲/捕獲)C++編譯器使用。

0

在VxWorks中,至少對於PPC架構中,浮點操作將導致FP Unavilable異常。這是因爲當發生中斷時,MSR中的FP位被清除,因爲VxWorks假定不會有FP操作。這加快了ISR /任務上下文切換,因爲FP寄存器不必保存/恢復。

話雖這麼說,有當我們有我們需要FP操作在中斷上下文中的一些調試代碼的時間。我們將調用特定ISR的VxWorks代碼更改爲1)設置MSR [FP],執行fpsave調用,調用ISR,執行fprestore調用,然後清除MSR [FP]。這讓我們解決了這個問題。

話雖這麼說,我同意這裏的鄉親FP操作不應該在ISR上下文中使用,因爲中斷服務程序應在通常不快速和FP操作的其餘部分。

0

我與e300內核工作,同時開發裸機應用程序,我可以說,當發生中斷時,內核關閉FPU,您可以通過檢查MSR的FP位觀察。在對浮點寄存器做任何事情之前,必須通過將1寫入MSR的FP位來重新啓用FPU。然後,您可以根據需要在ISR中對FPU寄存器進行操作。

0

VxWorks中一般的假設是,浮點寄存器不需要保存和由ISR恢復。主要是因爲ISR通常不會混淆它們。從歷史上看,大多數實時任務都沒有做FP,但是這顯然發生了變化。不明顯的是許多沒有明確使用浮點的任務仍然使用浮點寄存器。我相信任何使用C++編寫代碼的任務都會使用浮點寄存器(至少在某些處理器/編譯器上),即使沒有浮點操作是顯而易見的。這些任務應該給FP_? (我忘記了確切的拼寫)任務屬性,導致它們的FP寄存器在上下文切換期間被保存。