📄 os_mem.lst
字号:
C51 COMPILER V7.10 OS_MEM 07/02/2005 23:47:36 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE OS_MEM
OBJECT MODULE PLACED IN .\OS_MEM.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE ..\OS\OS_MEM.C BROWSE PRINT(.\OS_MEM.lst) OBJECT(.\OS_MEM.obj)
line level source
1 /*********************************************************************************************************
2 ** Small RTOS(51)
3 ** The Real-Time Kernel(For Keil c51)
4 **
5 ** (c) Copyright 2002-2003, chenmingji
6 ** All Rights Reserved
7 **
8 ** V1.20.0
9 **
10 **
11 **--------------文件信息--------------------------------------------------------------------------------
12 **文 件 名: OS_mem.c
13 **创 建 人: 陈明计
14 **最后修改日期: 2003年8月3日
15 **描 述: 内存动态分配模块,可以在非Small RTOS(51)下使用。在Small RTOS(51)
16 ** 下必须配置为支持重入栈。
17 **--------------历史版本信息----------------------------------------------------------------------------
18 ** 创建人: 陈明计
19 ** 版 本: V1.20.0
20 ** 日 期: 2003年8月3日
21 ** 描 述: 原始版本
22 **
23 **------------------------------------------------------------------------------------------------------
24 **--------------当前版本修订------------------------------------------------------------------------------
25 ** 修改人:
26 ** 日 期:
27 ** 描 述:
28 **
29 **------------------------------------------------------------------------------------------------------
30 ********************************************************************************************************/
31 #define IN_OS_MEM
32 #include "config.h"
33
34 #ifndef EN_OS_MEM
#define EN_OS_MEM 0
#endif
37
38 #if EN_OS_MEM > 0
static struct _FreeMem xdata *OSFreeMem; /* 自由内存块的双向链表的头 */
/*********************************************************************************************************
** 函数名称: UserMemChkErr
** 功能描述: 内存回收时出错处理函数,将EN_UserMemChkErr定义为1时,用户可以自己定义这个函数。
** 输 入: Addr: 应当回收的内存块
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
C51 COMPILER V7.10 OS_MEM 07/02/2005 23:47:36 PAGE 2
********************************************************************************************************/
#if EN_OS_MEM_CHK > 0 && EN_UserMemChkErr == 0
void UserMemChkErr(void xdata *Addr) reentrant
{
Addr = Addr;
while (1);
}
#endif
/*********************************************************************************************************
** 函数名称: OSMemInit
** 功能描述: 初始化动态内存分配模块。
** 输 入: Addr: 指向空闲空间起始位置的指针
** MemSize: 空闲空间的大小
** 输 出: TRUE: 成功
** FALSE: 失败
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSMemInit(void xdata *Addr, unsigned int MemSize)
{
struct _FreeMem xdata *MemFree;
MemSize = MemSize & ~(sizeof(int) - 1); /* 内存按照字(word)为单位分配 */
/* 调整MemSize为字(word)的整数倍 */
/* 判断自由空间是否有效 */
if (Addr != NULL && MemSize > sizeof(struct _UsingMem))
{
/* 建立只有一个节点的双向队列 */
OS_ENTER_CRITICAL();
MemFree = (struct _FreeMem xdata *)Addr;
OSFreeMem = MemFree;
MemFree->Size = MemSize;
MemFree->Next = NULL;
MemFree->Last = NULL;
OS_EXIT_CRITICAL();
return TRUE;
}
else
{
return FALSE;
}
}
/*********************************************************************************************************
** 函数名称: OSMemNew
** 功能描述: 分配内存。
** 输 入: Size: 所需内存的大小
** 输 出: 指向已分配的内存开始的地址的指针,NULL为失败。
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年8月3日
C51 COMPILER V7.10 OS_MEM 07/02/2005 23:47:36 PAGE 3
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void xdata *OSMemNew(unsigned int Size) reentrant
{
struct _FreeMem xdata *ThisFreeMem;
struct _UsingMem xdata *Rt;
OS_ENTER_CRITICAL();
ThisFreeMem = OSFreeMem;
/* 调整应当分配的大小(必须为字(word))的整数倍,且要加入分配给头的空间 */
Size = ((Size + sizeof(int) - 1) & ~(sizeof(int) - 1)) +
sizeof(struct _UsingMem);
/* 查找足够大的自由内存块 */
while(ThisFreeMem != NULL)
{
if ((ThisFreeMem->Size) >= Size)
{
break;
}
ThisFreeMem = ThisFreeMem->Next;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -