隨著代碼行數(shù)從幾千到上百萬不等,嵌入式軟件變得日益復(fù)雜,但總體目標(biāo)依然是實現(xiàn)穩(wěn)健、正確且快速執(zhí)行的軟件??焖賵?zhí)行的軟件需要以最優(yōu)方式管理可用的 CPU 和內(nèi)存資源,這對內(nèi)存空間(尤其是 RAM)有限的嵌入式系統(tǒng)來說不失為一項挑戰(zhàn)。
為此,必須通過執(zhí)行堆棧和堆分析對 RAM 的使用情況進(jìn)行分析。開發(fā)人員手動估計堆棧和堆負(fù)載是一項艱巨的任務(wù),即使對于小程序來說也是如此。如果估計不正確,則可能會導(dǎo)致堆棧溢出和未定義的行為。
因此,一些編碼標(biāo)準(zhǔn)要求強制執(zhí)行內(nèi)存分配使用最佳實踐,以避免不必要的開銷。但是,堆棧仍是 RAM 的必要組成部分,需要得到優(yōu)化利用。
為什么嵌入式系統(tǒng)需要堆棧分析?
當(dāng)可用堆棧小于代碼需求時,就會發(fā)生堆棧溢出。然而,當(dāng)為環(huán)境配置的堆棧大于需求時,內(nèi)存又會被浪費。開發(fā)人員必須持續(xù)一致地估計安全關(guān)鍵型應(yīng)用中最差情形下的堆棧使用量,以防止軟件運行時發(fā)生 RAM 不足的情況。
堆棧估計不正確所帶來的風(fēng)險。
如何估計堆棧分析?
手動估計堆棧
雖然手動估計堆棧分析偶爾會有幫助,但對于更復(fù)雜的系統(tǒng)來說可能充滿挑戰(zhàn)。這就需要徹底了解函數(shù)調(diào)用的深度、所有局部變量的細(xì)節(jié),以及執(zhí)行過程中隨時發(fā)生的中斷幀的大小,等等。這是一個漫長而又容易出錯的過程。使用靜態(tài)代碼分析工具可以快速計算出上述結(jié)果,而不必手動執(zhí)行這個過程。
使用靜態(tài)代碼分析器
開發(fā)人員可以通過靜態(tài)代碼分析器預(yù)測堆棧的使用情況。分析工具有助于分析函數(shù)調(diào)用深度、局部變量和返回參數(shù)的堆棧估計、嵌套中斷以及執(zhí)行期間發(fā)生的中斷幀的大小。使用靜態(tài)代碼分析器的好處在于,它可以處理編碼規(guī)則違規(guī)、運行時缺陷、編碼復(fù)雜性以及堆棧分析估計。它在幾分鐘內(nèi)就能完成這些操作,從而幫助開發(fā)人員節(jié)省了手動計算堆棧使用量的時間。
對目標(biāo)進(jìn)行測試和測量
靜態(tài)分析器可以在開發(fā)過程中估計堆棧的使用量。但是,最好在真實硬件上獲得實際的堆棧使用量數(shù)據(jù)。許多開發(fā)環(huán)境都具有硬件模擬功能,并提供實時堆棧分析功能。在實際硬件上執(zhí)行堆棧分析,并創(chuàng)建溢出場景來測試故障安全例程,這一點非常重要?,F(xiàn)在,最大的問題是:何時使用靜態(tài)分析工具執(zhí)行堆棧分析?何時在實際目標(biāo)上執(zhí)行?
何時執(zhí)行堆棧分析?
執(zhí)行堆棧分析是軟件開發(fā)生命周期中的一個連續(xù)過程。如果僅在軟件開發(fā)生命周期結(jié)束時由單獨的質(zhì)量評估團(tuán)隊估計堆棧使用量,則可能會使整個開發(fā)工作面臨風(fēng)險。此外,在開發(fā)周期的后期解決問題可能會出錯且耗時;在確定是更改硬件還是軟件設(shè)計時,這種做法可能還會造成混亂。執(zhí)行堆棧分析的最佳時點是:
在添加新功能時
在軟件中每添加一項新功能,都會使堆棧使用量增加。開發(fā)人員必須密切關(guān)注新功能的堆棧使用情況。
執(zhí)行堆棧分析、進(jìn)行調(diào)試和修復(fù)復(fù)雜代碼:在每個主要功能實現(xiàn)后,開發(fā)人員可以在本地對特定軟件組件或軟件模塊應(yīng)用靜態(tài)分析器,以評估基礎(chǔ)軟件和已實現(xiàn)軟件之間堆棧使用量的增加情況。
在整個開發(fā)過程中監(jiān)控堆棧分析:QA 團(tuán)隊和產(chǎn)品負(fù)責(zé)人可以使用靜態(tài)分析器對持續(xù)集成 (CI) 管道進(jìn)行堆棧估計,以在控制板上顯示結(jié)果。此過程有助于在軟件開發(fā)生命周期中跟蹤堆棧分析。
執(zhí)行良好實踐以確保堆棧使用量最低:質(zhì)量門有助于避免違反 MISRA 和 AUTOSAR 編碼規(guī)范。這些規(guī)范要求強制有條件地使用動態(tài)內(nèi)存分配。
在軟件發(fā)布前
靜態(tài)分析器執(zhí)行的堆棧估計提供了有力的證據(jù),表明堆棧使用量處于控制之中。在每次軟件發(fā)布之前,都應(yīng)在標(biāo)準(zhǔn)工作負(fù)載、最小負(fù)載和最大負(fù)載下,對真實目標(biāo)運行堆棧分析,以全面了解堆棧的使用情況。驗證堆棧上溢和下溢事件的故障安全例程也至關(guān)重要。
Polyspace 對堆棧估計有何作用?
Polyspace Code Prover 對每個函數(shù)中局部變量的大小上限和下限執(zhí)行保守和樂觀估計,以得出函數(shù)級和程序級的最大和最小堆棧使用量。該分析考慮了函數(shù)返回值的大小、函數(shù)參數(shù)的大小、局部變量的大小,以及內(nèi)存對齊所需的額外填充。
Polyspace 桌面版上的堆棧分析代碼度量。
要了解和調(diào)試堆棧利用過量的問題,開發(fā)人員可以在本地運行 Polyspace,通過檢查函數(shù)調(diào)用深度來確定堆棧利用過量的確切原因,并通過優(yōu)化利用可用資源來降低堆棧使用量。
函數(shù) table_loop() 的調(diào)用樹和更高的堆棧估計。
在整個開發(fā)過程中監(jiān)控堆棧分析
Polyspace Access 是結(jié)果數(shù)據(jù)庫服務(wù)器,可以在 Web 瀏覽器上呈現(xiàn)圖形用戶界面。CI 流程可以觸發(fā) Polyspace Server 上的堆棧分析,以生成堆棧使用量估計結(jié)果。此結(jié)果可以上傳到結(jié)果數(shù)據(jù)庫。QA 團(tuán)隊和產(chǎn)品負(fù)責(zé)人可以在圖形化前端持續(xù)查看堆棧使用量,并在可用堆棧資源過度使用的情況下采取必要的措施。
Polyspace Access 中的項目級堆棧估計。
下一步是,檢查堆棧使用量較高的函數(shù),并將特定函數(shù)分配給開發(fā)人員,以供進(jìn)一步調(diào)查和調(diào)試。Polyspace 允許您為分析結(jié)果指定狀態(tài)和嚴(yán)重性并添加注釋,然后在 Jira 等 Bug 跟蹤工具中將這些結(jié)果分配給開發(fā)人員。
Polyspace Access 中的函數(shù)級堆棧估計和結(jié)果審查控制板。
執(zhí)行良好實踐以確保堆棧使用量最低
對于產(chǎn)品級代碼,必須絕對避免違反編碼標(biāo)準(zhǔn),如 MISRA C、MISRA C++、AUTOSAR C++ 等。這些編碼標(biāo)準(zhǔn)要求強制禁止動態(tài)內(nèi)存分配,并推薦特定用例來優(yōu)化靜態(tài)內(nèi)存分配。
Polyspace Bug Finder 有助于識別任何違反最佳實踐的行為,開發(fā)人員可以在本地監(jiān)控這些行為,而產(chǎn)品負(fù)責(zé)人可通過 Polyspace Access 監(jiān)控這些行為。以下編碼規(guī)則詳細(xì)說明了靜態(tài)內(nèi)存分配的最佳實踐。靜態(tài)內(nèi)存分配可以使用 Polyspace Bug Finder 進(jìn)行分析。
隨著代碼的循環(huán)復(fù)雜度、嵌套函數(shù)調(diào)用的數(shù)量、函數(shù)中變量數(shù)目等的增加,堆棧的使用量也在增加。Polyspace 能夠控制影響堆棧使用量的諸多變量,并支持設(shè)置代碼復(fù)雜度閾值。
設(shè)置代碼復(fù)雜度閾值。
Polyspace Bug Finder 提供了許多針對靜態(tài)和動態(tài)內(nèi)存分配的運行時檢查。解決所有高、中和低優(yōu)先級缺陷有助于降低內(nèi)存分配帶來的風(fēng)險。
運行時靜態(tài)和動態(tài)內(nèi)存檢查。
無論使用何種方法來計算堆棧使用量,稍微增大堆棧大小都不失為一個好辦法。這種方法有助于避免測試期間可能未檢測到的堆棧溢出導(dǎo)致的系統(tǒng)漏洞。
堆棧溢出漏洞是許多嵌入式應(yīng)用程序在實際運行中表現(xiàn)出不可定義行為的一個重要原因。在正確的時間使用正確的工具并遵循最佳實踐,可以增強對軟件防止堆棧溢出的信心。
審核編輯:劉清
-
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
40文章
3520瀏覽量
128808 -
RAM
+關(guān)注
關(guān)注
8文章
1344瀏覽量
114217 -
AUTOSAR
+關(guān)注
關(guān)注
10文章
339瀏覽量
21361
原文標(biāo)題:嵌入式軟件 | 如何在整個開發(fā)過程中持續(xù)監(jiān)控堆棧分析?
文章出處:【微信號:MATLAB,微信公眾號:MATLAB】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論