色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

淺談 malloc 函數(shù)在單片機(jī)上的應(yīng)用

矜辰所致 ? 來源:矜辰所致 ? 作者:矜辰所致 ? 2023-05-18 09:35 ? 次閱讀
聊聊 malloc函數(shù) 在單片機(jī)程序設(shè)計(jì)中怎么使用

前言

大家知道,我寫過 RT-Thread 專欄,當(dāng)初寫到了內(nèi)存管理的時(shí)候,想了想該怎么來說明這個(gè)內(nèi)存管理,實(shí)際上在平時(shí)使用STM32做一般產(chǎn)品的時(shí)候基本不會(huì)用到 malloc 函數(shù),即便是使用了操作系統(tǒng),在業(yè)務(wù)邏輯不復(fù)雜的情況下,還是用不上malloc。

但是每個(gè)嵌入式 RTOS 都會(huì)有自己的內(nèi)存管理方式,本文就來聊聊我對(duì) malloc 函數(shù)在單片機(jī)程序設(shè)計(jì)中的一些看法。

本文并不是要說明在單片機(jī)中怎么使用 malloc函數(shù),而是根據(jù)博主自己的理解,從函數(shù)使用的根本上來分析需不需要使用,何時(shí)何地使用。

本文的探討是單片機(jī)領(lǐng)域,以 Cortex-M 系列內(nèi)核為例。

一、malloc 函數(shù)簡(jiǎn)介

malloc的全稱是memory allocation,中文叫動(dòng)態(tài)內(nèi)存分配。

函數(shù)原型 void *malloc(unsigned int size),專業(yè)解釋還是套用百度百科:

在這里插入圖片描述

對(duì)于malloc函數(shù),應(yīng)該所有嵌入式工程師都知道,即便沒用過也都聽過,通過上面簡(jiǎn)單的說明,也都能夠知道是干什么用的。

注意上面紅色框框部分,malloc開辟的是連續(xù)的空間,返回的是一個(gè)地址,當(dāng)內(nèi)存不使用,需要使用free()函數(shù)釋放內(nèi)存。

二、malloc 之于單片機(jī)

在我們的單片機(jī)程序設(shè)計(jì)中,大都使用的C語言,當(dāng)然可以使用 malloc 函數(shù),但是有很多人并不能夠真正的理解它。

要理解單片機(jī)系統(tǒng)中的 malloc函數(shù) ,首先必須了解動(dòng)態(tài)分配的內(nèi)存是在什么地方呢!

2.1 malloc 函數(shù)申請(qǐng)的內(nèi)存在哪里?

也許大部分人知道在堆中!是的,在堆中沒錯(cuò)。

那么接著問題,堆在單片機(jī)的什么地方呢?具體地址是多少呢?

要了解這個(gè)問題,就得了解內(nèi)核的數(shù)據(jù)存儲(chǔ)方式,我們以常用的STM32為例,我也寫過文章,帶大家學(xué)習(xí)STM32的內(nèi)存管理(也馬上回在發(fā)燒友發(fā)表,帶給大家)。

這里我可以通過截圖給大家簡(jiǎn)單說明,了解下單片機(jī)的堆棧,在文中有如下說明:

如果通過上面推薦的博文理解了內(nèi)存分配,那么我們就可以得到如下結(jié)論,可以知道 malloc 申請(qǐng)空間的準(zhǔn)確地址了:

圖片.png

2.2 用與不用malloc的區(qū)別

知道了malloc申請(qǐng)空間在單片機(jī)中的地址,我們?cè)賮砜匆幌掠糜诓挥玫膮^(qū)別。

一般在我們的設(shè)計(jì)中,函數(shù)中可能會(huì)初始化一些臨時(shí)變量,如果是一個(gè)數(shù)組,那么他也會(huì)申請(qǐng)一段內(nèi)存空間,我們通過一張圖來看看使用臨時(shí)變量與malloc 的區(qū)別:

