日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]所謂動(dòng)態(tài)內(nèi)存分配(Dynamic Memory Allocation)就是指在程序執(zhí)行的過程中動(dòng)態(tài)地分配或者回收存儲(chǔ)空間的分配內(nèi)存的方法。動(dòng)態(tài)內(nèi)存分配不像數(shù)組等靜態(tài)內(nèi)存分配方法那樣需要預(yù)先分配存儲(chǔ)空間,而是由系統(tǒng)根據(jù)程序的需要即時(shí)分配,且分配的大小就是程序要求的大小。

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

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

1.1、靜態(tài)和動(dòng)態(tài)內(nèi)存的特點(diǎn)

在探討這個(gè)問題之前我們先來對比下靜態(tài)內(nèi)存和動(dòng)態(tài)內(nèi)存的特點(diǎn):

1. 創(chuàng)建的時(shí)間不同: 創(chuàng)建的時(shí)間不同:靜態(tài)分配發(fā)生在程序編譯和連接的時(shí)候。動(dòng)態(tài)分配則發(fā)生在程序調(diào)入和執(zhí)行的時(shí)候。

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

代碼運(yùn)行過程中使用rt_malloc分配:

1static void onmessage_text(rws_socket socket, const char *text, const unsigned int len)

2{

3 char *buff = RT_NULL;

4

5 buff = (char *)rt_malloc(2048);

6

7 rt_memset(buff, 0x00, 2048);

8 rt_memcpy(buff, text, len);

9

10 LOG_D("message(txt), %d(byte): %s ", len, buff);

11

12 if(buff != RT_NULL)

13 {

14 rt_free(buff);

15 }

16}

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

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

在了解了靜態(tài)內(nèi)存和動(dòng)態(tài)內(nèi)存不同的特點(diǎn)后可以分析出它們在不同的方面具有不同的優(yōu)缺點(diǎn):

1.靜態(tài)內(nèi)存編譯階段就分配好了,不會(huì)存在分配失敗的情況,除非系統(tǒng)內(nèi)存被分配完了,但是在編譯階段就可以查出。動(dòng)態(tài)內(nèi)存在運(yùn)行中分配,在正常運(yùn)行的情況下可能夠正常分配,在某種環(huán)境下可能分配失敗 ,這樣就對開發(fā)者的代碼水平要求更高,要求開發(fā)者需要對代碼的健壯性有要求。

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

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

4. 在嵌入式RTOS中線程函數(shù)中使用靜態(tài)內(nèi)存,也就是在線程中定義局部變量,會(huì)加大線程棧空間的開銷。

裸機(jī)開發(fā)和RTOS開發(fā)的特點(diǎn)

1. 代碼規(guī)模:裸機(jī)開發(fā)的項(xiàng)目一般代碼規(guī)模度都比較小,對于一般開發(fā)者都難于駕馭使用裸機(jī)開發(fā)超大規(guī)模項(xiàng)目,人力成本和時(shí)間成本都太高。反而由于RTOS的模塊化特性,更容易開發(fā)出代碼規(guī)模大的項(xiàng)目。

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

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

明白不同內(nèi)存的優(yōu)缺點(diǎn)和裸機(jī)RTOS的特點(diǎn)之后,我們在回頭來分析 “嵌入式中是否應(yīng)該使用動(dòng)態(tài)內(nèi)存?” 這個(gè)問題。在實(shí)時(shí)嵌入式系統(tǒng)中,由于系統(tǒng)軟件并不像PC上復(fù)雜,一般都是很簡單的內(nèi)存使用,所以一般也不使用動(dòng)態(tài)內(nèi)存管理,但是隨著RTOS面臨的任務(wù)越來越重,尤其是IoT和AIoT的到來,讓許多消費(fèi)級產(chǎn)品運(yùn)行的RTOS的負(fù)擔(dān)越來越重。在這種情況下繼續(xù)使用靜態(tài)內(nèi)存開發(fā)會(huì)極大的限制開發(fā)進(jìn)度,整個(gè)開發(fā)的靈活性非常低。同時(shí)靜態(tài)的內(nèi)存無法復(fù)用使用同一片內(nèi)存區(qū)域,相比與動(dòng)態(tài)內(nèi)存在大型項(xiàng)目中一般會(huì)使用更多的內(nèi)存,在內(nèi)存大小不容樂觀的嵌入式系統(tǒng)是很難接受的。但是針對一些高穩(wěn)定性和高安全性的項(xiàng)目來說,使用動(dòng)態(tài)內(nèi)存就需要好好斟酌下,由于RTOS上基本沒有MMU的硬件支持或者是系統(tǒng)軟件支持,所以不可避免的系統(tǒng)中會(huì)出現(xiàn)內(nèi)存碎片,從而有可能導(dǎo)致系統(tǒng)異常。最終說了這么多總結(jié)成以下幾點(diǎn):

1. 沒有使用RTOS的項(xiàng)目:不建議使用動(dòng)態(tài)內(nèi)存,這種項(xiàng)目一般很簡單,不必使用動(dòng)態(tài)內(nèi)存增大系統(tǒng)開銷和復(fù)雜度。

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

