衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

為什么嵌入式系統(tǒng)需要堆棧分析?如何進行監(jiān)控堆棧分析呢?

MATLAB ? 來源:MATLAB ? 2024-03-28 10:23 ? 次閱讀

隨著代碼行數從幾千到上百萬不等,嵌入式軟件變得日益復雜,但總體目標依然是實現穩(wěn)健、正確且快速執(zhí)行的軟件??焖賵?zhí)行的軟件需要以最優(yōu)方式管理可用的 CPU 和內存資源,這對內存空間(尤其是 RAM)有限的嵌入式系統(tǒng)來說不失為一項挑戰(zhàn)。

為此,必須通過執(zhí)行堆棧和堆分析對 RAM 的使用情況進行分析。開發(fā)人員手動估計堆棧和堆負載是一項艱巨的任務,即使對于小程序來說也是如此。如果估計不正確,則可能會導致堆棧溢出和未定義的行為。

因此,一些編碼標準要求強制執(zhí)行內存分配使用最佳實踐,以避免不必要的開銷。但是,堆棧仍是 RAM 的必要組成部分,需要得到優(yōu)化利用。

為什么嵌入式系統(tǒng)需要堆棧分析?

當可用堆棧小于代碼需求時,就會發(fā)生堆棧溢出。然而,當為環(huán)境配置的堆棧大于需求時,內存又會被浪費。開發(fā)人員必須持續(xù)一致地估計安全關鍵型應用中最差情形下的堆棧使用量,以防止軟件運行時發(fā)生 RAM 不足的情況。

e8b80808-ec2b-11ee-a297-92fbcf53809c.png

堆棧估計不正確所帶來的風險。

如何估計堆棧分析?

手動估計堆棧

雖然手動估計堆棧分析偶爾會有幫助,但對于更復雜的系統(tǒng)來說可能充滿挑戰(zhàn)。這就需要徹底了解函數調用的深度、所有局部變量的細節(jié),以及執(zhí)行過程中隨時發(fā)生的中斷幀的大小,等等。這是一個漫長而又容易出錯的過程。使用靜態(tài)代碼分析工具可以快速計算出上述結果,而不必手動執(zhí)行這個過程。

使用靜態(tài)代碼分析器

開發(fā)人員可以通過靜態(tài)代碼分析器預測堆棧的使用情況。分析工具有助于分析函數調用深度、局部變量和返回參數的堆棧估計、嵌套中斷以及執(zhí)行期間發(fā)生的中斷幀的大小。使用靜態(tài)代碼分析器的好處在于,它可以處理編碼規(guī)則違規(guī)、運行時缺陷、編碼復雜性以及堆棧分析估計。它在幾分鐘內就能完成這些操作,從而幫助開發(fā)人員節(jié)省了手動計算堆棧使用量的時間。

對目標進行測試和測量

靜態(tài)分析器可以在開發(fā)過程中估計堆棧的使用量。但是,最好在真實硬件上獲得實際的堆棧使用量數據。許多開發(fā)環(huán)境都具有硬件模擬功能,并提供實時堆棧分析功能。在實際硬件上執(zhí)行堆棧分析,并創(chuàng)建溢出場景來測試故障安全例程,這一點非常重要?,F在,最大的問題是:何時使用靜態(tài)分析工具執(zhí)行堆棧分析?何時在實際目標上執(zhí)行?

何時執(zhí)行堆棧分析?

執(zhí)行堆棧分析是軟件開發(fā)生命周期中的一個連續(xù)過程。如果僅在軟件開發(fā)生命周期結束時由單獨的質量評估團隊估計堆棧使用量,則可能會使整個開發(fā)工作面臨風險。此外,在開發(fā)周期的后期解決問題可能會出錯且耗時;在確定是更改硬件還是軟件設計時,這種做法可能還會造成混亂。執(zhí)行堆棧分析的最佳時點是:

在添加新功能時

在軟件中每添加一項新功能,都會使堆棧使用量增加。開發(fā)人員必須密切關注新功能的堆棧使用情況。