圖片.png

解釋到這里,相信大家對(duì)在單片機(jī)上使用 malloc 有了一個(gè)更深的認(rèn)識(shí)。他所存放的空間與我們經(jīng)常局部變量的空間是不同,而且我們也知道了在什么位置。

至于單片機(jī)用還是不用 malloc函數(shù)? 別急,我們還得往下面分析分析。

三、malloc可能遇到的問題

還是官方的百度百科里面介紹malloc的工作機(jī)制時(shí)候,有下面的說明:

圖片.png

注意圖中畫紅色的部分,簡(jiǎn)單解釋就是,使用 malloc 函數(shù)多了以后,會(huì)產(chǎn)生很多的內(nèi)存碎片,白白浪費(fèi)內(nèi)存。

3.1 內(nèi)存碎片

什么是內(nèi)存碎片是什么?

這種專業(yè)的術(shù)語還得靠萬能的百度(雖然百度百科的解釋針對(duì)的是大范圍的,但是對(duì)于單片機(jī)來說其實(shí)是一樣的):

圖片.png

系統(tǒng)中所有的不可用的空閑內(nèi)存就是內(nèi)存碎片。

那么 內(nèi)存碎片是什如何產(chǎn)生的?

在上圖中其實(shí)有碎片是如何產(chǎn)生的說明,內(nèi)部碎片是因?yàn)?a target="_blank">處理器的體系結(jié)構(gòu),需要字節(jié)對(duì)齊,比如我們?cè)趩纹瑱C(jī)中,常有4字節(jié)對(duì)齊,8字節(jié)對(duì)齊,不要說這個(gè)也不知道,我隨便打開一個(gè) STM32L051 的啟動(dòng)文件說明(GCC環(huán)境下的鏈接文件):

圖片.png

按照這個(gè)啟動(dòng)文件,我們也應(yīng)該能知道,堆棧內(nèi)存空間是需要8字節(jié)對(duì)齊的,那么我們?cè)赟TM32上使用 malloc 分配的內(nèi)存空間是8字節(jié)對(duì)齊的,即便你用不上8個(gè)字節(jié),系統(tǒng)也會(huì)給你對(duì)齊補(bǔ)上。

說到這個(gè),正好了可以說明我們內(nèi)存碎片產(chǎn)生的第一種情況,內(nèi)部碎片的產(chǎn)生:

圖片.png

那么外部碎片的產(chǎn)生,我們也可以用圖形來表示:

圖片.png

隨著內(nèi)存不斷被分配和釋放,整個(gè)內(nèi)存區(qū)域會(huì)產(chǎn)生越來越多的碎片,因?yàn)樵谑褂眠^程中,申請(qǐng)了一些內(nèi)存,其中一些釋放了,導(dǎo)致內(nèi)存空間中存在一些小的內(nèi)存塊,它們地址不連續(xù),不能夠作為一整塊的大內(nèi)存分配出去,系統(tǒng)中還有足夠的空閑內(nèi)存,但因?yàn)樗鼈兊刂凡⒎沁B續(xù),不能組成一塊連續(xù)的完整內(nèi)存塊,會(huì)使得程序不能申請(qǐng)到大的內(nèi)存。

在我們使用的單片機(jī)上,碎片產(chǎn)生問題尤為明顯,平時(shí)接觸不到,那是因?yàn)橐话銓W(xué)習(xí)測(cè)試不會(huì)遇到復(fù)雜的項(xiàng)目。

3.2 內(nèi)存管理

使用 malloc 會(huì)產(chǎn)生碎片,那么有什么辦法可以解決這個(gè)問題?

當(dāng)然是有的,那就是內(nèi)存管理。

內(nèi)存管理就是為了解決上面提到的內(nèi)存碎片問題,如何高效,快速的分配,并且在適當(dāng)?shù)臅r(shí)候釋放和回收內(nèi)存資源。

