女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

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

FPGA之家 ? 來源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2021-06-25 08:54 ? 次閱讀

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

mem_malloc代碼倉庫:

?

https://github.com/chenqy2018/mem_malloc

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

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

算法原理:」

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

mem_malloc測試驗證下面以小熊派IOT開發(fā)板來做實驗。

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

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

。.Srcmem_malloc.c(119): error: #852: expression must be a pointer to a complete object type

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

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

我們把相關(guān)報錯代碼修改如:

69e1c774-d501-11eb-9e57-12bb97331649.png

再次編譯就正常了。

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

「mem_malloc.h:」

#ifndef __MEM_MALLOC_H__#define __MEM_MALLOC_H__#ifdef __cplusplusextern “C” {

#endif#include 《stdio.h》 #include 《stdint.h》#include 《stdlib.h》#include 《string.h》#include 《stdarg.h》#pragma pack(1)typedef struct mem_block

{

void *mem_ptr;

unsigned int mem_size;

unsigned int mem_index;

}mem_block;

#pragma pack()#define MEM_SIZE 128void print_mem_info(void);

void print_hex(char *data, int len);

void print_mem_hex(int size);

int mem_malloc(unsigned int msize);

int mem_realloc(int id, unsigned int msize);

void *mem_buffer(int id);

int mem_free(int id);

#ifdef __cplusplus

}

#endif#endif

「mem_malloc.c:」

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

下面對mem_malloc進行測試驗證。

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

#include “mem_malloc.h”char mem_id[10]={0}; // 10塊內(nèi)存塊void test_malloc(int i, int size)

{

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);

}

void test_buffer(int i, int size)

{

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

”);

}

}

void test_realloc(int i, int size)

{

printf(“------test_realloc-------

”);

printf(“i=%d, id = %d, size=%d

”, i, mem_id[i], size);

int ret = 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

”);

}

}

void test_free(int i)

{

printf(“------test_free-------

”);

printf(“i=%d, id = %d

”, i, mem_id[i]);

if(mem_free(mem_id[i]))

print_mem_hex( MEM_SIZE);

}

void main(void)

{

print_mem_info(); // 打印內(nèi)存信息

test_malloc(1, 10); // 給申請一塊10個字節(jié)的內(nèi)存,標(biāo)記內(nèi)存塊id為1

test_malloc(2, 8); // 給申請一塊8個字節(jié)的內(nèi)存,標(biāo)記內(nèi)存塊id為2

test_malloc(3, 20); // 給申請一塊20個字節(jié)的內(nèi)存,標(biāo)記內(nèi)存塊id為2

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

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

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

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

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

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

test_free(i);

}

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

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

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

編輯:jq

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

    關(guān)注

    14

    文章

    1583

    瀏覽量

    78636
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4886

    瀏覽量

    70253
  • MMU
    MMU
    +關(guān)注

    關(guān)注

    0

    文章

    92

    瀏覽量

    18639
  • IOT
    IOT
    +關(guān)注

    關(guān)注

    187

    文章

    4283

    瀏覽量

    200665
  • malloc
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    191

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

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

