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

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

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

3天內不再提示

內存管理模塊mem_malloc介紹及測試驗證實驗

FPGA之家 ? 來源:嵌入式大雜燴 ? 作者:ZhengNL ? 2022-05-23 11:57 ? 次閱讀

本次給大家分享一位大佬寫的應用于單片機內存管理模塊mem_malloc,這個mem_malloc的使用不會產生內存碎片,可以高效利用單片機ram空間。

mem_malloc代碼倉庫:

?

https://github.com/chenqy2018/mem_malloc

?

mem_malloc介紹

一般單片機的內存都比較小,而且沒有MMU,malloc 與free的使用容易造成內存碎片。而且可能因為空間不足而分配失敗,從而導致系統崩潰,因此應該慎用,或者自己實現內存管理。

mem_malloc就是一個不會產生內存碎片的、適合單片機使用的內存管理模塊。其與使用malloc的區別如:

facd038e-d7d5-11ec-bce3-dac502259ad0.png

算法原理:」

定義一個數組作為動態分配的堆空間,低地址空間保存管理數據,高地址空間實際分配給用戶的緩存(類似堆棧使用,分配是往中間靠攏),free時移動高地址用戶空間(以時間換空間),使得未使用的空間都是連續的。

mem_malloc測試驗證

下面以小熊派IOT開發板來做實驗。

fb0333a0-d7d5-11ec-bce3-dac502259ad0.jpg

實驗過程很簡單。準備一份開發板帶串口打印的工程,下載mem_malloc,把mem_malloc.c、mem_malloc.h復制到工程目錄下,并添加到工程里:

fb3c3f38-d7d5-11ec-bce3-dac502259ad0.png

fb709cba-d7d5-11ec-bce3-dac502259ad0.png

然后進行編譯,編譯過程可能會報錯:

..Srcmem_malloc.c(119):error:#852:expressionmustbeapointertoacompleteobjecttype

這份代碼在不同編譯器下編譯情況不同。gcc下編譯不會報錯,在keil下編譯報如上錯誤。

keil編譯器更嚴格些。報錯原因是對mem_block結構體的mem_ptr成員進行操作,而mem_ptr成員的類型是void*,而mem_ptr成員參與運算時的增、減偏移量取決于mem_ptr的類型,所以這里我們需要指定類型。

我們把相關報錯代碼修改如:

fb7e87e4-d7d5-11ec-bce3-dac502259ad0.png

再次編譯就正常了。

下面簡單看一下mem_malloc的代碼。

「mem_malloc.h:」

#ifndef__MEM_MALLOC_H__
#define__MEM_MALLOC_H__

#ifdef__cplusplus
extern"C"{
#endif

#include
#include
#include
#include
#include

#pragmapack(1)
typedefstructmem_block
{
void*mem_ptr;
unsignedintmem_size;
unsignedintmem_index;
}mem_block;
#pragmapack()

#defineMEM_SIZE128


voidprint_mem_info(void);
voidprint_hex(char*data,intlen);
voidprint_mem_hex(intsize);
intmem_malloc(unsignedintmsize);
intmem_realloc(intid,unsignedintmsize);
void*mem_buffer(intid);
intmem_free(intid);


#ifdef__cplusplus
}
#endif

#endif

「mem_malloc.c:」

暫不貼出,感興趣的小伙伴可以在上面的倉庫地址自行下載閱讀。在本公眾號后臺回復:mem_malloc,進行獲取。

下面對mem_malloc進行測試驗證。

測試代碼作者也有給出,這里我們簡單測試即可,進行了一些刪減及增加了一些注釋:

#include"mem_malloc.h"

charmem_id[10]={0};//10塊內存塊