對(duì)于單片機(jī)來說,如果你有能力是可以自己設(shè)計(jì)內(nèi)存管理的方式。

如果使用嵌入式操作系統(tǒng)比如 FreeRTOS、RT-Thread 的話,他們內(nèi)核是自帶內(nèi)存管理的,本文并不會(huì)討論他們具體是如何內(nèi)存管理的,但是有必要了解一下操作系統(tǒng)的思路。

以 FreeRTOS 為例子說明:

在 FreeRTOS 中有一個(gè)宏定義configTOTAL_HEAP_SIZE

在這里插入圖片描述

操作系統(tǒng)首先向系統(tǒng)申請(qǐng)了一塊大的內(nèi)存,這塊內(nèi)存內(nèi)存由操作系統(tǒng)自己的內(nèi)存管理方式,對(duì)于FreeRTOS而言有5種內(nèi)存管理方式:

在這里插入圖片描述

我們?cè)谠O(shè)計(jì)的時(shí)候可以自己選擇使用哪一種,比如:

在這里插入圖片描述

對(duì)于申請(qǐng)的這塊內(nèi)存由操作系統(tǒng)自動(dòng)管理,F(xiàn)reeRTOS操作系統(tǒng)創(chuàng)建的任務(wù),任務(wù)棧使用的就是這一塊內(nèi)存,同時(shí)使用pvPortMalloc函數(shù)申請(qǐng)動(dòng)態(tài)內(nèi)存,也會(huì)從這一塊內(nèi)存中分配,因?yàn)樗幸惶淄晟频膬?nèi)存管理方式,所以相對(duì)我們直接使用 malloc來說,他能夠很好的處理系統(tǒng)內(nèi)存碎片的問題。

既然說到這里,額外的一個(gè)問題,就是 FreeRTOS configTOTAL_HEAP_SIZE定義額這塊內(nèi)存處于單片機(jī)內(nèi)存那個(gè)部分呢?

這就可以看我的又一篇博文:嵌入式RTOS的 任務(wù)棧 和 系統(tǒng)棧

FreeRTOS申請(qǐng)的內(nèi)存是屬于.bss段的,位置如下圖所示:

圖片.png

對(duì)于單片機(jī)使用的嵌入式操作系統(tǒng)來說,他們有自己的內(nèi)存管理方式,也會(huì)提供對(duì)于的動(dòng)態(tài)內(nèi)存申請(qǐng)結(jié)構(gòu),這時(shí)候我們使用操作系統(tǒng)提供的 malloc 接口函數(shù),可以很好的避免內(nèi)存碎片的產(chǎn)生。

注意!!單片機(jī)用了有內(nèi)存管理的操作系統(tǒng),系統(tǒng)會(huì)提供對(duì)于的 API,比如 FreeRTOS 的 pvPortMalloc 函數(shù),RT-Thread 的 rt_malloc 函數(shù)。如果使用 C 庫的 malloc,還是會(huì)從系統(tǒng)堆里面申請(qǐng)內(nèi)存!!

對(duì)于高端的單片機(jī),有 MMU(內(nèi)存管理單元) 模塊,比如 Cortex-A 系列,有了MMU就能跑linux,那么內(nèi)存管理也是必備。

四、結(jié)語(用還是不用?)

本文算是詳細(xì)分析了一下 malloc 函數(shù)在單片機(jī)上的使用效果,我們知道了 malloc 函數(shù)使用申請(qǐng)了內(nèi)存空間在哪里,我們也知道了內(nèi)存碎片是如何產(chǎn)生的。

回到我們最初的問題,單片機(jī)領(lǐng)域,用還是不用 malloc 函數(shù)?

看完文章這個(gè)問題估計(jì)都不需要我直接回答了:

從項(xiàng)目復(fù)雜程度來說:

如果跑裸機(jī) 做些小項(xiàng)目,如果沒有自己的內(nèi)存管理方式不是必要都不建議使用,同時(shí)為了節(jié)約內(nèi)存,可以把heap設(shè)置成很?。粢稽c(diǎn)給可能調(diào)用的C庫函數(shù)會(huì)用到)。