執(zhí)行堆棧分析、進行調試和修復復雜代碼:在每個主要功能實現后,開發(fā)人員可以在本地對特定軟件組件或軟件模塊應用靜態(tài)分析器,以評估基礎軟件和已實現軟件之間堆棧使用量的增加情況。

在整個開發(fā)過程中監(jiān)控堆棧分析:QA 團隊和產品負責人可以使用靜態(tài)分析器對持續(xù)集成 (CI) 管道進行堆棧估計,以在控制板上顯示結果。此過程有助于在軟件開發(fā)生命周期中跟蹤堆棧分析。

執(zhí)行良好實踐以確保堆棧使用量最低:質量門有助于避免違反 MISRA 和 AUTOSAR 編碼規(guī)范。這些規(guī)范要求強制有條件地使用動態(tài)內存分配。

在軟件發(fā)布前

靜態(tài)分析器執(zhí)行的堆棧估計提供了有力的證據,表明堆棧使用量處于控制之中。在每次軟件發(fā)布之前,都應在標準工作負載、最小負載和最大負載下,對真實目標運行堆棧分析,以全面了解堆棧的使用情況。驗證堆棧上溢和下溢事件的故障安全例程也至關重要。

Polyspace 對堆棧估計有何作用?

Polyspace Code Prover 對每個函數中局部變量的大小上限和下限執(zhí)行保守和樂觀估計,以得出函數級和程序級的最大和最小堆棧使用量。該分析考慮了函數返回值的大小、函數參數的大小、局部變量的大小,以及內存對齊所需的額外填充。

e8c2975a-ec2b-11ee-a297-92fbcf53809c.png

Polyspace 桌面版上的堆棧分析代碼度量。

要了解和調試堆棧利用過量的問題,開發(fā)人員可以在本地運行 Polyspace,通過檢查函數調用深度來確定堆棧利用過量的確切原因,并通過優(yōu)化利用可用資源來降低堆棧使用量。

e8d1c658-ec2b-11ee-a297-92fbcf53809c.png

函數 table_loop() 的調用樹和更高的堆棧估計。

在整個開發(fā)過程中監(jiān)控堆棧分析

Polyspace Access 是結果數據庫服務器,可以在 Web 瀏覽器上呈現圖形用戶界面。CI 流程可以觸發(fā) Polyspace Server 上的堆棧分析,以生成堆棧使用量估計結果。此結果可以上傳到結果數據庫。QA 團隊和產品負責人可以在圖形化前端持續(xù)查看堆棧使用量,并在可用堆棧資源過度使用的情況下采取必要的措施。

e8d8b3fa-ec2b-11ee-a297-92fbcf53809c.png

Polyspace Access 中的項目級堆棧估計。

下一步是,檢查堆棧使用量較高的函數,并將特定函數分配給開發(fā)人員,以供進一步調查和調試。Polyspace 允許您為分析結果指定狀態(tài)和嚴重性并添加注釋,然后在 Jira 等 Bug 跟蹤工具中將這些結果分配給開發(fā)人員。

e8e3c876-ec2b-11ee-a297-92fbcf53809c.png

Polyspace Access 中的函數級堆棧估計和結果審查控制板。

執(zhí)行良好實踐以確保堆棧使用量最低

對于產品級代碼,必須絕對避免違反編碼標準,如 MISRA C、MISRA C++、AUTOSAR C++ 等。這些編碼標準要求強制禁止動態(tài)內存分配,并推薦特定用例來優(yōu)化靜態(tài)內存分配。

Polyspace Bug Finder 有助于識別任何違反最佳實踐的行為,開發(fā)人員可以在本地監(jiān)控這些行為,而產品負責人可通過 Polyspace Access 監(jiān)控這些行為。以下編碼規(guī)則詳細說明了靜態(tài)內存分配的最佳實踐。靜態(tài)內存分配可以使用 Polyspace Bug Finder 進行分析。

e8f21138-ec2b-11ee-a297-92fbcf53809c.png

隨著代碼的循環(huán)復雜度、嵌套函數調用的數量、函數中變量數目等的增加,堆棧的使用量也在增加。Polyspace 能夠控制影響堆棧使用量的諸多變量,并支持設置代碼復雜度閾值。

