⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 osmemory.c

📁 MCS-51的一个小型操作系统,在KeilC中大模式下编译工作
💻 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 + -