乙個簡單而強大的微控制器記憶體管理器 不帶記憶體碎片整理

2021-09-07 06:00:53 字數 1639 閱讀 2168

微控制器簡單記憶體管理器

本**基於無作業系統的stm32微控制器開發。功能強大。可申請到位址空間連續的不同大小的記憶體空間,且使用者介面簡單,使用方便

memory.h

#ifndef __memory_h__

#define __memory_h__

#include "stdio.h"

#include "string.h"

#include "includes.h"

//使用者使用

typedef struct

dmem;

//若返回空。則申請失敗

dmem *dynmemget(uint32_t size);

void dynmemput(dmem *pdmem);

#endif //__memory_h__

memory.c

#include "memory.h"

#define dmem_block_size 256 //記憶體塊大小為128位元組

#define dmem_block_num 20 //記憶體塊個數為40個

#define dmem_total_size (dmem_block_size*dmem_block_num) //記憶體總大小

typedef enum

dmem_used_item;

typedef struct

dmem_state;

static uint8_t dmemory[dmem_total_size];

static dmem_state dmems = ;

dmem *dynmemget(uint32_t size)

//申請記憶體不可超過總記憶體大小

if(size > dmem_total_size)

//申請記憶體不可超過剩餘記憶體大小

if(size > (dmem_block_num - dmems.blk_num) * dmem_block_size)

//申請表必須有空餘

//計算所需連續塊的個數

blk_num_want = (size + dmem_block_size - 1) / dmem_block_size;

//尋找申請表

for(loop = 0; loop < dmem_block_num; loop++)

}//沒有找到可用申請表,理論上是不會出現此現象的,申請表剩餘已在上面校驗

if(loop == dmem_block_num)

//尋找連續記憶體塊

for(loop = 0; loop < dmem_block_num; loop++)

}if(find >= blk_num_want)

dmems.blk_num += blk_num_want;

return user;

}else}}

//搜尋整個記憶體塊,未找到大小適合的空間

return null;

}void dynmemput(dmem *user)

//釋放記憶體空間

//釋放申請表

}

乙個鬧鐘的微控制器程式

乙個鬧鐘的微控制器程式。其中蜂鳴器接p37,我的微控制器數碼管是四位共陽數碼管,接p0和p2,k1接p14,k2接p15,k3接p16,k4接p17。晶振採用12mhz。stc89c52 file clock.c include const unsigned char led7code unsign...

乙個鬧鐘的微控制器程式

乙個鬧鐘的微控制器程式。其中蜂鳴器接p37,我的微控制器數碼管是四位共陽數碼管,接p0和p2,k1接p14,k2接p15,k3接p16,k4接p17。晶振採用12mhz。stc89c52 file clock.c include const unsigned char led7code unsign...

微控制器中段程式 微控制器中乙個程式的執行過程

微控制器中乙個程式的執行過程 微控制器中乙個程式的執行過程分為取指令,分析指令和執行指令幾個步 驟。取指令的任務是 根據程式計數器 pc中的值從程式儲存器讀出現行指 令,送到指令暫存器。分析指令階段的任務是 將指令暫存器中的指令操作碼取出後進行解碼,分析其指令性質。如指令要求運算元,則尋找運算元位址...