在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

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

lPCU_elecfans ? 來源:陳翠 ? 2019-07-27 08:11 ? 次閱讀

所謂動態(tài)內(nèi)存分配(Dynamic Memory Allocation)就是指在程序執(zhí)行的過程中動態(tài)地分配或者回收存儲空間的分配內(nèi)存的方法。動態(tài)內(nèi)存分配不像數(shù)組等靜態(tài)內(nèi)存分配方法那樣需要預(yù)先分配存儲空間,而是由系統(tǒng)根據(jù)程序的需要即時分配,且分配的大小就是程序要求的大小。

關(guān)于靜態(tài)內(nèi)存與動態(tài)內(nèi)存

1.1、靜態(tài)和動態(tài)內(nèi)存的特點在探討這個問題之前我們先來對比下靜態(tài)內(nèi)存和動態(tài)內(nèi)存的特點:1. 創(chuàng)建的時間不同:創(chuàng)建的時間不同:靜態(tài)分配發(fā)生在程序編譯和連接的時候。動態(tài)分配則發(fā)生在程序調(diào)入和執(zhí)行的時候。

編譯鏈接過程中已經(jīng)分配好的

代碼運行過程中使用rt_malloc分配:

1staticvoidonmessage_text(rws_socketsocket,constchar*text,constunsignedintlen) 2{ 3char*buff=RT_NULL; 4 5buff=(char*)rt_malloc(2048); 6 7rt_memset(buff,0x00,2048); 8rt_memcpy(buff,text,len); 910LOG_D("message(txt),%d(byte):%s",len,buff);1112if(buff!=RT_NULL)13{14rt_free(buff);15}16}

2. 創(chuàng)建的空間不同:堆都是動態(tài)分配的,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動態(tài)分配由函數(shù)malloc進(jìn)行分配。不過棧的動態(tài)分配和堆不同,他的動態(tài)分配是由編譯器進(jìn)行釋放,無需我們手工實現(xiàn)。

1.2、靜態(tài)和動態(tài)內(nèi)存的優(yōu)缺點

在了解了靜態(tài)內(nèi)存和動態(tài)內(nèi)存不同的特點后可以分析出它們在不同的方面具有不同的優(yōu)缺點:1.靜態(tài)內(nèi)存編譯階段就分配好了,不會存在分配失敗的情況,除非系統(tǒng)內(nèi)存被分配完了,但是在編譯階段就可以查出。動態(tài)內(nèi)存在運行中分配,在正常運行的情況下可能夠正常分配,在某種環(huán)境下可能分配失敗 ,這樣就對開發(fā)者的代碼水平要求更高,要求開發(fā)者需要對代碼的健壯性有要求。

2.靜態(tài)內(nèi)存由于是編譯階段分配好的,而動態(tài)內(nèi)存是由運行中分配,這樣動態(tài)內(nèi)存可以被高效復(fù)用,當(dāng)某段程序使用完畢后,可以將內(nèi)存交換給內(nèi)存池中等待下次程序的分配,由于這種機制,開發(fā)者可以利用更小的內(nèi)存開發(fā)更大型的程序。

