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

📄 os_mem.lst

📁 keil开发环境
💻 LST
📖 第 1 页 / 共 2 页
字号:
                  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 + -