voidtest_malloc(inti,intsize)
{
printf("------test_malloc-------
");
mem_id[i]=mem_malloc(size);
if(mem_id[i]==0)
{
printf("malloc---fail
");
printf("size=%d
",size);
}
else
{
char*p=mem_buffer(mem_id[i]);
memset(p,i,size);
printf("p=0x%x,i=%d,id=%d,size=%d
",(int)p,i,mem_id[i],size);
}
print_mem_hex(MEM_SIZE);
}

voidtest_buffer(inti,intsize)
{
printf("------test_buffer-------
");
printf("i=%d,id=%d,size=%d
",i,mem_id[i],size);
char*p=mem_buffer(mem_id[i]);
if(p!=NULL)
{
memset(p,0xf0+i,size);
print_mem_hex(MEM_SIZE);
}
else
{
printf("test_buffer---fail
");
}
}

voidtest_realloc(inti,intsize)
{
printf("------test_realloc-------
");
printf("i=%d,id=%d,size=%d
",i,mem_id[i],size);
intret=mem_realloc(mem_id[i],size);
if(ret)
{
char*p=mem_buffer(mem_id[i]);
memset(p,0xa0+i,size);
print_mem_hex(MEM_SIZE);
}
else
{
printf("test_realloc---fail
");
}
}

voidtest_free(inti)
{
printf("------test_free-------
");
printf("i=%d,id=%d
",i,mem_id[i]);
if(mem_free(mem_id[i]))
print_mem_hex(MEM_SIZE);
}

voidmain(void)
{
print_mem_info();//打印內存信息
test_malloc(1,10);//給申請一塊10個字節的內存,標記內存塊id為1
test_malloc(2,8);//給申請一塊8個字節的內存,標記內存塊id為2
test_malloc(3,20);//給申請一塊20個字節的內存,標記內存塊id為2

test_free(2);//釋放id為2的內存塊的內存

test_malloc(4,70);//申請一塊70個字節的內存

test_free(1);//釋放id為1的內存塊內存

test_buffer(3,20);//獲取id為3的內存塊地址,并往這個內存塊重新寫入0xf0+i的數據

test_realloc(3,10);//重新分配內存,并往這個內存塊重新寫入0xa0+i的數據

for(inti=0;i<10;i++)//釋放所有內存塊內存,已釋放的不再重新釋放
test_free(i);
}

運行結果及解析:

fbbb0b56-d7d5-11ec-bce3-dac502259ad0.png

fbdedf4a-d7d5-11ec-bce3-dac502259ad0.png

fbf6aad0-d7d5-11ec-bce3-dac502259ad0.png

fc1a7514-d7d5-11ec-bce3-dac502259ad0.png

這里設定一個128字節的數組作為堆空間使用。其中數組前面存放的是申請到的內存塊的信息,包括內存塊地址、大小、索引信息,這三個數據各占4個字節,共12個字節。這里有設計到一個大小端模式的問題,STM32平臺為小端模式,即數據的低位存儲在內存的低地址中。

申請的內存塊從128字節的尾部開始分配,再次申請的內存塊依次往前移,釋放的內存,則整體內存塊往后移動,內存塊之前不留空隙,即不產生內存碎片。

以上就是本次的分享,如有錯誤,歡迎指出,謝謝!

原文標題:干貨 | 分享一個實用的、可應用于單片機的內存管理模塊

文章出處:【微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6035

    文章

    44554

    瀏覽量

    634663
  • 模塊
    +關注

    關注

    7

    文章

    2695

    瀏覽量

    47433
  • 內存管理
    +關注

    關注

    0

    文章

    168

    瀏覽量

    14134
  • malloc
    +關注

    關注

    0

    文章

    52

    瀏覽量

    73

原文標題:干貨 | 分享一個實用的、可應用于單片機的內存管理模塊

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    基于DWC_ether_qos的以太網驅動開發-LWIP的內存介紹

    ,protocol控制塊,包緩存等。在memp.c下實現。 LWIP的內存池有兩種方式實現,通過宏MEMP_MEM_MALLOC配置,默認opt.h中配置為0. 配置為1使用mem_malloc
    的頭像 發表于 09-07 08:45 ?1718次閱讀
    基于DWC_ether_qos的以太網驅動開發-LWIP的<b class='flag-5'>內存</b>池<b class='flag-5'>介紹</b>

    請問lwip中的mem_malloc函數內存塊問題該怎么解決?

    Lwip中內存堆組織結構如圖所示,下面是mem_malloc的關鍵代碼:void *mem_malloc(mem_size_t size){mem
    發表于 07-31 04:35

    「正點原子STM32Mini板資料連載」第三十二章 內存管理實驗

    USMART 調試,測試內存管理函數。本實驗用到的硬件資源有:1) 指示燈 DS02) 四個按鍵3) 串口4) TFTLCD 模塊這些我們
    發表于 04-13 12:06

    「正點原子NANO STM32開發板資料連載」第三十章 內存管理實驗

    測試內存管理函數。本實驗用到的硬件資源有:1) 指示燈 DS02) KEY0/KEY1/KEY2 等三個按鍵3) 串口這些我們都已經介紹
    發表于 04-23 15:05

    「正點原子NANO STM32F103開發板資料連載」第二十九章 內存管理實驗

    ),將這 m 個內存管理表項目的值都清零,標記釋放,完成一次內存釋放。關于分塊式內存管理的原理,我們就
    發表于 05-06 15:27

    「ALIENTEK 阿波羅 STM32F767 開發板資料連載」第四十四章 內存管理實驗

    很多種,他們其實最終都是要實現 2 個函數:malloc 和 free;malloc 函數用于內存申請,free 函數用于內存釋放。本章,我們介紹
    發表于 05-20 15:11

    「ALIENTEK 探索者 STM32F407 開發板資料連載」第四十二章 內存管理實驗

    最終都是要實現 2 個函數:malloc 和 free;malloc 函數用于內存申請,free 函數用于內存釋放。本章,我們介紹一種比較簡
    發表于 06-13 10:21

    應用于單片機內存管理模塊mem_malloc分享

    mem_malloc是什么?如何對mem_malloc進行測試驗證呢?
    發表于 02-17 07:31

    CC2541 osal_mem_alloc和malloc申請動態內存

    );還有一個問題就是為什么我用malloc和osal_mem_alloc申請動態內存,算法得出的結果并不一樣,且malloc申請的動態內存
    發表于 05-29 17:33

    SystemView抽樣定理驗證實驗的詳細資料說明

    本文檔的主要內容詳細介紹的是SystemView抽樣定理驗證實驗的詳細資料說明。一、實驗目的1、 熟悉使用System View軟件,了解各部分功能模塊的操作和使用方法。2、 通過
    發表于 01-29 11:15 ?28次下載
    SystemView抽樣定理<b class='flag-5'>驗證實驗</b>的詳細資料說明

    分享可應用于單片機的內存管理模塊mem_malloc

    本次給大家分享一位大佬寫的應用于單片機內存管理模塊mem_malloc,這個mem_malloc的使用不會產生
    的頭像 發表于 06-25 08:54 ?3020次閱讀
    分享可應用于單片機的<b class='flag-5'>內存</b><b class='flag-5'>管理</b><b class='flag-5'>模塊</b><b class='flag-5'>mem_malloc</b>

    一個實用的、可應用于單片機的內存管理模塊

    關注+星標公眾號,不錯過精彩內容轉自 |嵌入式大雜燴本次給大家分享一位大佬寫的應用于單片機內存管理模塊mem_malloc,這個mem_malloc
    發表于 12-22 19:50 ?7次下載
    一個實用的、可應用于單片機的<b class='flag-5'>內存</b><b class='flag-5'>管理</b><b class='flag-5'>模塊</b>

    應用于單片機內存管理模塊mem_malloc解析

    一般單片機的內存都比較小,而且沒有MMU,malloc 與free的使用容易造成內存碎片。而且可能因為空間不足而分配失敗,從而導致系統崩潰,因此應該慎用,或者自己實現內存
    發表于 11-11 12:47 ?1951次閱讀

    PLC指令的驗證實驗和操作數的步驟

      PLC指令的驗證實驗測試驗證PLC的編程程序是否正確的過程。通過這個實驗,可以檢測出PLC程序中是否存在邏輯錯誤、語法錯誤和硬件問題等問題。
    發表于 03-15 16:20 ?1938次閱讀

    靈動微電子汽車芯片測試驗證實驗室通過國家CNAS認證

    近日,上海靈動微電子股份有限公司(以下簡稱“靈動微電子”)的汽車芯片測試驗證實驗室(以下簡稱“車規實驗室”)已順利通過中國合格評定國家認可委員會(CNAS)的嚴格評審,正式獲授能力認可證書。
    的頭像 發表于 12-28 17:08 ?1304次閱讀
    靈動微電子汽車芯片<b class='flag-5'>測試驗證實驗</b>室通過國家CNAS認證
    主站蜘蛛池模板: 久久热最新网站获取3| 成人无码在线超碰视频| a视频免费看| 国产第81页| 久久精品男人影院| 青青涩射射| 亚洲H成年动漫在线观看不卡| 在线播放无码字幕亚洲| 777米奇影院第七色色| 国产99久久久国产精品免费看| 国产综合自拍 偷拍在线| 欧美高清69hd| 亚洲国产高清福利视频| jizzjizz3d动漫| 娇喘高潮教室h| 三叶草成人| 5566精品资源在线播放| 国产精品午夜福利在线观看| 老熟人老女人国产老太| 亚洲AV天堂无码麻豆电影| 91综合精品网站久久| 国产专区青青在线视频| 日本视频中文字幕一区二区 | 国产www视频| 男子扒开美女尿口做羞羞的事| 亚洲 国产 日韩 欧美 在线| 草久久久久| 免费高清在线影片一区| 无羞耻肉动漫在线观看| yellow免费| 欧美高清videossexo| 中文字幕人成乱码熟女APP| 国产偷啪自怕网| 思思久久99热只有频精品66| a国产成人免费视频| 蜜桃麻豆WWW久久囤产精品免费| 杨幂视频1分11未删减在线观看| 国产精品日本不卡一区二区| 色欲AV亚洲午夜精品无码| 国产97视频在线观看| 亚洲AV无码久久流水呻蜜桃久色|