📄 os_mem.lst
字号:
if (ThisFreeMem != NULL)
{
if ((ThisFreeMem->Size) < (Size + sizeof(struct _FreeMem)))
{
/* 分配后剩余内存太小则整块自由内存分配出去 */
/* 即在双向链表中删除这个节点 */
if (ThisFreeMem->Next != NULL)
{
(ThisFreeMem->Next)->Last = ThisFreeMem->Last;
}
if (ThisFreeMem->Last)
{
(ThisFreeMem->Last)->Next = ThisFreeMem->Next;
}
Size = ThisFreeMem->Size;
Rt = (struct _UsingMem xdata *)(ThisFreeMem);
}
else
{
/* 否则从自由内存块的高地址端分配一块内存 */
/* 即仅仅调整这个节点的内容 */
ThisFreeMem->Size -= Size;
Rt = (struct _UsingMem xdata *)((uint8 xdata *)ThisFreeMem +
ThisFreeMem->Size);
}
#if EN_OS_MEM_CHK > 0
Rt->HeadChk = 0xa55a;
Rt->EndChk = 0x5aa5;
#endif
Rt->Size = Size;
OS_EXIT_CRITICAL();
return ( void *)((uint8 xdata *)Rt + sizeof(struct _UsingMem));
}
else
{
OS_EXIT_CRITICAL();
C51 COMPILER V7.10 OS_MEM 07/02/2005 23:47:36 PAGE 4
return NULL;
}
}
/*********************************************************************************************************
** 函数名称: OSMemFree
** 功能描述: 把由OSMemNew分配的空间归还给系统
** 输 入: Addr: 由指OSMemNew返回的指针
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#ifndef EN_OS_MEM_FREE
#define EN_OS_MEM_FREE 1
#endif
#if EN_OS_MEM_FREE > 0
void OSMemFree(void xdata *Addr) reentrant
{
struct _FreeMem xdata *ThisFreeMem;
struct _UsingMem xdata *UserMem;
unsigned int Size;
OS_ENTER_CRITICAL();
ThisFreeMem = OSFreeMem;
/* 找到内存块的开始位置 */
UserMem = (struct _UsingMem xdata *)((uint8 xdata *)Addr -
sizeof(struct _UsingMem));
#if EN_OS_MEM_CHK > 0
if (UserMem->HeadChk != 0xa55a || UserMem->EndChk != 0x5aa5)
{
UserMemChkErr(Addr);
OS_EXIT_CRITICAL();
return;
}
#endif
/* 查找这块内存应当在双向链表中插入的位置 */
/* 双向链表以内存块首地址的大小顺序为节点的链接顺序 */
while (1)
{
if (ThisFreeMem > (struct _FreeMem xdata *)UserMem)
{
ThisFreeMem = ThisFreeMem->Last;
break;
}
if (ThisFreeMem->Next == NULL)
{
break;
}
ThisFreeMem = ThisFreeMem->Next;
}
C51 COMPILER V7.10 OS_MEM 07/02/2005 23:47:36 PAGE 5
if (((uint8 xdata *)ThisFreeMem + (ThisFreeMem->Size)) == (uint8 xdata *)UserMem)
{
/* 回收的内存块与这一个自由内存块相邻,则直接修改这个节点内容 */
ThisFreeMem->Size += UserMem->Size;
}
else
{
/* 否则插入一个节点 */
Size = UserMem->Size;
((struct _FreeMem xdata *)UserMem)->Last = ThisFreeMem;
((struct _FreeMem xdata *)UserMem)->Next = ThisFreeMem->Next;
((struct _FreeMem xdata *)UserMem)->Size = Size;
ThisFreeMem->Next = (struct _FreeMem xdata *)UserMem;
ThisFreeMem = (struct _FreeMem xdata *)UserMem;
if (ThisFreeMem->Next != NULL)
{
(ThisFreeMem->Next)->Last = ThisFreeMem;
}
}
if (((uint8 xdata *)ThisFreeMem + (ThisFreeMem->Size)) ==
(uint8 xdata *)(ThisFreeMem->Next))
{
/* 如果这两个内存块相邻,则合并之 */
ThisFreeMem->Size += (ThisFreeMem->Next)->Size;
ThisFreeMem->Next = (ThisFreeMem->Next)->Next;
if(ThisFreeMem->Next != NULL)
{
(ThisFreeMem->Next)->Last = ThisFreeMem;
}
}
OS_EXIT_CRITICAL();
return;
}
#endif
#endif
278 /*********************************************************************************************************
279 ** End Of File
280 ********************************************************************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = ---- ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
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 + -