国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

mem_malloc代碼倉庫:

?

https://github.com/chenqy2018/mem_malloc

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

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

算法原理:」

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

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

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

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

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

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

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

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

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:」

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

下面對mem_malloc進行測試驗證。

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

#include “mem_malloc.h”char mem_id[10]={0}; // 10塊內存塊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(); // 打印內存信息

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(int i=0; i《10; i++) // 釋放所有內存塊內存,已釋放的不再重新釋放

test_free(i);

}

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

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

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

編輯:jq

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

    關注

    15

    文章

    1618

    瀏覽量

    82803
  • 代碼
    +關注

    關注

    30

    文章

    4967

    瀏覽量

    73954
  • MMU
    MMU
    +關注

    關注

    0

    文章

    92

    瀏覽量

    19216
  • IOT
    IOT
    +關注

    關注

    190

    文章

    4395

    瀏覽量

    208507
  • malloc
    +關注

    關注

    0

    文章

    53

    瀏覽量

    383

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    小白也能聽懂的單片機知識路徑

    什么是單片機單片機,全稱單片微型計算機,是一種集CPU、內存、輸入輸出接口等部件于一體的微型計算機系統。它能夠獨立執行程序,完成特定的控制或計算任務,廣泛
    發表于 02-04 16:44

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

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

    單片機外設模塊速查表

    單片機開發中,外設模塊幾乎是每個工程師的必修課。GPIO、ADC、UART、SPI……看似簡單的模塊,如果使用不當,很容易踩坑。今天我們就來整理一份單片機外設
    的頭像 發表于 01-19 09:06 ?362次閱讀
    <b class='flag-5'>單片機</b>外設<b class='flag-5'>模塊</b>速查表

    單片機程序的執行

    。 但是單片機上只有幾K的RAM,而flash一般有幾十K甚至1M,這個時候指令和數據都在內存中嗎(這里指的內存僅指RAM,因為PC上我們常說的內存就是DDR RAM memory,
    發表于 12-04 06:20

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

    使用動態內存分配的情況下,系統依然能夠保持一定的響應時間。 內存碎片問題單片機:動態內存分配(malloc)的最大問題之一是
    發表于 11-20 06:55

    單片機的操作系統

    單片機操作系統主要分為實時操作系統(RTOS)和嵌入式操作系統兩類,以下是常見選擇: 實時操作系統(RTOS) ? FreeRTOS ?:輕量級開源內核(最小內核約6 KB RAM),支持優先級
    發表于 11-14 06:18

    rt_malloc_align函數內存越界問題怎么解決?

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

    單片機原理及應用詳解

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

    單片機是由什么組成的

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

    怎么測單片機系統頻率

    單片機系統頻率是指單片機工作時的時鐘頻率,它直接影響單片機的運行速度和處理能力,準確測量系統頻率對單片機應用開發、程序調試和性能優化具有重要意義。測量
    的頭像 發表于 07-25 11:39 ?782次閱讀

    單片機怎么驅動電機?

    在各類自動化設備和智能裝置中,電機是重要的執行部件,而單片機作為控制核心,需要通過特定的方式驅動電機運轉。單片機驅動電機并非直接連接即可,而是要根據電機類型和功率,搭配合適的驅動電路,才能實現穩定
    的頭像 發表于 07-25 09:31 ?894次閱讀

    單片機怎么燒程序

    單片機燒程序是將編寫好的程序代碼寫入單片機內部存儲單元,讓單片機按照預設邏輯工作的過程,是單片機應用開發中不可或缺的環節。無論是簡單的燈光控制程序,還是復雜的工業控制算法,都需要通過燒
    的頭像 發表于 07-23 11:47 ?1254次閱讀

    給予單片機的溫度控制系統設計

    、執行機構、顯示模塊和電源模塊組成。單片機是系統的核心,負責處理溫度信息并發出控制指令;溫度傳感器用于實時采集環境或物體的溫度數據,將物理量轉化為電信號傳輸給
    的頭像 發表于 07-16 10:57 ?666次閱讀

    單片機和伺服有什么區別

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