微控制器的動態記憶體管理 自己實現heap管理

2021-08-17 07:10:51 字數 1176 閱讀 6738

兩年前一位同事和我說過,微控制器不能實現動態記憶體管理,兩天後我在keil上利用malloc()在coterx m3晶元上實現了乙個鍊錶,然後把**給他看了,對固執的人擺事實好過講道理。

之後我覺得使用malloc()並不能滿足我的需求,然後想自己實現乙個heap管理。

這就是這篇文章的由來,這是我今天下午突然想到的一種簡單的方法,其實這很沒有意義,因為我能想到的東西,別人都已經做出來了。嗯,姑且當是乙個程式設計題的實現吧。

資料結構很簡單,就是先開闢乙個大陣列,然後將陣列分割,每個塊大小固定,我定義為16個位元組,每個塊用乙個位元組管理,然後記錄下有幾個塊沒有被使用。

malloc的實現,輸入形參和malloc一樣,就是記憶體需求大小,申請成功返回位址,不成功返回null。實現思想如下,先計算的出需要幾個記憶體塊,然後檢測剩餘記憶體塊是否足夠,如果足夠,再檢測是否連續,都滿足的話,將第乙個記憶體塊的管理單元賦值1,第二個賦值2,以此類推。然後將剩餘記憶體塊數量減去使用掉的數量,返回位址。

free的實現,輸入形參和free一樣,就是malloc獲得的位址,無返回。實現思想如下,先計算出位址相對heap起始位址的偏移,然後得出相應的記憶體管理單元,如果該記憶體管理單元為1,將該單元以下連續管理單元都清空,然後將剩餘記憶體塊加上相應的位址,返回。

這份**算是1.0版本,沒有dubug過,不建議使用。沒有debug的原因是沒有想到怎麼實現碎片管理的辦法,我想在2.0版本上面實現,這個姑且算是乙份偽**吧。如果誰有記憶體碎片管理演算法的一些想法的話,歡迎討論。

#include "string.h"

#define heap_qly 16

struct general_buf

heap_buf;

/* * 功能:通用快取初始化

* 輸入:無

* 輸入:無

* 返回:無

* 備註:

*/void heap_buffer_init(void)

/* * 功能:堆記憶體獲取函式

* 輸入:無

* 輸入:無

* 返回:無

* 備註:

*/void* my_malloc(uint32_t size)

}else

free_num=0; }

if(enought_space)

}

寫於2023年3月20日夜

深圳

微控制器add怎麼計算 51微控制器的記憶體對映(一)

51微控制器內部有256個位元組的ram空間,低128個位元組為工作暫存器組區 0x00h 0x1fh 位定址區 0x02h 0x2fh 通用ram區 0x30h 0x70h sfr寄存區 0x80 0xff 這段空間定義51微控制器所有的控制暫存器和狀態暫存器。下面我們就以上圖中自底向上的順序逐一...

c 動態記憶體的管理

我們都知道在c 中可以用new malloc動態分配記憶體空間用delete free釋放動態開闢的記憶體空間。c 中的malloc free是繼承c語言中的malloc free,它的用法和在c語言中的用法一模一樣。1.那麼既然c 中有了可以動態開闢記憶體的函式為什麼又要有new delete呢?...

C 動態記憶體管理及其與C語言動態記憶體管理的差別

在c語言中,我們常用malloc calloc realloc和free等函式來進行動態記憶體管理。但是在c 中,我們則需要用到某些操作符進行動態記憶體管理。new delete 動態管理物件 new delete 動態管理陣列 new delete 和 new delete 一定要匹配使用!否則會...