3. 使用RTOS的軍工、航天、醫(yī)療等高穩(wěn)定性和高安全性項(xiàng)目:建議盡量降低對動(dòng)態(tài)內(nèi)存的使用與依賴以確保系統(tǒng)的穩(wěn)定性。當(dāng)然也不代表動(dòng)態(tài)內(nèi)存就無法在這些項(xiàng)目上使用,只是要求系統(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)存管理算法是一個(gè)簡單的內(nèi)存分配算法。初始時(shí),它是一塊大的內(nèi)存。當(dāng)需要分配內(nèi)存塊時(shí),將從這個(gè)大的內(nèi)存塊上分割出相匹配的內(nèi)存塊,然后把分割出來的空閑內(nèi)存塊還回給堆管理系統(tǒng)中。每個(gè)內(nèi)存塊都包含一個(gè)管理用的數(shù)據(jù)頭,通過這個(gè)頭把使用塊與空閑塊用雙向鏈表的方式鏈接起來。

RT-Thread 的 slab 分配器是在 DragonFly BSD 創(chuàng)始人 Matthew Dillon 實(shí)現(xiàn)的 slab 分配器基礎(chǔ)上,針對嵌入式系統(tǒng)優(yōu)化的內(nèi)存分配算法。最原始的 slab 算法是 Jeff Bonwick 為 Solaris 操作系統(tǒng)而引入的一種高效內(nèi)核內(nèi)存分配算法。

memheap 管理算法適用于系統(tǒng)含有多個(gè)地址可不連續(xù)的內(nèi)存堆。使用 memheap 內(nèi)存管理可以簡化系統(tǒng)存在多個(gè)內(nèi)存堆時(shí)的使用:當(dāng)系統(tǒng)中存在多個(gè)內(nèi)存堆的時(shí)候,用戶只需要在系統(tǒng)初始化時(shí)將多個(gè)所需的 memheap 初始化,并開啟 memheap 功能就可以很方便地把多個(gè) memheap(地址可不連續(xù))粘合起來用于系統(tǒng)的 heap 分配。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

根據(jù)IDC預(yù)測,中國在人工智能領(lǐng)域的投資預(yù)計(jì)到2027年將達(dá)到381億美元,占全球總投資的近9%。作為全球人工智能的重要參與者,中國正加速在汽車、通信、醫(yī)療、金融等多個(gè)行業(yè)應(yīng)用和發(fā)展生成式AI技術(shù),全面邁入“AI 2.0...

關(guān)鍵字: AI 內(nèi)存 DDR5

8月17日消息,近日,超頻愛好者“saltycroissant”成功將海盜船(CORSAIR)DDR5內(nèi)存超頻至12886MT/s,創(chuàng)造了新的世界紀(jì)錄。

關(guān)鍵字: 內(nèi)存 DDR5

在高性能服務(wù)架構(gòu)設(shè)計(jì)中,緩存是不可或缺的環(huán)節(jié)。在實(shí)際項(xiàng)目中,我們通常會(huì)將一些熱點(diǎn)數(shù)據(jù)存儲(chǔ)在Redis或Memcached等緩存中間件中,只有在緩存訪問未命中時(shí)才查詢數(shù)據(jù)庫。

關(guān)鍵字: 緩存 內(nèi)存

7月25日消息,由于供應(yīng)短缺,最近一段時(shí)間DDR4內(nèi)存頻繁出現(xiàn)漲價(jià)、缺貨等現(xiàn)象。

關(guān)鍵字: DDR4 內(nèi)存

在計(jì)算機(jī)編程中,動(dòng)態(tài)內(nèi)存分配是管理程序運(yùn)行時(shí)內(nèi)存需求的核心技術(shù)。C語言通過malloc和free這對函數(shù)實(shí)現(xiàn)了靈活的內(nèi)存控制機(jī)制,但這種靈活性也帶來了內(nèi)存泄漏等潛在風(fēng)險(xiǎn)。本文將深入解析動(dòng)態(tài)內(nèi)存分配原理,并系統(tǒng)介紹5種內(nèi)存...

關(guān)鍵字: 動(dòng)態(tài)內(nèi)存 malloc 計(jì)算機(jī)編程

7月10日消息,JEDEC今天正式發(fā)布了LPDDR6內(nèi)存標(biāo)準(zhǔn),規(guī)范編號JESD209-6,可顯著提升移動(dòng)設(shè)備、AI應(yīng)用的性能、能效、安全。

關(guān)鍵字: LPDDR6 內(nèi)存

7月6日消息,由于供應(yīng)短缺,DDR4內(nèi)存價(jià)格在過去幾個(gè)月內(nèi)大幅上漲,甚至超過了DDR5內(nèi)存,這一現(xiàn)象促使一些廠商重新考慮延長DDR4內(nèi)存的生產(chǎn)。

關(guān)鍵字: DDR4 內(nèi)存

上海 2025年6月23日 /美通社/ -- 近期,黑芝麻智能分享了其如何通過零拷貝共享內(nèi)存技術(shù),解決車載多域間大數(shù)據(jù)傳輸?shù)难舆t與資源消耗問題。核心技術(shù)包括全局內(nèi)存管理單元和dmabuf機(jī)制優(yōu)化,顯著降低CPU負(fù)載與D...

關(guān)鍵字: 內(nèi)存 數(shù)據(jù)傳輸 大數(shù)據(jù) BUF

6月16日消息,“至少十年沒看過現(xiàn)貨價(jià)單日漲幅這么大”,一位從業(yè)者表示。

關(guān)鍵字: DDR4 內(nèi)存

基于美光 LPDDR5X 內(nèi)存和 UFS 4.0 存儲(chǔ)解決方案,合力打造 Motorola 功能強(qiáng)大的翻蓋手機(jī)

關(guān)鍵字: LPDDR5X 內(nèi)存 AI
關(guān)閉