1. gzyueqian
      13352868059

      嵌入式開發中內存管理的7個技巧

      更新時間: 2022-07-12 09:57:53來源: 粵嵌教育瀏覽量:8713

        在實時系統中管理內存是一項挑戰。有許多方面需要考慮,例如代碼空間內存管理、RAM內存管理、內存優化以及它們如何影響性能等等。下面是七個通用的技巧,可以幫助嵌入式開發人員開始管理他們的內存。

        技巧1–避免malloc

        在需要確定性計時的實時系統中,使用malloc動態分配內存是一個壞主意。首先,典型的malloc實現是不確定的,這意味著即使能夠分配內存,也不能保證分配內存需要多長時間。使用malloc會產生許多實時問題,例如

        堆碎片

        分配內存失敗

        不確定的行為

        不要試探命運,避開malloc就好。

        技巧2–僅將內存字節池用于任務堆棧分配

        RTOS通常包含許多供開發人員分配內存的機制。選項通常是字節和塊內存池。字節內存池的行為與堆非常相似,并像malloc一樣分配內存。有一些實現是確定性的,但是仍然存在堆碎片的潛在問題。出于這些原因,強烈建議開發人員在應用程序開始時只使用字節池來分配內存,例如緩沖區或任務堆棧。

        技巧3–使用內存塊池進行動態內存分配

        有時候,嵌入式開發人員無法擺脫靜態分配所有內存的問題。應用程序可能無法提前知道需要多少內存,或者預先分配所有內存可能需要比微控制器上可用內存更多的RAM。不想使用內存分配或字節池的話,開發人員應該怎么做呢?答案是使用塊內存池。塊內存池在固定的內存塊中分配內存,不像字節內存池一次分配一個字節。塊內存池的算法是確定性的和快速的!因此,如果你需要動態分配內存,請使用塊內存池。(大多數實時操作系統都有)。

        技巧4–靜態分配內存

        靜態分配內存意味著所有的內存分配都是在編譯時而不是運行時執行的。這是確保確定性的最安全的方法,并且不會有內存碎片問題。當開發人員不能在編譯時分配內存時,一些動態分配任務控制塊的RTOS就是這種情況,嘗試在系統初始化期間執行所有的動態內存分配。在啟動時分配內存看起來像是靜態分配的。

        

        技巧5–盡量減少RTOS對象的使用

        通過RTOS創建的每個對象,比如任務、信號量、消息隊列等等,都有一個與之相關聯的控制塊。控制塊本質上是一種結構,它保存了對象執行其功能所必需的各種參數。在資源受限的環境中工作的嵌入式開發人員會希望盡量減少他們在應用程序中使用的對象數量。如果開發人員不密切監控RTOS對象的代碼,它們會很快開始使用大量的RAM。

        技巧6–更改編譯器的默認優化設置

        在運行時處理內存并不是開發人員會遇到的唯一內存管理問題。有時,開發人員需要嘗試優化RAM和ROM,以便最大限度地降低他們使用的微控制器的BOM成本。在許多情況下,編譯器(如GCC)默認不包含最佳優化設置,代碼通常臃腫而緩慢。不要依賴默認的編譯器設置。查看編譯器手冊,了解可用于調整RAM和ROM大小的優化和設置。

        技巧7–監控內存映射文件

        跟蹤ROM和RAM去向的一個好方法是查看編譯器生成的內存映射文件。這個文件將告訴開發人員函數的代碼大小,以及為它們的變量分配了多少內存。不同工具的地圖文件通常略有不同,因此需要開發人員打開文件并手動瀏覽它們,以確定它們的內存使用情況。開發人員可以編寫一個Python腳本來讀取文件,并提供機制來查看哪里的優化和代碼返工是最有效的。

        結論

        實時嵌入式軟件開發人員經常為管理他們的系統內存而苦惱。由于沒有跟蹤內存的去向,它們可能會很快耗盡代碼空間,或者出現與堆碎片相關的運行時問題。我們在本文中研究的技巧看起來很簡單,但是通過遵循它們,嵌入式開發人員不僅可以更好地管理他們的內存占用,還可以省去調試一個瀕臨內存災難的系統的麻煩。

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 最新国产人成视频 | 亚洲论片在线观看 | 在线观看亚洲一级影视 | 亚洲激情在线不卡 | 中文有码国产精品欧美 | 亚洲国产日韩在线 |