欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

內(nèi)存管理模塊mem_malloc介紹及測(cè)試驗(yàn)證實(shí)驗(yàn)

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

本次給大家分享一位大佬寫的應(yīng)用于單片機(jī)內(nèi)存管理模塊mem_malloc,這個(gè)mem_malloc的使用不會(huì)產(chǎn)生內(nèi)存碎片,可以高效利用單片機(jī)ram空間。

mem_malloc代碼倉(cāng)庫(kù):

?

https://github.com/chenqy2018/mem_malloc

?

mem_malloc介紹

一般單片機(jī)的內(nèi)存都比較小,而且沒有MMU,malloc 與free的使用容易造成內(nèi)存碎片。而且可能因?yàn)榭臻g不足而分配失敗,從而導(dǎo)致系統(tǒng)崩潰,因此應(yīng)該慎用,或者自己實(shí)現(xiàn)內(nèi)存管理。

mem_malloc就是一個(gè)不會(huì)產(chǎn)生內(nèi)存碎片的、適合單片機(jī)使用的內(nèi)存管理模塊。其與使用malloc的區(qū)別如:

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

算法原理:」

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

mem_malloc測(cè)試驗(yàn)證

下面以小熊派IOT開發(fā)板來(lái)做實(shí)驗(yàn)。

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

實(shí)驗(yàn)過(guò)程很簡(jiǎn)單。準(zhǔn)備一份開發(fā)板帶串口打印的工程,下載mem_malloc,把mem_malloc.c、mem_malloc.h復(fù)制到工程目錄下,并添加到工程里:

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

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

然后進(jìn)行編譯,編譯過(guò)程可能會(huì)報(bào)錯(cuò):

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

這份代碼在不同編譯器下編譯情況不同。gcc下編譯不會(huì)報(bào)錯(cuò),在keil下編譯報(bào)如上錯(cuò)誤。

keil編譯器更嚴(yán)格些。報(bào)錯(cuò)原因是對(duì)mem_block結(jié)構(gòu)體的mem_ptr成員進(jìn)行操作,而mem_ptr成員的類型是void*,而mem_ptr成員參與運(yùn)算時(shí)的增、減偏移量取決于mem_ptr的類型,所以這里我們需要指定類型。

我們把相關(guān)報(bào)錯(cuò)代碼修改如:

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

再次編譯就正常了。

下面簡(jiǎn)單看一下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:」

暫不貼出,感興趣的小伙伴可以在上面的倉(cāng)庫(kù)地址自行下載閱讀。在本公眾號(hào)后臺(tái)回復(fù):mem_malloc,進(jìn)行獲取。

下面對(duì)mem_malloc進(jìn)行測(cè)試驗(yàn)證。

測(cè)試代碼作者也有給出,這里我們簡(jiǎn)單測(cè)試即可,進(jìn)行了一些刪減及增加了一些注釋:

#include"mem_malloc.h"

charmem_id[10]={0};//10塊內(nèi)存塊

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();//打印內(nèi)存信息
test_malloc(1,10);//給申請(qǐng)一塊10個(gè)字節(jié)的內(nèi)存,標(biāo)記內(nèi)存塊id為1
test_malloc(2,8);//給申請(qǐng)一塊8個(gè)字節(jié)的內(nèi)存,標(biāo)記內(nèi)存塊id為2
test_malloc(3,20);//給申請(qǐng)一塊20個(gè)字節(jié)的內(nèi)存,標(biāo)記內(nèi)存塊id為2

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

test_malloc(4,70);//申請(qǐng)一塊70個(gè)字節(jié)的內(nèi)存

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

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

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

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

運(yùn)行結(jié)果及解析:

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

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

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

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

這里設(shè)定一個(gè)128字節(jié)的數(shù)組作為堆空間使用。其中數(shù)組前面存放的是申請(qǐng)到的內(nèi)存塊的信息,包括內(nèi)存塊地址、大小、索引信息,這三個(gè)數(shù)據(jù)各占4個(gè)字節(jié),共12個(gè)字節(jié)。這里有設(shè)計(jì)到一個(gè)大小端模式的問題,STM32平臺(tái)為小端模式,即數(shù)據(jù)的低位存儲(chǔ)在內(nèi)存的低地址中。

