📄 osmemory.lst
字号:
C51 COMPILER V8.02 OSMEMORY 11/05/2004 10:43:36 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE OSMEMORY
OBJECT MODULE PLACED IN OSMemory.OBJ
COMPILER INVOKED BY: D:\C51\BIN\C51.EXE OSMemory.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /********************************************
2 嵌入式系统 小型操作系统
3 作者:汪普宏
4 制作日期:2006.9
5 *********************************************/
6 /**********************************************
7 二维数组动态管理
8 作者:汪普宏
9 制作日期:2006.10.31
10 模块功能:动态内存分配函数
11 模块接口:内存大小
12 调用者: 任何函数
13 返回值: 分配的内存地址指针
14 **********************************************/
15 #include "os.h"
16 #include "OS_Memory.h"
17 OS_MEM xdata mem[ALL/NUM];
18 uchar xdata memory[ALL/NUM][NUM];
19 /****************************************
20 函数功能:初始化数组内存
21 调用者:初始化函数
22 返回值: 无
23 *****************************************/
24
25 void OSInit_Malloc(void)
26 {
27 1 U16 i;
28 1 for(i=0;i<ALL/NUM;i++)
29 1 {
30 2 mem[i].bef=&mem[i-1];
31 2 mem[i].status=FREE; //内存状态为未分配
32 2 mem[i].size=ALL/NUM-i; //空闲内存长度
33 2 }
34 1 mem[0].bef=NULL;
35 1 mem[ALL/NUM].bef=NULL;
36 1 }
37 /****************************************
38 函数功能:分配内存
39 调用者:任务函数
40 入口参数:需要的内存字节长度
41 返回值: 成功时为数组首地址,否则为-1
42 *****************************************/
43 int OSMalloc(U16 lenth)
44 {
45 1 OS_MEM xdata *p;
46 1 U16 num,i,temp;
47 1 num=lenth/NUM;
48 1 if(lenth%NUM)
49 1 {
50 2 num++; //需要的内存块的个数
51 2 }
52 1 for(i=temp=0;i<ALL/NUM;)
53 1 {
54 2 p=&mem[i];
55 2 if(num>ALL/NUM-i) //需要的个数大于空闲内存总数
C51 COMPILER V8.02 OSMEMORY 11/05/2004 10:43:36 PAGE 2
56 2 {
57 3 return ERR;
58 3 }
59 2 if(p->status==FREE&&p->size>=num)
60 2 {
61 3 (p+temp)->size=p->size-num;
62 3 p->size=num;
63 3 p->bef=&mem[temp];
64 3 p->status=FULL;
65 3 return i; //返回合适的空闲内存首地址
66 3 }
67 2 temp=i;
68 2 i+=p->size;
69 2 }
70 1 return ERR;
71 1 }
72 /****************************************
73 函数功能:释放内存
74 调用者:任务函数
75 入口参数:释放的数组内存首地址
76 *****************************************/
77 uchar OSMem_Free(L16 i) //回收需要释放的内存
78 {
79 1 U16 temp;
80 1 U16 num=mem[i].size;
81 1 if(mem[i].status==FULL)
82 1 {
83 2 if(mem[i+num].status==FREE)
84 2 {
85 3 mem[i].size+=mem[i+num].size; //将该释放的内存与其后面连续的内存合并
86 3 mem[i+num].bef=mem[i].bef;
87 3 }
88 2 if(mem[i].bef->status==FREE)
89 2 {
90 3 mem[i].status=FREE; //将该处控制块改为空闲状态
91 3 if(i>0)
92 3 {
93 4 temp=mem[i].size;
94 4 while(i>=0&&mem[i].bef->status==FREE)
95 4 {
96 5 mem[i].bef->size+=temp; //将该释放的内存与其前面连续的内存合并
97 5 mem[i].bef=mem[i].bef->bef;
98 5 i-=mem[i].bef->size;
99 5 }
100 4 return OK;
101 4 }
102 3 }
103 2 mem[i].status=FREE; //将该处控制块改为空闲状态
104 2 return OK;
105 2 }
106 1 else
107 1 {
108 2 return NULL;
109 2 }
110 1 }
111
112
113
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 840 ----
C51 COMPILER V8.02 OSMEMORY 11/05/2004 10:43:36 PAGE 3
CONSTANT SIZE = ---- ----
XDATA SIZE = 3700 ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 8
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -