2010-02-12 15 views
4

在vxworks中,每個任務是否應該使用VX_FP_TASK選項產生?在vxworks中,每個任務是否應該使用VX_FP_TASK選項產生?

如果您的任務使用任何浮點操作,則需要VX_FP_TASK選項。但是,如何預測未來 - 我的意思是,如何知道他/她是否會使用浮動?

在修復任何錯誤或引入新代碼的同時,程序員是否應該找到哪些所有任務都會受到他/她代碼變化的影響,以及是否使用此選項產生了該任務?這非常乏味。我錯過了什麼嗎?

回答

5

VX_FP_TASK強制任務上下文切換包含FP寄存器。這增加了上下文切換時間。如果在你的申請時間內,即使有這樣的開銷,也可以滿足期限和績效目標,那麼我建議這樣做的問題很少。沒有VX_FP_TASK可能被認爲是優化只有在必要時才適用。因此,如果默認情況下使用VX_FP_TASK,那麼在少數需要優化性能的情況下,您可能會進行較少的檢查;因爲通常優化是不必要的以達到所需的結果。如果這種上下文切換性能開銷造成了項目的製造或者中斷,那麼在任何情況下都可能是微不足道的。另一方面,儘管在嵌入式系統中FPU變得越來越普遍,但由於傳統的硬件FP支持的缺乏,嵌入式系統設計人員通常使用FP作爲例外而不是規則。因此,一種解決方案是擁有內部設計規則,即在沒有正式的理由和簽名的情況下不得使用浮點:即浮點的使用必須在設計中,而不是程序員的決定。檢查通常是掃描源爲float,doublemath.h的簡單情況。 (因爲在代碼中沒有發生這兩種情況,可能很難使用浮點)。例如,您可以添加一個預生成靜態分析檢查,查找這些檢查並標記警告。

在許多應用程序中,可以進行設計,使得FP數學運算自然侷限於特定任務。然而,當有人選擇使用現有功能用於另一個非FP安全的任務時,會出現問題。這可能難以發現;對此的解決方案是使用浮點的函數,並且可以在其他任務中使用該函數以包含使用taskOptionsGet()測試任務選項的調試ASSERT。

所以掃描使用的floatdoublemath.h,並添加ASSERT檢查,以使用這些可能會保護你的代碼維護引入誤差的功能的組合。

[加入2010Feb14]

多達複雜的宏通常是壞事,我建議以下可能是有用的(如上面所提到的):

#if NDEBUG 
    #define ASSERT_FP_SAFE() ((void) 0) 
#else 
    #define ASSERT_FP_SAFE() do{ int opt; \ 
           STATUS st = taskGetOptions(taskIdSelf(), &opt); \ 
           assert(st == OK && (opt & VX_FP_TASK) != 0) ; \ 
           }while(0) ; 
#endif 

該宏應該插入到任何使用float或double的函數中,或者包含任何其他可以使用FP的庫(可以通過文本搜索來實現)。當從非FP任務調用這樣的函數時,斷言將失敗。

注意從taskGetOptions()返回的檢查將捕獲在中斷上下文中使用浮點。儘管如果斷言發生在中斷中,您可能無法獲得任何輸出。對logMsg()的調用可能更安全;你可以使用,如果st!= OK,否則斷言()。

不幸的是,它是一個運行時斷言,所以代碼必須運行才能檢查它。如果可以通過靜態分析來檢測,會更好,但我想不出一個簡單的方法。但是,如果您也使用代碼覆蓋率分析,那麼這可能就足夠了。即使您選擇完成所有任務VX_FP_TASK,這也可能是一個好習慣;那樣如果有人忘記做這個或那個,你有機會抓住它。

3

從以往的經驗,我可以給你一個簡單的答案:始終產卵與VX_FP_TASK任務。特別是如果你的代碼可以用於不同的架構。

根據編譯器(gnu,diab),您使用的編譯標誌和架構,浮點寄存器不僅可用於浮點運算。在大多數體系結構中,FP寄存器比常規寄存器大,因此它們成爲優化代碼的最佳選擇。例如,在PPC603處理器中,如果使用C++而不是普通的C,FP寄存器將用於優化,如果您沒有在該任務上啓用VX_FP_TASK,則可能會損壞另一個任務的FP寄存器,儘管它沒有進行任何計算!

正確執行比性能更重要,大多數情況下,性能提升並不能證明由於未啓用而導致的風險。

如果你想確保所有的任務都啓用了標誌,考慮增加一個鉤子,總是能夠創建任務時的標誌與taskCreateHookAdd()

+0

我不知道使用FP寄存器進行非FP操作的優化有時可能會被額外的上下文切換開銷超過 - 編譯器不會意識到這一點。聽起來像是一個值得關閉的優化,如果應用程序摔碎任務很多。這就是說,我同意;總是避免過早的優化,並以默認的VX_FP_TASK開始,即使您實施了我所建議的'防禦'技術。 – Clifford 2010-02-16 09:32:15

+0

嗨馬塞洛,謝謝你的回覆。我不理解最後一句話 - 「如果你想確保所有任務都啓用了標誌,考慮添加一個總是在任務創建期間使用taskCreateHookAdd()啓用標誌的鉤子」。你的意思是,如果設計者在創建任務時沒有包含VX_FP_TASK選項,這個鉤子會在編譯代碼的時候放入它? 請您詳細說明並詳細解釋。 在此先感謝。 – aks 2010-02-17 15:43:30

2

始終使用VX_FP_TASK!沒有它的成本,並試圖追蹤不確定的錯誤導致難以置信的昂貴。

相關問題