申請(qǐng)的內(nèi)存塊從128字節(jié)的尾部開始分配,再次申請(qǐng)的內(nèi)存塊依次往前移,釋放的內(nèi)存,則整體內(nèi)存塊往后移動(dòng),內(nèi)存塊之前不留空隙,即不產(chǎn)生內(nèi)存碎片。

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

原文標(biāo)題:干貨 | 分享一個(gè)實(shí)用的、可應(yīng)用于單片機(jī)的內(nèi)存管理模塊

文章出處:【微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅
聲明:本文內(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)注

    6044

    文章

    44624

    瀏覽量

    638949
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2736

    瀏覽量

    47787
  • 內(nèi)存管理
    +關(guān)注

    關(guān)注

    0

    文章

    168

    瀏覽量

    14194
  • malloc
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    84

原文標(biāo)題:干貨 | 分享一個(gè)實(shí)用的、可應(yīng)用于單片機(jī)的內(nèi)存管理模塊

文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于DWC_ether_qos的以太網(wǎng)驅(qū)動(dòng)開發(fā)-LWIP的內(nèi)存介紹

    ,protocol控制塊,包緩存等。在memp.c下實(shí)現(xiàn)。 LWIP的內(nèi)存池有兩種方式實(shí)現(xiàn),通過(guò)宏MEMP_MEM_MALLOC配置,默認(rèn)opt.h中配置為0. 配置為1使用mem_malloc
    的頭像 發(fā)表于 09-07 08:45 ?1882次閱讀
    基于DWC_ether_qos的以太網(wǎng)驅(qū)動(dòng)開發(fā)-LWIP的<b class='flag-5'>內(nèi)存</b>池<b class='flag-5'>介紹</b>

    請(qǐng)問lwip中的mem_malloc函數(shù)內(nèi)存塊問題該怎么解決?

    Lwip中內(nèi)存堆組織結(jié)構(gòu)如圖所示,下面是mem_malloc的關(guān)鍵代碼:void *mem_malloc(mem_size_t size){mem
    發(fā)表于 07-31 04:35

    「正點(diǎn)原子STM32Mini板資料連載」第三十二章 內(nèi)存管理實(shí)驗(yàn)

    USMART 調(diào)試,測(cè)試內(nèi)存管理函數(shù)。本實(shí)驗(yàn)用到的硬件資源有:1) 指示燈 DS02) 四個(gè)按鍵3) 串口4) TFTLCD 模塊這些我們
    發(fā)表于 04-13 12:06

    「正點(diǎn)原子NANO STM32開發(fā)板資料連載」第三十章 內(nèi)存管理實(shí)驗(yàn)

    ,測(cè)試內(nèi)存管理函數(shù)。本實(shí)驗(yàn)用到的硬件資源有:1) 指示燈 DS02) KEY0/KEY1/KEY2 等三個(gè)按鍵3) 串口這些我們都已經(jīng)介紹過(guò)
    發(fā)表于 04-23 15:05

    「正點(diǎn)原子NANO STM32F103開發(fā)板資料連載」第二十九章 內(nèi)存管理實(shí)驗(yàn)

    ),將這 m 個(gè)內(nèi)存管理表項(xiàng)目的值都清零,標(biāo)記釋放,完成一次內(nèi)存釋放。關(guān)于分塊式內(nèi)存管理的原理,我們就
    發(fā)表于 05-06 15:27

    「ALIENTEK 阿波羅 STM32F767 開發(fā)板資料連載」第四十四章 內(nèi)存管理實(shí)驗(yàn)

    很多種,他們其實(shí)最終都是要實(shí)現(xiàn) 2 個(gè)函數(shù):malloc 和 free;malloc 函數(shù)用于內(nèi)存申請(qǐng),free 函數(shù)用于內(nèi)存釋放。本章,我們介紹
    發(fā)表于 05-20 15:11

    「ALIENTEK 探索者 STM32F407 開發(fā)板資料連載」第四十二章 內(nèi)存管理實(shí)驗(yàn)

    最終都是要實(shí)現(xiàn) 2 個(gè)函數(shù):malloc 和 free;malloc 函數(shù)用于內(nèi)存申請(qǐng),free 函數(shù)用于內(nèi)存釋放。本章,我們介紹一種比較簡(jiǎn)
    發(fā)表于 06-13 10:21

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

    mem_malloc是什么?如何對(duì)mem_malloc進(jìn)行測(cè)試驗(yàn)證呢?
    發(fā)表于 02-17 07:31

    CC2541 osal_mem_alloc和malloc申請(qǐng)動(dòng)態(tài)內(nèi)存

    );還有一個(gè)問題就是為什么我用malloc和osal_mem_alloc申請(qǐng)動(dòng)態(tài)內(nèi)存,算法得出的結(jié)果并不一樣,且malloc申請(qǐng)的動(dòng)態(tài)內(nèi)存
    發(fā)表于 05-29 17:33

    SystemView抽樣定理驗(yàn)證實(shí)驗(yàn)的詳細(xì)資料說(shuō)明

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

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

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

    一個(gè)實(shí)用的、可應(yīng)用于單片機(jī)的內(nèi)存管理模塊

    關(guān)注+星標(biāo)公眾號(hào),不錯(cuò)過(guò)精彩內(nèi)容轉(zhuǎn)自 |嵌入式大雜燴本次給大家分享一位大佬寫的應(yīng)用于單片機(jī)內(nèi)存管理模塊mem_malloc,這個(gè)mem_malloc
    發(fā)表于 12-22 19:50 ?7次下載
    一個(gè)實(shí)用的、可應(yīng)用于單片機(jī)的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b><b class='flag-5'>模塊</b>

    應(yīng)用于單片機(jī)內(nèi)存管理模塊mem_malloc解析

    一般單片機(jī)的內(nèi)存都比較小,而且沒有MMU,malloc 與free的使用容易造成內(nèi)存碎片。而且可能因?yàn)榭臻g不足而分配失敗,從而導(dǎo)致系統(tǒng)崩潰,因此應(yīng)該慎用,或者自己實(shí)現(xiàn)內(nèi)存
    發(fā)表于 11-11 12:47 ?1986次閱讀

    PLC指令的驗(yàn)證實(shí)驗(yàn)和操作數(shù)的步驟

      PLC指令的驗(yàn)證實(shí)驗(yàn)測(cè)試驗(yàn)證PLC的編程程序是否正確的過(guò)程。通過(guò)這個(gè)實(shí)驗(yàn),可以檢測(cè)出PLC程序中是否存在邏輯錯(cuò)誤、語(yǔ)法錯(cuò)誤和硬件問題等問題。
    發(fā)表于 03-15 16:20 ?2113次閱讀

    靈動(dòng)微電子汽車芯片測(cè)試驗(yàn)證實(shí)驗(yàn)室通過(guò)國(guó)家CNAS認(rèn)證

    近日,上海靈動(dòng)微電子股份有限公司(以下簡(jiǎn)稱“靈動(dòng)微電子”)的汽車芯片測(cè)試驗(yàn)證實(shí)驗(yàn)室(以下簡(jiǎn)稱“車規(guī)實(shí)驗(yàn)室”)已順利通過(guò)中國(guó)合格評(píng)定國(guó)家認(rèn)可委員會(huì)(CNAS)的嚴(yán)格評(píng)審,正式獲授能力認(rèn)可證書。
    的頭像 發(fā)表于 12-28 17:08 ?1417次閱讀
    靈動(dòng)微電子汽車芯片<b class='flag-5'>測(cè)試驗(yàn)證實(shí)驗(yàn)</b>室通過(guò)國(guó)家CNAS認(rèn)證