精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式開發(fā)是否應(yīng)該使用動(dòng)態(tài)內(nèi)存分配

劉偉 ? 來(lái)源:felixbury ? 作者:felixbury ? 2022-07-15 14:16 ? 次閱讀

我遇到的許多嵌入式軟件開發(fā)人員提出的一個(gè)我覺得特別有趣的話題是動(dòng)態(tài)內(nèi)存分配——在需要時(shí)獲取內(nèi)存塊。這種看似簡(jiǎn)單和常規(guī)的操作會(huì)帶來(lái)大量問(wèn)題。這些并不局限于嵌入式開發(fā)——許多桌面應(yīng)用程序都會(huì)出現(xiàn)內(nèi)存泄漏,這會(huì)影響性能,并且會(huì)使系統(tǒng)重新啟動(dòng)很常見。但是,我擔(dān)心嵌入式開發(fā)環(huán)境。

poYBAGLPACmALFTBAAC-mYoMJZ0343.png

poYBAGLPACmALFTBAAC-mYoMJZ0343.png

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

  • 該函數(shù)通常不可重入(線程友好),因此將其與實(shí)時(shí)操作系統(tǒng)一起使用可能具有挑戰(zhàn)性。
  • 它的性能不是確定性的(可預(yù)測(cè)的),因此分配一個(gè)內(nèi)存塊所花費(fèi)的時(shí)間可能是非常可變的,這在實(shí)時(shí)應(yīng)用程序中是一個(gè)挑戰(zhàn)。
  • 內(nèi)存分配可能會(huì)失敗。

盡管這些都是有效的觀點(diǎn),但它們可能并不像看起來(lái)那么重要。

僅當(dāng)從多個(gè)線程調(diào)用函數(shù)時(shí),重入才是一個(gè)問(wèn)題。編寫一個(gè)可重入的malloc()函數(shù)是非常可行的,但也可以使用標(biāo)準(zhǔn)版本以使重入變得不必要。只需將所有內(nèi)存分配活動(dòng)本地化為單個(gè)任務(wù)。您甚至可以創(chuàng)建一個(gè)唯一功能是動(dòng)態(tài)內(nèi)存分配的任務(wù);其他任務(wù)將簡(jiǎn)單地發(fā)送一條消息,請(qǐng)求分配或釋放內(nèi)存塊。

并不總是需要確定性。并非應(yīng)用程序是實(shí)時(shí)的,并且那些不一定需要對(duì)其操作的所有部分確定性的應(yīng)用程序。

分配失敗可能是個(gè)問(wèn)題,但可以管理。如果malloc()函數(shù)無(wú)法分配所請(qǐng)求的內(nèi)存,則它會(huì)返回一個(gè)空指針。必須檢查此響應(yīng)并采取適當(dāng)?shù)拇胧?/font>如果失敗是由于內(nèi)存耗盡,很可能是設(shè)計(jì)缺陷——沒有為堆分配足夠的內(nèi)存。然而,分配失敗的一個(gè)常見原因是堆碎片。有足夠的可用內(nèi)存,但它不在連續(xù)區(qū)域中。這種碎片的出現(xiàn)是因?yàn)閮?nèi)存以隨機(jī)方式分配和釋放,從而導(dǎo)致內(nèi)存的分配和空閑區(qū)域。有兩種方法可以消除碎片:

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

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

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

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

不管它的不可預(yù)測(cè)性如何, malloc()還有另一個(gè)問(wèn)題——它往往相當(dāng)慢。這并不奇怪,因?yàn)樵摵瘮?shù)的功能非常復(fù)雜。基于塊的分配器的內(nèi)在簡(jiǎn)單性非常有效地解決了這個(gè)問(wèn)題。

但是,如果應(yīng)用程序在不可預(yù)測(cè)的時(shí)間確實(shí)需要隨機(jī)大小的內(nèi)存塊怎么辦?

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

poYBAGLPAC6AW3BSAARZ-8D01G4506.png