e906038c-ec2b-11ee-a297-92fbcf53809c.png

設置代碼復雜度閾值。

Polyspace Bug Finder 提供了許多針對靜態(tài)和動態(tài)內存分配的運行時檢查。解決所有高、中和低優(yōu)先級缺陷有助于降低內存分配帶來的風險。

e90c6b6e-ec2b-11ee-a297-92fbcf53809c.png

運行時靜態(tài)和動態(tài)內存檢查。

無論使用何種方法來計算堆棧使用量,稍微增大堆棧大小都不失為一個好辦法。這種方法有助于避免測試期間可能未檢測到的堆棧溢出導致的系統(tǒng)漏洞。

堆棧溢出漏洞是許多嵌入式應用程序在實際運行中表現出不可定義行為的一個重要原因。在正確的時間使用正確的工具并遵循最佳實踐,可以增強對軟件防止堆棧溢出的信心。



審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 嵌入式系統(tǒng)

    關注

    41

    文章

    3624

    瀏覽量

    129749
  • RAM
    RAM
    +關注

    關注

    8

    文章

    1369

    瀏覽量

    115001
  • AUTOSAR
    +關注

    關注

    10

    文章

    363

    瀏覽量

    21778

原文標題:嵌入式軟件 | 如何在整個開發(fā)過程中持續(xù)監(jiān)控堆棧分析?

