2008-09-16 29 views
3

在嵌入式應用程序(用C編寫,在32位處理器上)上有嚴格的實時約束,關鍵代碼(特別是中斷)的執行時間需要保持不變。如何確保代碼運行時由於緩存的執行時間沒有變化?

如何確保不引入時間變化代碼的執行,具體是由於處理器的緩存(無論是L1,L2還是L3)?

請注意,我們關心緩存行爲,因爲它對執行速度的影響很大(有時超過100:1而不是訪問RAM)。由於特定的處理器架構引入的可變性遠不及緩存的大小。

回答

2

如果您可以使用硬件,或與可以使用的人一起工作,則可以關閉緩存。一些CPU有一個引腳,如果連接到地而不是電源(或者另一種方式),則會禁用所有內部高速緩存。這會帶來可預測性,但速度不會很快!

如果失敗了,也許在軟件代碼的某些地方可能會寫入故意用垃圾填充緩存,所以接下來發生的任何事情都可以保證是緩存未命中。做得對,可以提供可預測性,也許只能在某些地方完成,所以速度可能比完全禁用緩存更好。最後,如果速度很重要 - 仔細設計軟件和數據,就好像在舊式的8位CPU編程中一樣 - 保持足夠小以適應L1緩存。我總是驚訝於現在的板載緩存如何比小型計算機上的所有內存更大(笨拙十年)。但這將是艱苦的工作,需要聰明。祝你好運!

2

兩種可能性:

完全禁用緩存。應用程序運行速度較慢,但​​沒有任何可變性。

將代碼預加載到緩存中並「鎖定」。大多數處理器都提供了這樣的機制。

-1

預分配內存,並確保中斷不影響緩存(不可能,正確)。

/艾倫

2

看來你指的是沒有考慮實時系統內置的x86處理器系列,因此對於固定時間執行沒有真正的保證(CPU可能會重新排序微指令,比CPU有錯誤預測條件跳轉時每次刷新的分支預測和指令預取隊列...)

-1

瞭解用於複雜操作和使用定時器的最差情況運行時。

0

這個答案會發出嘲笑,但它的目的是讓你覺得:

只運行一次代碼。

我這樣說的原因是因爲如此之多會使它變化,你甚至可能無法控制它。你對時間的定義是什麼?假設操作系統決定將您的進程置於等待隊列中。

接下來,由於高速緩存性能,內存延遲,磁盤I/O等原因,您將具有不可預測性。這些都歸結爲一件事。有時需要時間才能將信息存入代碼可以使用的處理器中。包括獲取/解碼代碼本身的時間。

另外,您可以接受多少差異?這可能是你40毫秒沒問題,或者你可以用10納秒。

根據應用程序域,您甚至可以進一步屏蔽或隱藏差異。計算機圖形學人們多年來一直在渲染屏幕外緩衝區以隱藏每幀渲染時間的變化。

傳統的解決方案只是刪除儘可能多的已知可變利率的東西。將文件加載到RAM中,預熱緩存並避免IO。

+0

所有有效的問題,但是這個問題與沒有I/O,分頁,最小操作系統等的「裸機」應用程序有關。 – Benoit 2008-09-16 03:15:31

0

如果您在關鍵代碼「inline」中進行所有函數調用,並儘量減少變量的數量,以便讓它們具有「註冊」類型。 這應該會改善程序的運行時間。 (你可能必須以特殊的方式編譯它,因爲編譯器這些天往往忽視你的'註冊'標籤)

我假設你有足夠的內存不會導致頁面錯誤,當你嘗試從內存。頁面錯誤可能需要很長時間。

你也可以看看生成的彙編代碼,看看是否有很多分支和內存instuctions可以改變你的運行代碼。

如果在您的代碼執行中發生中斷,則需要更長的時間。你是否啓用了中斷/異常?