📄 osmemory.c
字号:
/********************************************
嵌入式系统 小型操作系统
作者:汪普宏
制作日期:2006.9
*********************************************/
/**********************************************
二维数组动态管理
作者:汪普宏
制作日期:2006.10.31
模块功能:动态内存分配函数
模块接口:内存大小
调用者: 任何函数
返回值: 分配的内存地址指针
**********************************************/
#include "os.h"
#include "OS_Memory.h"
OS_MEM xdata mem[ALL/NUM];
uchar xdata memory[ALL/NUM][NUM];
/****************************************
函数功能:初始化数组内存
调用者:初始化函数
返回值: 无
*****************************************/
void OSInit_Malloc(void)
{
U16 i;
for(i=0;i<ALL/NUM;i++)
{
mem[i].bef=&mem[i-1];
mem[i].status=FREE; //内存状态为未分配
mem[i].size=ALL/NUM-i; //空闲内存长度
}
mem[0].bef=NULL;
mem[ALL/NUM].bef=NULL;
}
/****************************************
函数功能:分配内存
调用者:任务函数
入口参数:需要的内存字节长度
返回值: 成功时为数组首地址,否则为-1
*****************************************/
int OSMalloc(U16 lenth)
{
OS_MEM xdata *p;
U16 num,i,temp;
num=lenth/NUM;
if(lenth%NUM)
{
num++; //需要的内存块的个数
}
for(i=temp=0;i<ALL/NUM;)
{
p=&mem[i];
if(num>ALL/NUM-i) //需要的个数大于空闲内存总数
{
return ERR;
}
if(p->status==FREE&&p->size>=num)
{
(p+temp)->size=p->size-num;
p->size=num;
p->bef=&mem[temp];
p->status=FULL;
return i; //返回合适的空闲内存首地址
}
temp=i;
i+=p->size;
}
return ERR;
}
/****************************************
函数功能:释放内存
调用者:任务函数
入口参数:释放的数组内存首地址
*****************************************/
uchar OSMem_Free(L16 i) //回收需要释放的内存
{
U16 temp;
U16 num=mem[i].size;
if(mem[i].status==FULL)
{
if(mem[i+num].status==FREE)
{
mem[i].size+=mem[i+num].size; //将该释放的内存与其后面连续的内存合并
mem[i+num].bef=mem[i].bef;
}
if(mem[i].bef->status==FREE)
{
mem[i].status=FREE; //将该处控制块改为空闲状态
if(i>0)
{
temp=mem[i].size;
while(i>=0&&mem[i].bef->status==FREE)
{
mem[i].bef->size+=temp; //将该释放的内存与其前面连续的内存合并
mem[i].bef=mem[i].bef->bef;
i-=mem[i].bef->size;
}
return OK;
}
}
mem[i].status=FREE; //将该处控制块改为空闲状态
return OK;
}
else
{
return NULL;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -