女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

嵌入式開發是否應該使用動態內存分配

劉偉 ? 來源:felixbury ? 作者:felixbury ? 2022-07-15 14:16 ? 次閱讀

我遇到的許多嵌入式軟件開發人員提出的一個我覺得特別有趣的話題是動態內存分配——在需要時獲取內存塊。這種看似簡單和常規的操作會帶來大量問題。這些并不局限于嵌入式開發——許多桌面應用程序都會出現內存泄漏,這會影響性能,并且會使系統重新啟動很常見。但是,我擔心嵌入式開發環境。

poYBAGLPACmALFTBAAC-mYoMJZ0343.png

poYBAGLPACmALFTBAAC-mYoMJZ0343.png

通常不建議將malloc()用于嵌入式應用程序的原因有很多:

  • 該函數通常不可重入(線程友好),因此將其與實時操作系統一起使用可能具有挑戰性。
  • 它的性能不是確定性的(可預測的),因此分配一個內存塊所花費的時間可能是非常可變的,這在實時應用程序中是一個挑戰。
  • 內存分配可能會失敗。

盡管這些都是有效的觀點,但它們可能并不像看起來那么重要。

僅當從多個線程調用函數時,重入才是一個問題。編寫一個可重入的malloc()函數是非常可行的,但也可以使用標準版本以使重入變得不必要。只需將所有內存分配活動本地化為單個任務。您甚至可以創建一個唯一功能是動態內存分配的任務;其他任務將簡單地發送一條消息,請求分配或釋放內存塊。

并不總是需要確定性。并非應用程序是實時的,并且那些不一定需要對其操作的所有部分確定性的應用程序。

分配失敗可能是個問題,但可以管理。如果malloc()函數無法分配所請求的內存,則它會返回一個空指針。必須檢查此響應并采取適當的措施。如果失敗是由于內存耗盡,很可能是設計缺陷——沒有為堆分配足夠的內存。然而,分配失敗的一個常見原因是堆碎片。有足夠的可用內存,但它不在連續區域中。這種碎片的出現是因為內存以隨機方式分配和釋放,從而導致內存的分配和空閑區域。有兩種方法可以消除碎片:

首先,如果應用程序允許,只需確保使用遵循這種模式的代碼按順序完成分配和釋放:

a = malloc(1000);
b = malloc(100);
c = malloc(5000);
...
免費(c);
免費(乙);
免費(一);

當然,這通常是不可能的。因此,需要另一種選擇。

事實證明,許多應用程序并不需要malloc()提供的所有靈活性。所需的內存塊具有固定大小(或少量不同大小)。為固定大小的塊編寫內存分配器非常簡單;這消除了碎片化,如果需要,可以很容易地確定性。毫不奇怪,大多數 RTOS 都有以這種方式分配內存塊的服務調用。

不管它的不可預測性如何, malloc()還有另一個問題——它往往相當慢。這并不奇怪,因為該函數的功能非常復雜。基于塊的分配器的內在簡單性非常有效地解決了這個問題。

但是,如果應用程序在不可預測的時間確實需要隨機大小的內存塊怎么辦?

實現這種靈活性同時避免碎片和不確定性的一種方法是構建一個分配器,根據請求的內存塊大小從多個“池”中選擇塊。為池選擇塊大小的一個好方法(如果您事先不知道需要的塊大小)是使用幾何系列,如 16、32、64、128 字節。然后分配將像這樣工作:

poYBAGLPAC6AW3BSAARZ-8D01G4506.png

poYBAGLPAC6AW3BSAARZ-8D01G4506.png

顯然,一些分配會非常有效:16 字節池中的 16 字節。有些會非常好;來自 32 字節池的 31 個字節。其他人會沒事的;來自 16 字節池的 9 個字節。還有一些效率低下;來自 128 字節池的 65 個字節。總體而言,這些低效率是為速度、確定性和消除碎片化的好處付出的小代價。

