91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 作者:黃工的嵌入式技術(shù) ? 2020-02-28 17:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

所謂動態(tài)內(nèi)存分配(Dynamic Memory Allocation)就是指在程序執(zhí)行的過程中動態(tài)地分配或者回收存儲空間的分配內(nèi)存的方法。

動態(tài)內(nèi)存分配不像數(shù)組等靜態(tài)內(nèi)存分配方法那樣需要預先分配存儲空間,而是由系統(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); 9 10LOG_D("message(txt),%d(byte):%s",len,buff); 11 12if(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進行分配。不過棧的動態(tài)分配和堆不同,他的動態(tài)分配是由編譯器進行釋放,無需我們手工實現(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)存可以被高效復用,當某段程序使用完畢后,可以將內(nèi)存交換給內(nèi)存池中等待下次程序的分配,由于這種機制,開發(fā)者可以利用更小的內(nèi)存開發(fā)更大型的程序。

3. 動態(tài)內(nèi)存由于是動態(tài)分配,所以涉及到分配和釋放的問題,假設X程序在分配了ABC3塊內(nèi)存,程序執(zhí)行完畢后AC區(qū)域內(nèi)存被釋放,但是由于開發(fā)者的疏忽導致B區(qū)域的內(nèi)存被遺留。而X程序又是會被反復調(diào)用的,這樣我們的內(nèi)存區(qū)域由于有沒有釋放的區(qū)域?qū)е旅看握{(diào)用就會占用一段區(qū)域,最終系統(tǒng)就沒有內(nèi)存可以使用。這種情況一般在產(chǎn)品實際體現(xiàn)為最開始的時候設備正常工作,但是運行了幾個小時或者幾天后死機。這種情況一般被稱作內(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)任務的劃分調(diào)度都是系統(tǒng)管理,當開發(fā)者對其機制了解不清楚的情況下反而帶來了部分風險。

除此之外RTOS上的內(nèi)存管理也是很大影響系統(tǒng)的,對于RTOS上一般不會存在MMU內(nèi)存管理單元,也就代表大部分運行RTOS的芯片上都沒有虛擬地址映射,那么就無法利用物理地址和虛擬地址的特性進行內(nèi)存整理,避免內(nèi)存泄漏。所以說在RTOS動態(tài)內(nèi)存這塊內(nèi)存有風險。

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

明白不同內(nèi)存的優(yōu)缺點和裸機RTOS的特點之后,我們在回頭來分析 “嵌入式中是否應該使用動態(tài)內(nèi)存?”

在實時嵌入式系統(tǒng)中,由于系統(tǒng)軟件并不像PC上復雜,一般都是很簡單的內(nèi)存使用,所以一般也不使用動態(tài)內(nèi)存管理,但是隨著RTOS面臨的任務越來越重,尤其是IoTAIoT的到來,讓許多消費級產(chǎn)品運行的RTOS的負擔越來越重。

在這種情況下繼續(xù)使用靜態(tài)內(nèi)存開發(fā)會極大的限制開發(fā)進度,整個開發(fā)的靈活性非常低。同時靜態(tài)的內(nèi)存無法復用使用同一片內(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)存碎片,從而有可能導致系統(tǒng)異常。最終說了這么多總結(jié)成以下幾點:
1. 沒有使用RTOS的項目:不建議使用動態(tài)內(nèi)存,這種項目一般很簡單,不必使用動態(tài)內(nèi)存增大系統(tǒng)開銷和復雜度。


2. 使用RTOS的消費級項目:建議使用動態(tài)內(nèi)存,一般這種項目代碼復雜度比裸機高,合理使用動態(tài)內(nèi)存會有效降低內(nèi)存的開銷。同時很多Github項目的linux程序都是會使用內(nèi)存管理,有這套機制能更加方便的移植代碼。


3. 使用RTOS的軍工、航天、醫(yī)療等高穩(wěn)定性和高安全性項目:建議盡量降低對動態(tài)內(nèi)存的使用與依賴以確保系統(tǒng)的穩(wěn)定性。當然也不代表動態(tài)內(nèi)存就無法在這些項目上使用,只是要求系統(tǒng)開發(fā)者對系統(tǒng)內(nèi)存的把控要求更高。

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

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

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

小內(nèi)存管理算法是一個簡單的內(nèi)存分配算法。初始時,它是一塊大的內(nèi)存。當需要分配內(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)存堆時的使用:當系統(tǒng)中存在多個內(nèi)存堆的時候,用戶只需要在系統(tǒng)初始化時將多個所需的 memheap 初始化,并開啟 memheap 功能就可以很方便地把多個 memheap(地址可不連續(xù))粘合起來用于系統(tǒng)的 heap 分配。

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

    關(guān)注

    5198

    文章

    20442

    瀏覽量

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

    關(guān)注

    1

    文章

    25

    瀏覽量

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

    關(guān)注

    0

    文章

    6

    瀏覽量

    1541
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    RT-Thread Vector軟件包:嵌入式開發(fā)的動態(tài)數(shù)組容器 | 技術(shù)集結(jié)

    RT-Thread Vector軟件包:嵌入式開發(fā)的動態(tài)數(shù)組容器 | 技術(shù)集結(jié)
    的頭像 發(fā)表于 01-25 09:33 ?5374次閱讀
    RT-Thread Vector軟件包:<b class='flag-5'>嵌入式</b>開發(fā)的<b class='flag-5'>動態(tài)</b>數(shù)組容器 | 技術(shù)集結(jié)

    keilc語言的動態(tài)分配內(nèi)存

    、靜態(tài)區(qū),在內(nèi)存還有‘堆’這樣的一個區(qū)域。其實,這塊內(nèi)存就是用來動態(tài)內(nèi)存分配的。 其實想一下就知道光靠棧區(qū)和靜態(tài)區(qū)在處理問題時是很不靈活的(因為其開辟的空間是固定的),比如在聲明數(shù)組
    發(fā)表于 01-21 06:04

    什么是嵌入式應用開發(fā)?

    、實現(xiàn)和部署,還包括硬件選擇、軟件設計、測試、集成和維護等流程?。 定義和背景 嵌入式應用開發(fā)是指將軟件部署到嵌入式系統(tǒng),這些系統(tǒng)廣泛應用于消費電子和工業(yè)自動化。
    發(fā)表于 01-12 16:13

    C語言嵌入式系統(tǒng)編程注意事項-內(nèi)存操作

    啟動后第一條要執(zhí)行的指令的位置。 記?。汉瘮?shù)無它,唯指令集合耳;你可以調(diào)用一個沒有函數(shù)體的函數(shù),本質(zhì)上只是換一個地址開始執(zhí)行指令! 數(shù)組vs動態(tài)申請 在嵌入式系統(tǒng)動態(tài)內(nèi)存申請存在比一
    發(fā)表于 01-04 07:31

    嵌入式系統(tǒng),動態(tài)分配內(nèi)存可能發(fā)生的問題是什么?

    盡管不像非嵌入式計算機那么常見,嵌入式系統(tǒng)還是有從堆(heap)動態(tài)分配內(nèi)存的過程的。 那么嵌入式
    發(fā)表于 12-22 09:42

    嵌入式硬件設計解析

    、需求分析 在進行嵌入式硬件設計之前,首先需要進行需求分析,明確系統(tǒng)的功能需求、性能要求、工作環(huán)境、成本限制等。例如,對于一個工業(yè)溫度控制系統(tǒng),需要確定測量的溫度范圍、精度要求、響應時間、是否需要遠程監(jiān)控
    發(fā)表于 12-02 08:22

    為什么單片機很少使用malloc,而PC程序頻繁使用呢?

    內(nèi)存分配方式。 性能要求單片機:單片機往往需要更高的執(zhí)行效率和低功耗,動態(tài)內(nèi)存分配可能引入不必要的性能開銷,尤其是在內(nèi)存分配和釋放的過程,可能會導致系統(tǒng)響應延遲。為了滿足高效、低
    發(fā)表于 11-20 06:55

    嵌入式開發(fā)的關(guān)鍵點介紹

    嵌入式開發(fā)在現(xiàn)代科技扮演著非常重要的角色。隨著物聯(lián)網(wǎng)的發(fā)展,嵌入式系統(tǒng)的需求也越來越大。嵌入式開發(fā)不僅需要開發(fā)人員具備深入的硬件知識和編程經(jīng)驗,還需要不斷學習新的技術(shù)和工具,以滿足不
    發(fā)表于 11-13 08:12

    嵌入式需要掌握哪些核心技能?

    : 1)C語言與底層編程 核心地位:C語言是嵌入式開發(fā)的基石,需精通指針操作、內(nèi)存管理、位運算,直接操控硬件資源。 延伸技能:C++用于復雜項目架構(gòu)設計,匯編語言優(yōu)化底層性能(如啟動代碼、中斷處理
    發(fā)表于 10-21 16:25

    嵌入式軟件測試與專業(yè)測試工具的必要性深度解析

    性能的要求尤為苛刻。 ?資源高度受限?:嵌入式系統(tǒng)通常在有限的內(nèi)存、存儲空間和處理能力下運行,測試需關(guān)注內(nèi)存管理、算法效率等資源優(yōu)化問題。內(nèi)存有限性迫使開發(fā)者采用malloc和fre
    發(fā)表于 09-28 17:42

    嵌入式達到什么水平才能就業(yè)?

    工具定位問題具備嵌入式軟件模塊化設計能力:能按功能劃分代碼模塊,編寫規(guī)范的頭文件與源文件,實現(xiàn)模塊間低耦合調(diào)用會使用Git 進行版本管理:能提交代碼、解決沖突、回滾版本,熟悉敏捷開發(fā)流程需求拆解與任務分配邏輯
    發(fā)表于 09-15 10:20

    Linux嵌入式和單片機嵌入式的區(qū)別?

    :使用Linux操作系統(tǒng),可以運行各種復雜的應用程序和驅(qū)動程序。 4. 資源需求 : 單片機嵌入式 :對硬件資源的需求較低,通常只需要一個單片機芯片,內(nèi)存和存儲空間較小。 Linux嵌入式 :對硬件資源的需求
    發(fā)表于 06-20 09:46

    IEC61508系統(tǒng)動態(tài)內(nèi)存使用

    IEC 61508標準強烈推薦使用靜態(tài)內(nèi)存管理方式。在安全應用設計,我們都在遵循這個建議。
    的頭像 發(fā)表于 04-11 15:17 ?1393次閱讀
    IEC61508系統(tǒng)<b class='flag-5'>中</b>的<b class='flag-5'>動態(tài)內(nèi)存</b>使用

    如何使用LAX_CODEGEN啟用動態(tài)內(nèi)存分配?

    我目前正在探索NXP_MBDToolbox_LAX。lax_codegen 生成的代碼基于靜態(tài)分配。我想管理大型向量,如何使用 LAX_CODEGEN 啟用動態(tài)內(nèi)存分配?
    發(fā)表于 04-10 08:09

    Python在嵌入式系統(tǒng)的應用場景

    你想把你的職業(yè)生涯提升到一個新的水平?Python在嵌入式系統(tǒng)中正在成為一股不可缺少的新力量。盡管傳統(tǒng)上嵌入式開發(fā)更多地依賴于C和C++語言,Python的優(yōu)勢在于其簡潔的語法、豐富的庫和快速的開發(fā)周期,這使得它在某些嵌入式場景
    的頭像 發(fā)表于 03-19 14:10 ?1492次閱讀