3. 動態(tài)內(nèi)存由于是動態(tài)分配,所以涉及到分配和釋放的問題,假設(shè)X程序在分配了ABC3塊內(nèi)存,程序執(zhí)行完畢后AC區(qū)域內(nèi)存被釋放,但是由于開發(fā)者的疏忽導(dǎo)致B區(qū)域的內(nèi)存被遺留。而X程序又是會被反復(fù)調(diào)用的,這樣我們的內(nèi)存區(qū)域由于有沒有釋放的區(qū)域?qū)е旅看握{(diào)用就會占用一段區(qū)域,最終系統(tǒng)就沒有內(nèi)存可以使用。這種情況一般在產(chǎn)品實際體現(xiàn)為最開始的時候設(shè)備正常工作,但是運行了幾個小時或者幾天后死機。這種情況一般被稱作內(nèi)存泄漏(Memory Leak)。4. 在嵌入式RTOS中線程函數(shù)中使用靜態(tài)內(nèi)存,也就是在線程中定義局部變量,會加大線程棧空間的開銷。

裸機開發(fā)和RTOS開發(fā)的特點

1. 代碼規(guī)模:裸機開發(fā)的項目一般代碼規(guī)模度都比較小,對于一般開發(fā)者都難于駕馭使用裸機開發(fā)超大規(guī)模項目,人力成本和時間成本都太高。反而由于RTOS的模塊化特性,更容易開發(fā)出代碼規(guī)模大的項目。2. 系統(tǒng)穩(wěn)定性:在機電,航空,汽車等行業(yè)都是需要高實時性、高穩(wěn)定性和高安全性的。對于RTOS來說,系統(tǒng)任務(wù)的劃分調(diào)度都是系統(tǒng)管理,當(dāng)開發(fā)者對其機制了解不清楚的情況下反而帶來了部分風(fēng)險。除此之外RTOS上的內(nèi)存管理也是很大影響系統(tǒng)的,對于RTOS上一般不會存在MMU內(nèi)存管理單元,也就代表大部分運行RTOS的芯片上都沒有虛擬地址映射,那么就無法利用物理地址和虛擬地址的特性進(jìn)行內(nèi)存整理,避免內(nèi)存泄漏。所以說在RTOS動態(tài)內(nèi)存這塊內(nèi)存有風(fēng)險。

嵌入式中是否應(yīng)該使用動態(tài)內(nèi)存

明白不同內(nèi)存的優(yōu)缺點和裸機RTOS的特點之后,我們在回頭來分析 “嵌入式中是否應(yīng)該使用動態(tài)內(nèi)存?” 這個問題。在實時嵌入式系統(tǒng)中,由于系統(tǒng)軟件并不像PC上復(fù)雜,一般都是很簡單的內(nèi)存使用,所以一般也不使用動態(tài)內(nèi)存管理,但是隨著RTOS面臨的任務(wù)越來越重,尤其是IoTAIoT的到來,讓許多消費級產(chǎn)品運行的RTOS的負(fù)擔(dān)越來越重。在這種情況下繼續(xù)使用靜態(tài)內(nèi)存開發(fā)會極大的限制開發(fā)進(jìn)度,整個開發(fā)的靈活性非常低。同時靜態(tài)的內(nèi)存無法復(fù)用使用同一片內(nèi)存區(qū)域,相比與動態(tài)內(nèi)存在大型項目中一般會使用更多的內(nèi)存,在內(nèi)存大小不容樂觀的嵌入式系統(tǒng)是很難接受的。但是針對一些高穩(wěn)定性和高安全性的項目來說,使用動態(tài)內(nèi)存就需要好好斟酌下,由于RTOS上基本沒有MMU的硬件支持或者是系統(tǒng)軟件支持,所以不可避免的系統(tǒng)中會出現(xiàn)內(nèi)存碎片,從而有可能導(dǎo)致系統(tǒng)異常。最終說了這么多總結(jié)成以下幾點:1. 沒有使用RTOS的項目:不建議使用動態(tài)內(nèi)存,這種項目一般很簡單,不必使用動態(tài)內(nèi)存增大系統(tǒng)開銷和復(fù)雜度。2. 使用RTOS的消費級項目:建議使用動態(tài)內(nèi)存,一般這種項目代碼復(fù)雜度比裸機高,合理使用動態(tài)內(nèi)存會有效降低內(nèi)存的開銷。同時很多Github項目的linux程序都是會使用內(nèi)存管理,有這套機制能更加方便的移植代碼。3. 使用RTOS的軍工、航天、醫(yī)療等高穩(wěn)定性和高安全性項目:建議盡量降低對動態(tài)內(nèi)存的使用與依賴以確保系統(tǒng)的穩(wěn)定性。當(dāng)然也不代表動態(tài)內(nèi)存就無法在這些項目上使用,只是要求系統(tǒng)開發(fā)者對系統(tǒng)內(nèi)存的把控要求更高。

RT-Thread的內(nèi)存管理

RT-Thread 操作系統(tǒng)在內(nèi)存管理上,根據(jù)上層應(yīng)用及系統(tǒng)資源的不同,有針對性地提供了不同的內(nèi)存分配管理算法。總體上可分為兩類:內(nèi)存堆管理與內(nèi)存池管理,而內(nèi)存堆管理又根據(jù)具體內(nèi)存設(shè)備劃分為三種情況:

第一種是針對小內(nèi)存塊的分配管理(小內(nèi)存管理算法);第二種是針對大內(nèi)存塊的分配管理(slab 管理算法);第三種是針對多內(nèi)存堆的分配情況(memheap 管理算法)。

小內(nèi)存管理算法是一個簡單的內(nèi)存分配算法。初始時,它是一塊大的內(nèi)存。當(dāng)需要分配內(nèi)存塊時,將從這個大的內(nèi)存塊上分割出相匹配的內(nèi)存塊,然后把分割出來的空閑內(nèi)存塊還回給堆管理系統(tǒng)中。每個內(nèi)存塊都包含一個管理用的數(shù)據(jù)頭,通過這個頭把使用塊與空閑塊用雙向鏈表的方式鏈接起來。RT-Thread 的 slab 分配器是在 DragonFly BSD 創(chuàng)始人 Matthew Dillon 實現(xiàn)的 slab 分配器基礎(chǔ)上,針對嵌入式系統(tǒng)優(yōu)化的內(nèi)存分配算法。最原始的 slab 算法是 Jeff Bonwick 為 Solaris 操作系統(tǒng)而引入的一種高效內(nèi)核內(nèi)存分配算法。memheap 管理算法適用于系統(tǒng)含有多個地址可不連續(xù)的內(nèi)存堆。使用 memheap 內(nèi)存管理可以簡化系統(tǒng)存在多個內(nèi)存堆時的使用:當(dāng)系統(tǒng)中存在多個內(nèi)存堆的時候,用戶只需要在系統(tǒng)初始化時將多個所需的 memheap 初始化,并開啟 memheap 功能就可以很方便地把多個 memheap(地址可不連續(xù))粘合起來用于系統(tǒng)的 heap 分配。

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

    關(guān)注

    5120

    文章

    19409

    瀏覽量

    312384
  • 動態(tài)內(nèi)存
    +關(guān)注

    關(guān)注

    1

    文章

    25

    瀏覽量

    8072

原文標(biāo)題:嵌入式中是否應(yīng)該使用動態(tài)內(nèi)存?

文章出處:【微信號:elecfans,微信公眾號:電子發(fā)燒友網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    DMA開辟緩存,怎么使用動態(tài)內(nèi)存

    開辟20kb左右的緩存空間,如果直接用全局變量數(shù)組,在不需要用到DMA時,那這20k的內(nèi)存就一直不能釋放,好浪費。若使用malloc來開辟動態(tài)內(nèi)存,應(yīng)該是放在堆區(qū)吧?堆區(qū)不是默認(rèn)只有512字節(jié)?還要修改啟動文件的堆大小?
    發(fā)表于 04-20 14:30

    嵌入式開發(fā)需要用到電路圖設(shè)計軟件嗎

    請教:做嵌入式開發(fā)需要用到電路圖設(shè)計軟件嗎?如果需要,哪個軟件最常用?
    發(fā)表于 07-14 08:00

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

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

    嵌入式C語言動態(tài)內(nèi)存分配

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

    請問使用動態(tài)內(nèi)存分配安全嗎?

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

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

    安全嗎?”為了更加安全穩(wěn)定,美國軍方禁止在C語言程序中使用malloc()使用動態(tài)內(nèi)存分配安全嗎?在C語言程序開發(fā)動態(tài)內(nèi)存分配允許程序在運行時向系統(tǒng)申請內(nèi)存使用,只不過在使用完畢后
    發(fā)表于 12-15 07:44

    DMA開辟緩存怎么使用動態(tài)內(nèi)存

    開辟20kb左右的緩存空間,如果直接用全局變量數(shù)組,在不需要用到DMA時,那這20k的內(nèi)存就一直不能釋放,好浪費。若使用malloc來開辟動態(tài)內(nèi)存,應(yīng)該是放在堆區(qū)吧?堆區(qū)不是默認(rèn)只有512字節(jié)?還要修改啟動文件的堆大小?
    發(fā)表于 10-23 06:53

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

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

    動態(tài)內(nèi)存錯誤的靜態(tài)檢測

    內(nèi)存泄漏、空指針引用等動態(tài)內(nèi)存錯誤在/,/LL等支持動態(tài)內(nèi)存操作的程序普遍存在在程序動態(tài)內(nèi)存
    發(fā)表于 06-10 16:29 ?52次下載
    <b class='flag-5'>動態(tài)內(nèi)存</b>錯誤的靜態(tài)檢測

    動態(tài)內(nèi)存管理在面向嵌入式實時系統(tǒng)的研究

    動態(tài)內(nèi)存管理的基本任務(wù)就是有效地對動態(tài)內(nèi)存進(jìn)行分配、回收,并同時保證系統(tǒng)的快速性、可靠性和穩(wěn)定性。當(dāng)系統(tǒng)請求分配內(nèi)存時,系統(tǒng)需要從所有空閑塊中找到一個合適的空閑塊
    發(fā)表于 07-22 11:14 ?1183次閱讀

    動態(tài)內(nèi)存管理在面向嵌入式實時系統(tǒng)的研究

    動態(tài)內(nèi)存管理的基本任務(wù)就是有效地對動態(tài)內(nèi)存進(jìn)行分配、回收,并同時保證系統(tǒng)的快速性、可靠性和穩(wěn)定性。當(dāng)系統(tǒng)請求分配內(nèi)存時,系統(tǒng)需要從所有空閑塊中找到一個合適的空閑塊進(jìn)行分配;當(dāng)用戶不再使
    發(fā)表于 12-01 05:49 ?337次閱讀

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

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

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

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

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

    我遇到的許多嵌入式軟件開發(fā)人員提出的一個我覺得特別有趣的話題是動態(tài)內(nèi)存分配——在需要時獲取內(nèi)存塊。這種看似簡單和常規(guī)的操作會帶來大量問題。這些并不局限于
    的頭像 發(fā)表于 07-15 14:16 ?1827次閱讀
    <b class='flag-5'>嵌入式</b>開發(fā)是否應(yīng)該使用<b class='flag-5'>動態(tài)內(nèi)存</b>分配

    物聯(lián)網(wǎng)開發(fā)需要用到哪些編程語言?

    的編程語言是關(guān)鍵,物聯(lián)網(wǎng)開發(fā)需要用到哪些編程語言?C語言是物聯(lián)網(wǎng)嵌入式開發(fā)的重要編程語言之一,是軟件開發(fā)的通用語言,可用于絕大多數(shù)的嵌入式系統(tǒng),它是一門面向過程的編
    的頭像 發(fā)表于 02-23 15:39 ?2043次閱讀
    物聯(lián)網(wǎng)開發(fā)<b class='flag-5'>中</b><b class='flag-5'>需要用到</b>哪些編程語言?
    主站蜘蛛池模板: 韩国三级理论在线观看视频 | 亚洲操操操| 色黄网| 久久这里只有精品任你色 | 日韩特黄毛片 | 久久免费观看国产精品 | 国产美女叼嘿视频免费看 | 成年人网站在线 | 在线视频综合网 | 美女艹逼视频 | 亚洲无吗在线视频 | 日本a级片视频 | 精品免费福利视频 | 好吊操免费视频 | 中文字幕一区二区三区精彩视频 | 免费看黄视频的网站 | 天天看影院 | 国色天香精品亚洲精品 | 一级片在线视频 | tube44在线观看| 色婷婷久久综合中文久久蜜桃 | 51久久| 免费大片看黄在观看 | 午夜国产福利在线观看 | 91av视频在线| 免费一级毛毛片 | 一卡二卡卡四卡无人区中文 | 一区二区三区四区在线 | 国内自拍露脸普通话对白在线 | 免费观看在线观看 | 午夜影院免费在线观看 | 天天爱夜夜操 | 日韩免费高清一级毛片在线 | 一本到在线观看视频不卡 | 磁力bt种子搜索在线 | 五月婷婷综合在线 | 亚洲综合丁香 | 男人天堂网在线 | 美女一级毛片毛片在线播放 | 天天射网站 | 天天射天天怕 |