收藏 人收藏

    評論

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

    51單片機模塊化編程設(shè)計與實例要點分析

    51單片機模塊化開發(fā)教程
    發(fā)表于 02-24 16:40 ?1次下載

    不停的malloc程序會異常嗎

    malloc 放在死循環(huán)里面,會是什么樣的現(xiàn)象? 比如這樣的代碼,每次使用 malloc 申請 1M 大小的內(nèi)存,其他什么操作也不做。 理論上來說,堆內(nèi)存是有限的,如果不停的申請,
    的頭像 發(fā)表于 01-14 09:17 ?383次閱讀

    高集成度電源管理芯片CN8911B應(yīng)用于PLC模塊

    高集成度電源管理芯片CN8911B應(yīng)用于PLC模塊
    的頭像 發(fā)表于 12-18 10:07 ?487次閱讀
    高集成度電源<b class='flag-5'>管理</b>芯片CN8911B<b class='flag-5'>應(yīng)用于</b>PLC<b class='flag-5'>模塊</b>

    如何優(yōu)化單片機項目的功耗

    在現(xiàn)代電子設(shè)計中,功耗優(yōu)化已成為一個不可忽視的重要議題。對于單片機(MCU)項目而言,功耗不僅關(guān)系到產(chǎn)品的能效比,還直接影響到電池壽命和熱管理。 硬件層面的功耗優(yōu)化 1. 選擇合適的單片機 選擇一個
    的頭像 發(fā)表于 11-01 14:16 ?1075次閱讀

    單片機編程語言有哪些選擇

    單片機(Microcontroller Unit,MCU)編程是指為單片機編寫程序的過程,這些程序控制單片機的行為和功能。單片機廣泛應(yīng)用于
    的頭像 發(fā)表于 11-01 14:13 ?2135次閱讀

    單片機怎么寫入程序

    單片機(Microcontroller Unit,MCU)是一種集成電路芯片,它將計算機的CPU、存儲器、輸入/輸出接口等功能集成在一個芯片上。單片機廣泛應(yīng)用于嵌入式系統(tǒng)和物聯(lián)網(wǎng)設(shè)備中。編寫
    的頭像 發(fā)表于 10-21 11:21 ?2122次閱讀

    國產(chǎn)51單片機XD08M3232接近感應(yīng)單片機出現(xiàn)啦,可替代合泰BS45F3232

    用,完全可以替代合泰BS45F3232。對初學(xué)者工程師來說有著大容量的內(nèi)存非常的友善。 此款單片機可應(yīng)用于,衛(wèi)浴感應(yīng)器、感應(yīng)龍頭、煙霧報警器、感應(yīng)垃圾桶、指紋鎖喚醒等等一些列需要超低待機功耗的接近感應(yīng)相關(guān)設(shè)備應(yīng)用,目前還發(fā)現(xiàn)便攜
    發(fā)表于 10-09 15:25

    單片機加wifi模塊可以做什么

    單片機(Microcontroller Unit, MCU)是一種集成電路芯片,它將計算機的CPU、存儲器、輸入/輸出接口等功能集成在一塊芯片上,具有體積小、成本低、功耗低等特點,廣泛應(yīng)用于各種
    的頭像 發(fā)表于 09-10 15:32 ?1518次閱讀

    單片機WiFi模塊怎樣連接手機APP

    單片機WiFi模塊連接到手機APP通常涉及以下幾個步驟: 選擇單片機和WiFi模塊 :選擇合適的單片機(如Arduino, ESP32等)
    的頭像 發(fā)表于 09-10 15:31 ?3237次閱讀

    內(nèi)存管理的硬件結(jié)構(gòu)

    常見的內(nèi)存分配函數(shù)有malloc,mmap等,但大家有沒有想過,這些函數(shù)在內(nèi)核中是怎么實現(xiàn)的?換句話說,Linux內(nèi)核的內(nèi)存管理是怎么實現(xiàn)的?
    的頭像 發(fā)表于 09-04 14:28 ?585次閱讀
    <b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>的硬件結(jié)構(gòu)

    keil可以讀出單片機的程序嗎

    Keil是一款廣泛應(yīng)用于單片機程序開發(fā)的軟件,它提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案。然而,關(guān)于Keil是否能直接“讀出”單片機的程
    的頭像 發(fā)表于 09-02 10:32 ?1976次閱讀

    stm32單片機用什么軟件編程

    STM32單片機是一種廣泛應(yīng)用于嵌入式系統(tǒng)領(lǐng)域的微控制器,具有高性能、低功耗、豐富的外設(shè)接口等特點。要對STM32單片機進行編程,需要選擇合適的軟件工具。 概述 STM32單片機
    的頭像 發(fā)表于 09-02 10:16 ?3113次閱讀

    單片機中的幾種環(huán)形緩沖區(qū)的分析和實現(xiàn)

    單片機中的幾種環(huán)形緩沖區(qū)的分析和實現(xiàn)一、簡介環(huán)形緩沖區(qū)(RingBuffer)是一種高效的使用內(nèi)存的方法,它將一段固定長度的內(nèi)存看成一個環(huán)形結(jié)構(gòu),用于存儲數(shù)據(jù),能夠避免使用動態(tài)申請
    的頭像 發(fā)表于 08-14 08:39 ?1565次閱讀
    <b class='flag-5'>單片機</b>中的幾種環(huán)形緩沖區(qū)的分析和實現(xiàn)

    藍牙模塊如何實現(xiàn)單片機和手機端數(shù)據(jù)互傳

    藍牙模塊實現(xiàn)單片機和手機端數(shù)據(jù)互傳的過程可以分為以下幾個步驟: 硬件準備 : 確保你有一個支持藍牙通信的單片機開發(fā)板,如Arduino、Raspberry Pi等。 準備一個兼容的藍牙模塊
    的頭像 發(fā)表于 07-24 17:59 ?5219次閱讀
    藍牙<b class='flag-5'>模塊</b>如何實現(xiàn)<b class='flag-5'>單片機</b>和手機端數(shù)據(jù)互傳

    使用rt_malloc申請內(nèi)存空間失敗,顯示沒有內(nèi)存怎么解決?

    + net_server + crclib) 的情況下,還有2個堆棧空間2048的應(yīng)用線程,使用rt_malloc申請內(nèi)存空間失敗,顯示沒有內(nèi)存。經(jīng)測試,只能申請1200bytes 以下的內(nèi)
    發(fā)表于 07-04 08:10