如果跑操作系統(tǒng),操作系統(tǒng)有完善的內(nèi)存管理,可以痛快的使用操作系統(tǒng)的malloc接口函數(shù)。但是如果做些小項(xiàng)目,也是可以不用的。

如果跑裸機(jī) 做些大項(xiàng)目???? 我個(gè)人不太建議……

從使用的芯片RAM大小來說:

如果你選用的芯片內(nèi)存比較小,10多K甚至幾K,還是用靜態(tài)內(nèi)存局部變量把,因?yàn)槟軌蚴褂眯?nèi)存的項(xiàng)目也不會(huì)太復(fù)雜,比如物聯(lián)網(wǎng)傳感器單品項(xiàng)目。

如果選用的芯片內(nèi)存比較大上了 MB, 那么還是可以嘗試使用 malloc 動(dòng)態(tài)內(nèi)存分配的,但是前提還是得有內(nèi)存管理。

但是最后還是得說一下,隨著現(xiàn)在的單片機(jī)發(fā)展,內(nèi)存越來越大,雖然單片機(jī)小項(xiàng)目不建議使用 malloc 函數(shù),但是我們上了操作系統(tǒng)以后,要學(xué)會(huì)去使用動(dòng)態(tài)內(nèi)存分配,因?yàn)楫?dāng)以后做的項(xiàng)目越來越復(fù)雜,線程越來越多,我們定義的局部變量越來越多,即便我們可以繼續(xù)增大系統(tǒng) 棧 的大小,但是這終究不是一種合理的解決方式。

我們應(yīng)該要學(xué)會(huì)合理的使用動(dòng)態(tài)內(nèi)存申請(qǐng),為了以后向更高的地方前進(jìn) ~

沒有必要鉆牛角尖,如果項(xiàng)目簡(jiǎn)單但就是想用。比如我就一個(gè)函數(shù)使用malloc 申請(qǐng)動(dòng)態(tài)內(nèi)存,沒有內(nèi)存管理,我就是用了怎么地? 這種情況用不用都一樣,看自己高興,沒有必要糾結(jié)!

本文就到這里,謝謝大家!