文章出處:【微信號:MATLAB,微信公眾號:MATLAB】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    uCOS任務堆棧的深入分析

    在uCOS中,每一個任務都有一個獨立的任務堆棧。為了深入理解任務堆棧的作用,不妨分析任務從“出生”到“消亡”的整個過程,具體就是分析任務的建立,運行,掛起幾種狀態(tài)中任務
    發(fā)表于 11-01 11:52 ?3263次閱讀

    Embedded Studio堆棧溢出預防功能

    為了識別運行的嵌入式系統(tǒng)中的堆棧溢出問題,SEGGER編譯器通過為每個函數生成檢測代碼的方式來檢查堆棧溢出。該功能可以使用命令行開關-mstack-overflow-check來使能。
    發(fā)表于 07-14 11:08 ?652次閱讀

    如何通過IAR進行堆棧使用分析

    前言在嵌入式應用開發(fā)過程中,由于MCU的存儲資源有限,因此堆棧空間大小的設定極為關鍵。堆棧空間設置過大則會造成資源的浪費,堆棧空間設置過小則可能導致
    發(fā)表于 01-03 16:45

    嵌入式處理器環(huán)境中為什么匯編語言不需要堆棧

    嵌入式處理器環(huán)境中,為何C語言(函數調用)需要堆棧,而匯編語言卻不需要堆棧?據我所知,c語言最終也是被編譯成了匯編,都是匯編,為何c語言生
    發(fā)表于 03-20 04:35

    嵌入式學習手冊——堆棧結構與編程

    棧這種結構在嵌入式里其實是非常常用的,比如函數調用與返回就是典型的棧應用,雖然很多時候棧都是 CPU 系統(tǒng)在自動管理,我們只需要在鏈接文件里分配棧大小以及棧存放位置,但稍微了解一下棧的原理會更加利于
    發(fā)表于 04-20 07:00

    嵌入式堆棧原理及其純C的實現方法

    嵌入式堆棧原理及其純C實現  
    發(fā)表于 12-28 06:30

    嵌入式C語言應用工程中堆棧的相關資料分享

    堆棧的定義和作用2. 嵌入式 C 語言應用工程的棧大小確定3. 嵌入式 C 語言應用工程的堆棧溢出定義、危害以及應對措施 概述與案例分析過去
    發(fā)表于 11-04 06:10

    介紹嵌入式軟件堆棧使用情況的估算方法

    介紹了嵌入式軟件堆棧使用情況的估算方法。為了方便理解這種估算方法,還對相應的堆棧操作匯編代碼(ARM Cortex-M處理器)進行分析和說明
    發(fā)表于 12-14 07:25

    KAN316如何確定應用程序的堆棧使用情況

    使用,并通過進程堆棧指針(PSP)進行尋址。 由于堆棧的內存區(qū)域在大小上受到限制,因此在堆棧上分配比可用內存更多的內存可能會導致程序崩潰或堆棧
    發(fā)表于 08-28 07:27

    深入分析uCOS的任務堆棧

    就是分析任務的建立,運行,掛起幾種狀態(tài)中任務堆棧的變化情況。 現在假設系統(tǒng)運行著一個由用戶創(chuàng)建的用以完成打印工作的任務TPrint。TPrint最初通過OSTaskCreate()函數創(chuàng)建,在該函數中與任務
    發(fā)表于 12-01 01:25 ?693次閱讀

    深入分析MCU堆棧的作用 以及該如何設置堆棧大小

    深入分析MCU堆棧的作用,以及該如何設置堆棧大小
    的頭像 發(fā)表于 03-01 14:13 ?5190次閱讀
    深入<b class='flag-5'>分析</b>MCU<b class='flag-5'>堆棧</b>的作用 以及該如何設置<b class='flag-5'>堆棧</b>大小

    高性能嵌入式堆棧Azure PTOS USBX概述

    Azure RTOS USBX 是一種高性能的 USB 主機、設備和移動 (OTG) 嵌入式堆棧。 Azure RTOS USBX 與 Azure RTOS ThreadX 完全集成,適用于所有支持
    發(fā)表于 05-24 10:55 ?10次下載

    TCP/IP 堆棧漏洞是嵌入式軟件的警鐘

    URGENT/11和其他最近的漏洞(例如與嵌入式 TCP/IP 堆棧相關的AMNESIA:33)表明在審查和審計軟件供應鏈方面存在缺陷。責任不僅僅在于軟件供應商,還指出嵌入式設備制造商需要
    的頭像 發(fā)表于 07-15 15:43 ?1324次閱讀
    TCP/IP <b class='flag-5'>堆棧</b>漏洞是<b class='flag-5'>嵌入式</b>軟件的警鐘

    Embedded Studio堆棧溢出預防簡析

    為了識別運行的嵌入式系統(tǒng)中的堆棧溢出問題,SEGGER編譯器通過為每個函數生成檢測代碼的方式來檢查堆棧溢出。
    的頭像 發(fā)表于 07-14 11:07 ?989次閱讀

    嵌入式系統(tǒng)堆棧監(jiān)控的作用

    在微控制器或微處理器中,堆棧是內存的一個保留區(qū)域,用于存儲臨時數據和函數調用信息,管理函數的執(zhí)行,跟蹤返回地址、局部變量和函數參數。堆棧監(jiān)控嵌入式
    的頭像 發(fā)表于 01-05 11:13 ?553次閱讀
    澳门百家乐论| 中信娱乐城| 百家乐娱乐城足球盘网| 百家乐官网有无规律可循| 大发888娱乐老虎机| 百家乐开户优惠多的平台是哪家 | 欧洲百家乐的玩法技巧和规则| 大发888 护栏| 百家乐娱乐人物| 百家乐官网最低压多少| 百家乐官网北京| 威尼斯人娱乐城免费注册| 百家乐官网微笑心法搜索| 免水百家乐的玩法技巧和规则| 奔驰百家乐官网游戏电玩| 大发888游戏平台hplsj| 百家乐官网赌场娱乐网规则| 通化大嘴棋牌官方下载| 百家乐有作弊的吗| 东方夏威夷网站| 圣安娜百家乐代理| 豪博百家乐官网现金网| 好运来百家乐的玩法技巧和规则 | 真钱赌博| 百家乐787| 百家乐官网游戏客户端| 菲律宾凤凰娱乐| 百家乐娱乐城玩法| 一起pk棋牌游戏下载| 属鸡与属羊做生意| 百家乐官网最新投注法| 澳门百家乐怎么玩| 希尔顿百家乐官网试玩| 足球平台开户| 网上百家乐做假| 怎样看百家乐官网路单| 大发888官网首页| 免费百家乐官网奥| 注册娱乐城送体验金| 网上百家乐导航| 澳门百家乐官网骗人|