審核編輯:湯梓紅

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

    關注

    5138

    文章

    19524

    瀏覽量

    314691
  • 應用程序
    +關注

    關注

    38

    文章

    3322

    瀏覽量

    58698
  • 內存分配
    +關注

    關注

    0

    文章

    17

    瀏覽量

    8405
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    C語言知識總結:動態內存分配

    動態內存分配就 是指在程序執行的過程中動態分配或者回收存儲空間的分配內存的方法。
    發表于 10-24 15:52 ?1001次閱讀

    C語言程序設計中動態內存分配如何實現

    C語言程序設計中,動態內存分配如何實現,需要注意哪些問題?
    發表于 09-28 16:53 ?1665次閱讀

    動態內存管理的原理詳解

    錯誤。而相比于個人計算機,嵌入式系統的內存資源更是稀缺。作為嵌入式C的開發人員,了解其內存管理的原理能使其更加正確地使用
    發表于 11-02 09:25

    內存動態內存分配實現

    第27章 STM32H7的TCM,SRAM等五塊內存動態內存分配實現本章教程為大家分享一種DTCM,SRAM1,SRAM2,SRAM3和SRAM4可以獨立管理的動態內存管理方案,在實
    發表于 08-03 07:14

    嵌入式C語言動態內存分配

    動態內存分配:1、malloc、memset、free在日常寫代碼時需要注意以下幾點:malloc分配內存時,需要 if語句 判斷malloc是否
    發表于 12-14 06:37

    請問使用動態內存分配安全嗎?

    在使用完畢后,需要顯的釋放之,這就要求程序員對動態分配內存了然于胸。在非常重視安全(safety-critical)的嵌入式C語言程序開發
    發表于 12-15 06:10

    使用動態內存分配安全嗎

    安全嗎?”為了更加安全穩定,美國軍方禁止在C語言程序中使用malloc()使用動態內存分配安全嗎?在C語言程序開發中,動態內存分配允許程序在
    發表于 12-15 07:44

    動態內存分配是什么意思

    所謂動態內存分配(Dynamic Memory Allocation)就是指在程序執行的過程中動態分配或者回收存儲空間的分配
    發表于 12-17 08:17

    一種新的嵌入式實時動態內存管理結構

             內存資源是嵌入式操作系統中需要管理的重要資源之一。這種O(1)時間復雜度的嵌入式實時動態內存
    發表于 09-10 10:20 ?16次下載

    基于Core的動態內存分配方案

    為了解決基于C*Core系列芯片嵌入式開發過程中,C*Core系統在某些情況下由于受操作系統、數據格式差異等因素影響,不能動態分配C*Core系列芯片內存的問題,采用數組與標志位相結合的
    發表于 07-11 10:37 ?38次下載
    基于Core的<b class='flag-5'>動態內存</b><b class='flag-5'>分配</b>方案

    嵌入式開發

    嵌入式開發就是指在嵌入式操作系統下進行開發嵌入式Linux是以Linux為基礎的嵌入式作業系統。這里提供了
    發表于 12-20 13:21
    <b class='flag-5'>嵌入式開發</b>

    基于μCOS-II的TLSF動態內存分配算法的應用與仿真

    嵌入式實時系統為背景,深入研究了TLSF動態內存分配算法原理及實現過程,并將TLSF移植到COS-II中,進行了基于x86平臺的仿真測試,取得了很好的效果,為以后學習和應用TLSF算法提供
    發表于 09-25 10:42 ?44次下載

    嵌入式中需要用到動態內存

    所謂動態內存分配(Dynamic Memory Allocation)就是指在程序執行的過程中動態分配或者回收存儲空間的分配
    的頭像 發表于 07-27 08:11 ?3218次閱讀

    嵌入式C語言中的動態內存管理和動態內存分配

    動態內存管理同時還具有一個優點:當程序在具有更多內存的系統上需要處理更多數據時,不需要重寫程序。
    發表于 08-15 17:16 ?2465次閱讀

    嵌入式是否使用動態內存?

    嵌入式是否應該使用動態內存?
    的頭像 發表于 02-28 17:03 ?1959次閱讀