poYBAGLPAC6AW3BSAARZ-8D01G4506.png

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

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5068

    文章

    19015

    瀏覽量

    303234
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3242

    瀏覽量

    57600
  • 內(nèi)存分配
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    8295
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言知識(shí)總結(jié):動(dòng)態(tài)內(nèi)存分配

    動(dòng)態(tài)內(nèi)存分配就 是指在程序執(zhí)行的過(guò)程中動(dòng)態(tài)分配或者回收存儲(chǔ)空間的分配內(nèi)存的方法。
    發(fā)表于 10-24 15:52 ?839次閱讀

    C語(yǔ)言程序設(shè)計(jì)中動(dòng)態(tài)內(nèi)存分配如何實(shí)現(xiàn)

    C語(yǔ)言程序設(shè)計(jì)中,動(dòng)態(tài)內(nèi)存分配如何實(shí)現(xiàn),需要注意哪些問(wèn)題?
    發(fā)表于 09-28 16:53 ?1282次閱讀

    動(dòng)態(tài)內(nèi)存管理的原理詳解

    錯(cuò)誤。而相比于個(gè)人計(jì)算機(jī),嵌入式系統(tǒng)的內(nèi)存資源更是稀缺。作為嵌入式C的開發(fā)人員,了解其內(nèi)存管理的原理能使其更加正確地使用
    發(fā)表于 11-02 09:25

    內(nèi)存動(dòng)態(tài)內(nèi)存分配實(shí)現(xiàn)

    第27章 STM32H7的TCM,SRAM等五塊內(nèi)存動(dòng)態(tài)內(nèi)存分配實(shí)現(xiàn)本章教程為大家分享一種DTCM,SRAM1,SRAM2,SRAM3和SRAM4可以獨(dú)立管理的動(dòng)態(tài)內(nèi)存管理方案,在實(shí)
    發(fā)表于 08-03 07:14

    嵌入式C語(yǔ)言動(dòng)態(tài)內(nèi)存分配

    動(dòng)態(tài)內(nèi)存分配:1、malloc、memset、free在日常寫代碼時(shí)需要注意以下幾點(diǎn):malloc分配內(nèi)存時(shí),需要 if語(yǔ)句 判斷malloc是否
    發(fā)表于 12-14 06:37

    請(qǐng)問(wèn)使用動(dòng)態(tài)內(nèi)存分配安全嗎?

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

    使用動(dòng)態(tài)內(nèi)存分配安全嗎

    安全嗎?”為了更加安全穩(wěn)定,美國(guó)軍方禁止在C語(yǔ)言程序中使用malloc()使用動(dòng)態(tài)內(nèi)存分配安全嗎?在C語(yǔ)言程序開發(fā)中,動(dòng)態(tài)內(nèi)存分配允許程序在
    發(fā)表于 12-15 07:44

    動(dòng)態(tài)內(nèi)存分配是什么意思

    所謂動(dòng)態(tài)內(nèi)存分配(Dynamic Memory Allocation)就是指在程序執(zhí)行的過(guò)程中動(dòng)態(tài)分配或者回收存儲(chǔ)空間的分配
    發(fā)表于 12-17 08:17

    一種新的嵌入式實(shí)時(shí)動(dòng)態(tài)內(nèi)存管理結(jié)構(gòu)

             內(nèi)存資源是嵌入式操作系統(tǒng)中需要管理的重要資源之一。這種O(1)時(shí)間復(fù)雜度的嵌入式實(shí)時(shí)動(dòng)態(tài)內(nèi)存
    發(fā)表于 09-10 10:20 ?16次下載

    基于Core的動(dòng)態(tài)內(nèi)存分配方案

    為了解決基于C*Core系列芯片嵌入式開發(fā)過(guò)程中,C*Core系統(tǒng)在某些情況下由于受操作系統(tǒng)、數(shù)據(jù)格式差異等因素影響,不能動(dòng)態(tài)分配C*Core系列芯片內(nèi)存的問(wèn)題,采用數(shù)組與標(biāo)志位相結(jié)合的
    發(fā)表于 07-11 10:37 ?38次下載
    基于Core的<b class='flag-5'>動(dòng)態(tài)內(nèi)存</b><b class='flag-5'>分配</b>方案

    嵌入式開發(fā)

    嵌入式開發(fā)就是指在嵌入式操作系統(tǒng)下進(jìn)行開發(fā)嵌入式Linux是以Linux為基礎(chǔ)的嵌入式作業(yè)系統(tǒng)。這里提供了
    發(fā)表于 12-20 13:21
    <b class='flag-5'>嵌入式開發(fā)</b>

    基于μCOS-II的TLSF動(dòng)態(tài)內(nèi)存分配算法的應(yīng)用與仿真

    嵌入式實(shí)時(shí)系統(tǒng)為背景,深入研究了TLSF動(dòng)態(tài)內(nèi)存分配算法原理及實(shí)現(xiàn)過(guò)程,并將TLSF移植到COS-II中,進(jìn)行了基于x86平臺(tái)的仿真測(cè)試,取得了很好的效果,為以后學(xué)習(xí)和應(yīng)用TLSF算法提供
    發(fā)表于 09-25 10:42 ?44次下載

    嵌入式中需要用到動(dòng)態(tài)內(nèi)存

    所謂動(dòng)態(tài)內(nèi)存分配(Dynamic Memory Allocation)就是指在程序執(zhí)行的過(guò)程中動(dòng)態(tài)分配或者回收存儲(chǔ)空間的分配
    的頭像 發(fā)表于 07-27 08:11 ?3039次閱讀

    嵌入式C語(yǔ)言中的動(dòng)態(tài)內(nèi)存管理和動(dòng)態(tài)內(nèi)存分配

    動(dòng)態(tài)內(nèi)存管理同時(shí)還具有一個(gè)優(yōu)點(diǎn):當(dāng)程序在具有更多內(nèi)存的系統(tǒng)上需要處理更多數(shù)據(jù)時(shí),不需要重寫程序。
    發(fā)表于 08-15 17:16 ?2259次閱讀

    嵌入式是否使用動(dòng)態(tài)內(nèi)存?

    嵌入式是否應(yīng)該使用動(dòng)態(tài)內(nèi)存?
    的頭像 發(fā)表于 02-28 17:03 ?1731次閱讀