91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

FPGA之家 ? 來(lái)源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2021-06-25 08:54 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本次給大家分享一位大佬寫(xiě)的應(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)存都比較小,而且沒(mé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ū)別如。

算法原理:」

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

mem_malloc測(cè)試驗(yàn)證下面以小熊派IOT開(kāi)發(fā)板來(lái)做實(shí)驗(yàn)。

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

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

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

這份代碼在不同編譯器下編譯情況不同。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ò)代碼修改如:

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

再次編譯就正常了。

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

暫不貼出,感興趣的小伙伴可以在上面的倉(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”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); // 給申請(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)存塊重新寫(xiě)入0xf0+i的數(shù)據(jù)

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

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

test_free(i);

}

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

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

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

編輯:jq

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

    關(guān)注

    15

    文章

    1618

    瀏覽量

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

    關(guān)注

    30

    文章

    4967

    瀏覽量

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

    關(guān)注

    0

    文章

    92

    瀏覽量

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

    關(guān)注

    190

    文章

    4395

    瀏覽量

    208486
  • malloc
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    383

原文標(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)推薦
    熱點(diǎn)推薦

    小白也能聽(tīng)懂的單片機(jī)知識(shí)路徑

    什么是單片機(jī)? 單片機(jī),全稱單片微型計(jì)算機(jī),是一種集CPU、內(nèi)存、輸入輸出接口等部件于一體的微型計(jì)算機(jī)系統(tǒng)。它能夠獨(dú)立執(zhí)行程序,完成特定的控制或計(jì)算任務(wù),廣泛
    發(fā)表于 02-04 16:44

    單片機(jī)mcu模塊,mcu單片機(jī)是什么意思,32位mcu單片機(jī)解析

    輸入輸出接口以及定時(shí)計(jì)數(shù)器等模塊。憑借體積小巧、功耗較低、成本經(jīng)濟(jì)等優(yōu)勢(shì),MCU廣泛應(yīng)用于家用電器、汽車電子、工業(yè)控制、智能設(shè)備等眾多場(chǎng)景,實(shí)現(xiàn)對(duì)設(shè)備的精準(zhǔn)控制與功能管理。
    的頭像 發(fā)表于 01-19 15:30 ?506次閱讀
    <b class='flag-5'>單片機(jī)</b>mcu<b class='flag-5'>模塊</b>,mcu<b class='flag-5'>單片機(jī)</b>是什么意思,32位mcu<b class='flag-5'>單片機(jī)</b>解析

    單片機(jī)外設(shè)模塊速查表

    單片機(jī)開(kāi)發(fā)中,外設(shè)模塊幾乎是每個(gè)工程師的必修課。GPIO、ADC、UART、SPI……看似簡(jiǎn)單的模塊,如果使用不當(dāng),很容易踩坑。今天我們就來(lái)整理一份單片機(jī)外設(shè)
    的頭像 發(fā)表于 01-19 09:06 ?356次閱讀
    <b class='flag-5'>單片機(jī)</b>外設(shè)<b class='flag-5'>模塊</b>速查表

    單片機(jī)程序的執(zhí)行

    。 但是單片機(jī)上只有幾K的RAM,而flash一般有幾十K甚至1M,這個(gè)時(shí)候指令和數(shù)據(jù)都在內(nèi)存中嗎(這里指的內(nèi)存僅指RAM,因?yàn)镻C上我們常說(shuō)的內(nèi)存就是DDR RAM memory,
    發(fā)表于 12-04 06:20

    為什么單片機(jī)中很少使用malloc,而PC程序頻繁使用呢?

    使用動(dòng)態(tài)內(nèi)存分配的情況下,系統(tǒng)依然能夠保持一定的響應(yīng)時(shí)間。 內(nèi)存碎片問(wèn)題單片機(jī):動(dòng)態(tài)內(nèi)存分配(malloc)的最大問(wèn)題之一是
    發(fā)表于 11-20 06:55

    單片機(jī)的操作系統(tǒng)

    單片機(jī)操作系統(tǒng)主要分為實(shí)時(shí)操作系統(tǒng)(RTOS)和嵌入式操作系統(tǒng)兩類,以下是常見(jiàn)選擇: 實(shí)時(shí)操作系統(tǒng)(RTOS) ? FreeRTOS ?:輕量級(jí)開(kāi)源內(nèi)核(最小內(nèi)核約6 KB RAM),支持優(yōu)先級(jí)
    發(fā)表于 11-14 06:18

    rt_malloc_align函數(shù)內(nèi)存越界問(wèn)題怎么解決?

    ; } 代碼如上所示。 條件:align = 4,rt_malloc申請(qǐng)到的內(nèi)存地址為0x2000001,sizeof(void*) = 4 結(jié)果: align_ptr = 0x2000004 則
    發(fā)表于 09-22 08:30

    單片機(jī)原理及應(yīng)用詳解

    單片機(jī)(Microcontroller Unit, MCC) ?是一種集成計(jì)算機(jī)核心功能(CPU、存儲(chǔ)器、I/O接口等)的微型芯片,廣泛應(yīng)用于嵌入式系統(tǒng)中。以下是其原理及應(yīng)用的詳細(xì)介紹: 一、單片機(jī)
    的頭像 發(fā)表于 08-11 13:57 ?2260次閱讀

    單片機(jī)是由什么組成的

    單片機(jī)作為一種集成化的微型計(jì)算機(jī),其核心優(yōu)勢(shì)在于將多個(gè)功能模塊緊湊地集成在一塊芯片上,從而實(shí)現(xiàn)數(shù)據(jù)處理、外設(shè)控制等功能。了解單片機(jī)的組成部分,能幫助我們更好地理解其工作原理和應(yīng)用邏輯。 1.
    的頭像 發(fā)表于 07-29 11:03 ?1162次閱讀

    怎么測(cè)單片機(jī)系統(tǒng)頻率

    單片機(jī)系統(tǒng)頻率是指單片機(jī)工作時(shí)的時(shí)鐘頻率,它直接影響單片機(jī)的運(yùn)行速度和處理能力,準(zhǔn)確測(cè)量系統(tǒng)頻率對(duì)單片機(jī)應(yīng)用開(kāi)發(fā)、程序調(diào)試和性能優(yōu)化具有重要意義。測(cè)量
    的頭像 發(fā)表于 07-25 11:39 ?779次閱讀

    單片機(jī)怎么驅(qū)動(dòng)電機(jī)?

    在各類自動(dòng)化設(shè)備和智能裝置中,電機(jī)是重要的執(zhí)行部件,而單片機(jī)作為控制核心,需要通過(guò)特定的方式驅(qū)動(dòng)電機(jī)運(yùn)轉(zhuǎn)。單片機(jī)驅(qū)動(dòng)電機(jī)并非直接連接即可,而是要根據(jù)電機(jī)類型和功率,搭配合適的驅(qū)動(dòng)電路,才能實(shí)現(xiàn)穩(wěn)定
    的頭像 發(fā)表于 07-25 09:31 ?890次閱讀

    單片機(jī)怎么燒程序

    單片機(jī)燒程序是將編寫(xiě)好的程序代碼寫(xiě)入單片機(jī)內(nèi)部存儲(chǔ)單元,讓單片機(jī)按照預(yù)設(shè)邏輯工作的過(guò)程,是單片機(jī)應(yīng)用開(kāi)發(fā)中不可或缺的環(huán)節(jié)。無(wú)論是簡(jiǎn)單的燈光控制程序,還是復(fù)雜的工業(yè)控制算法,都需要通過(guò)燒
    的頭像 發(fā)表于 07-23 11:47 ?1241次閱讀

    給予單片機(jī)的溫度控制系統(tǒng)設(shè)計(jì)

    、執(zhí)行機(jī)構(gòu)、顯示模塊和電源模塊組成。單片機(jī)是系統(tǒng)的核心,負(fù)責(zé)處理溫度信息并發(fā)出控制指令;溫度傳感器用于實(shí)時(shí)采集環(huán)境或物體的溫度數(shù)據(jù),將物理量轉(zhuǎn)化為電信號(hào)傳輸給
    的頭像 發(fā)表于 07-16 10:57 ?661次閱讀

    單片機(jī)和伺服有什么區(qū)別

    : 1. 定義與功能 特性 單片機(jī)(Microcontroller) 伺服系統(tǒng)(Servo System) 定義 一種集成CPU、內(nèi)存、I/O接口的微型計(jì)算機(jī)芯片,用于控制設(shè)備。 一種由伺服電機(jī)、編碼器
    的頭像 發(fā)表于 05-26 09:18 ?846次閱讀