審核編輯 黃宇

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

    關(guān)注

    6037

    文章

    44560

    瀏覽量

    635544
  • RAM
    RAM
    +關(guān)注

    關(guān)注

    8

    文章

    1368

    瀏覽量

    114722
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3028

    瀏覽量

    74069
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4332

    瀏覽量

    62648
  • malloc
    +關(guān)注

    關(guān)注

    0

    文章

    52

    瀏覽量

    73
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    為什么單片機(jī)上的程序不怎么使用malloc,而PC上經(jīng)常使用?

    ,并定義一個(gè)相應(yīng)的malloc,有時(shí)候一些公司會(huì)給提供一些庫函數(shù)可能會(huì)實(shí)現(xiàn)malloc,但是因?yàn)?b class='flag-5'>單片機(jī)上RAM內(nèi)存十分有限,如果不知道它的運(yùn)行方式,估計(jì)會(huì)很危險(xiǎn)。同樣,因?yàn)?/div>
    發(fā)表于 05-03 13:33

    代碼是如何在單片機(jī)上跑的呢

    淺談:對(duì)于任何電子產(chǎn)品,硬件是軟件運(yùn)行的基礎(chǔ),而軟件賦予了硬件靈魂,兩者有機(jī)結(jié)合成為一個(gè)功能豐富、強(qiáng)大的系統(tǒng)。我們寫的代碼是如何在單片機(jī)上跑的呢?下面以比較簡(jiǎn)單的方式簡(jiǎn)述一下,如果還要研究很多細(xì)節(jié)
    發(fā)表于 11-17 07:47

    如何在單片機(jī)上也可正常使用動(dòng)態(tài)內(nèi)存分配

    51單片機(jī)內(nèi)存動(dòng)態(tài)分配序言最近玩51單片機(jī)碰到一個(gè)問題,51中malloc函數(shù)并不能像在PC上一樣正常運(yùn)行,這涉及到了內(nèi)存池的概念。下面就來演示一下如何在
    發(fā)表于 11-19 07:36

    malloc的相關(guān)資料分享

    首先,malloc( )屬于標(biāo)準(zhǔn)C語言函數(shù),當(dāng)然可以單片機(jī)上使用,如STM32可以先在啟動(dòng)文件中設(shè)置heap的大小,再使用動(dòng)態(tài)內(nèi)存分配: Heap_Size EQU 0x000002
    發(fā)表于 11-26 08:27

    51單片機(jī)使用malloc函數(shù)總是分配不到空間的原因?

    51單片機(jī)使用malloc函數(shù)總是分配不到空間
    發(fā)表于 10-28 07:45

    PWM單片機(jī)上的應(yīng)用

    PWM單片機(jī)上的應(yīng)用 脈沖寬度調(diào)制(PWM),是英文“Pulse Width Modulation”的縮寫,簡(jiǎn)稱脈寬調(diào)制,是利用微處理器的數(shù)字輸出來對(duì)模擬電路進(jìn)行控制的一種非常有效
    發(fā)表于 03-31 15:04 ?126次下載

    C語言入門教程-malloc函數(shù)和free函數(shù)

    malloc函數(shù)和free函數(shù) 假設(shè)您的程序執(zhí)行過程中需要分配一定量的內(nèi)存。您可以隨時(shí)調(diào)用malloc
    發(fā)表于 07-29 11:58 ?4653次閱讀

    PID算法AVR單片機(jī)上的應(yīng)用

    PID算法AVR單片機(jī)上的應(yīng)用。自己平時(shí)收集的一些小資料,希望你們可以用到吧
    發(fā)表于 07-26 10:43 ?1次下載

    淺談單片機(jī)上電復(fù)位后端口的狀態(tài)問題

    MSP430單片機(jī)的手冊(cè)中,對(duì)于端口復(fù)位后的狀態(tài),是這樣描述的:復(fù)位后,所有端口處于輸入狀態(tài)。就這個(gè)問題,我們來簡(jiǎn)單說一下單片機(jī)上電復(fù)位后端口的狀態(tài)問題。
    的頭像 發(fā)表于 10-06 09:52 ?1.2w次閱讀
    <b class='flag-5'>淺談</b><b class='flag-5'>單片機(jī)上</b>電復(fù)位后端口的狀態(tài)問題

    淺談單片機(jī)上電復(fù)位后端口的狀態(tài)

    MSP430 單片機(jī)的手冊(cè)中,對(duì)于端口復(fù)位后的狀態(tài),是這樣描述的:復(fù)位后,所有端口處于輸入狀態(tài)。 就這個(gè)問題,我們來簡(jiǎn)單說一下單片機(jī)上電復(fù)位后端口的狀態(tài)問題。 首先,單片機(jī)上電后端
    的頭像 發(fā)表于 11-30 18:17 ?4140次閱讀

    分享可應(yīng)用于單片機(jī)的內(nèi)存管理模塊mem_malloc

    本次給大家分享一位大佬寫的應(yīng)用于單片機(jī)內(nèi)存管理模塊mem_malloc,這個(gè)mem_malloc的使用不會(huì)產(chǎn)生內(nèi)存碎片,可以高效利用單片機(jī)ram空間。 mem_
    的頭像 發(fā)表于 06-25 08:54 ?3032次閱讀
    分享可應(yīng)用于<b class='flag-5'>單片機(jī)</b>的內(nèi)存管理模塊mem_<b class='flag-5'>malloc</b>

    關(guān)于stm32 MCU申請(qǐng)動(dòng)態(tài)內(nèi)存malloc的認(rèn)識(shí)

    首先,malloc( )屬于標(biāo)準(zhǔn)C語言函數(shù),當(dāng)然可以單片機(jī)上使用,如STM32可以先在啟動(dòng)文件中設(shè)置heap的大小,再使用動(dòng)態(tài)內(nèi)存分配: Heap_Size EQU 0x000002
    發(fā)表于 11-18 16:21 ?14次下載
    關(guān)于stm32 MCU申請(qǐng)動(dòng)態(tài)內(nèi)存<b class='flag-5'>malloc</b>的認(rèn)識(shí)

    記錄單片機(jī)使用malloc產(chǎn)生內(nèi)存泄露的問題及解決方法

    項(xiàng)目場(chǎng)景:單片機(jī)使用malloc產(chǎn)生內(nèi)存泄露的問題問題描述:bug1:創(chuàng)建了一個(gè)結(jié)構(gòu)體指針,通過malloc動(dòng)態(tài)開辟內(nèi)存的方式開辟了一段內(nèi)存空間,然后進(jìn)行寫入數(shù)據(jù)修改數(shù)據(jù)的操作,但是下面的代碼會(huì)導(dǎo)致
    發(fā)表于 12-03 10:21 ?8次下載
    記錄<b class='flag-5'>單片機(jī)</b>使用<b class='flag-5'>malloc</b>產(chǎn)生內(nèi)存泄露的問題及解決方法

    Contiki單片機(jī)上的編程框架

    導(dǎo)讀:本文講解了Contiki單片機(jī)上的編程框架和一般的開發(fā)流程,并給出范例程序。并較為淺顯解釋了Contiki的工作機(jī)制。如何使用Contiki開發(fā)程序?先給出main函數(shù)代碼,有個(gè)直觀
    發(fā)表于 12-07 19:36 ?12次下載
    Contiki<b class='flag-5'>在</b><b class='flag-5'>單片機(jī)上</b>的編程框架

    如何在單片機(jī)中使用malloc函數(shù)

    但是每個(gè)嵌入式 RTOS 都會(huì)有自己的內(nèi)存管理方式,本文就來聊聊我對(duì) malloc 函數(shù)單片機(jī)程序設(shè)計(jì)中的一些看法。 本文并不是要說明
    的頭像 發(fā)表于 04-24 09:50 ?2569次閱讀
    如何在<b class='flag-5'>單片機(jī)</b>中使用<b class='flag-5'>malloc</b><b class='flag-5'>函數(shù)</b>
    主站蜘蛛池模板: 色综合伊人色综合网站下载| 伦理片天堂eeuss影院2o12| 国产亚洲精品久久777777| 人与禽交3d动漫羞羞动漫| 4k岛国精品午夜高清在线观看| 精品综合久久久久久8888| 亚洲精品视频区| 果冻传媒2021在线观看 | 动漫在线观看免费肉肉| 年轻的母亲4线在线观看完整| 一个人色导航| 久久电影精品| 中文字幕欧美日韩VA免费视频| 久草在线精彩免费视频| 一个人在线观看视频免费| 久久青青热| 99国产这里只有精品视频| 999久久狠狠免费精品| 快播理伦片| 99免费精品| 青青青青草| 岛国精品在线观看| 无码日韩人妻精品久久蜜桃入口| 国产成人免费手机在线观看视频| 十分钟视频影院免费| 国产欧美亚洲综合第一页| 亚洲精品蜜夜内射| 久久久久999| 99热久久这里只精品国产WWW| 青柠在线电影高清免费观看| 国产 有码 无码 电影| 小776 论坛| 快播最新电影网站| yellow视频免费观看| 偷拍 自怕 亚洲 在线| 花蝴蝶高清影视视频在线播放| 伊人精品视频直播| 欧美一级久久久久久久久大| 国产精品18久久久久久欧美网址 | 俄罗斯XBXBXB兽交| 亚洲蜜桃AV色情精品成人|