0422

来源:互联网 发布:网络通信工程师培训 编辑:程序博客网 时间:2024/06/07 11:55

建立一个内存分区,OSMemCreate()

  1. 在使用一个内存分区之前,必须先建立该内存分区。这个操作可以通过调用OSMemCreate()函数来完成。程序清单 L7.2说明了如何建立一个含有100个内存块、每个内存块32字节的内存分区。  
  2.   
  3. 程序清单 L7.2 建立一个内存分区  
  4. OS_MEM *CommTxBuf;  
  5. INT8U    CommTxPart[100][32];  
  6.   
  7.   
  8. void main (void)  
  9. {  
  10.     INT8U err;  
  11.   
  12.   
  13.     OSInit();  
  14.     .  
  15.     .  
  16.     CommTxBuf = OSMemCreate(CommTxPart, 100, 32, &err);  
  17.     .  
  18.     .  
  19.     OSStart();  
  20. }  
  21.   
  22. 程序清单 L7.3是OSMemCreate()函数的源代码。该函数共有4个参数:内存分区的起始地址、分区内的内存块总块数、每个内存块的字节数和一个指向错误信息代码的指针。如果OSMemCreate()操作失败,它将返回一个NULL指针。否则,它将返回一个指向内存控制块的指针。对内存管理的其它操作,象OSMemGet(),OSMemPut(),OSMemQuery()函数等,都要通过该指针进行。每个内存分区必须含有至少两个内存块[L7.3(1)],每个内存块至少为一个指针的大小,因为同一分区中的所有空闲内存块是由指针串联起来的[L7.3(2)]。接着,OSMemCreate()从系统中的空闲内存控制块中取得一个内存控制块[L7.3(3)],该内存控制块包含相应内存分区的运行信息。OSMemCreate()必须在有空闲内存控制块可用的情况下才能建立一个内存分区[L7.3(4)]。在上述条件均得到满足时,所要建立的内存分区内的所有内存块被链接成一个单向的链表[L7.3(5)]。然后,在对应的内存控制块中填写相应的信息[L7.3(6)]。完成上述各动作后,OSMemCreate()返回指向该内存块的指针。该指针在以后对内存块的操作中使用[L7.3(6)]。  
  23.   
  24. 程序清单 L7.3 OSMemCreate()  
  25. OS_MEM *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err)  
  26. {  
  27.     OS_MEM  *pmem;  
  28.     INT8U   *pblk;  
  29.     void   **plink;  
  30.     INT32U   i;  
  31.   
  32.   
  33.     if (nblks < 2) {                                                (1)  
  34.         *err = OS_MEM_INVALID_BLKS;  
  35.         return ((OS_MEM *)0);  
  36.     }  
  37.     if (blksize < sizeof(void *)) {                                  (2)  
  38.         *err = OS_MEM_INVALID_SIZE;  
  39.         return ((OS_MEM *)0);  
  40.     }  
  41.     OS_ENTER_CRITICAL();  
  42.     pmem = OSMemFreeList;                                             (3)  
  43.     if (OSMemFreeList != (OS_MEM *)0) {  
  44.         OSMemFreeList = (OS_MEM *)OSMemFreeList->OSMemFreeList;  
  45.     }  
  46.     OS_EXIT_CRITICAL();  
  47.     if (pmem == (OS_MEM *)0) {                                       (4)  
  48.         *err = OS_MEM_INVALID_PART;  
  49.         return ((OS_MEM *)0);  
  50.     }  
  51.     plink = (void **)addr;                                           (5)  
  52.     pblk  = (INT8U *)addr + blksize;  
  53.     for (i = 0; i < (nblks - 1); i++) {  
  54.         *plink = (void *)pblk;  
  55.         plink  = (void **)pblk;        pblk   = pblk + blksize;  
  56.     }  
  57.     *plink = (void *)0;  
  58.     OS_ENTER_CRITICAL();  
  59.     pmem->OSMemAddr     = addr;                                      (6)  
  60.     pmem->OSMemFreeList = addr;  
  61.     pmem->OSMemNFree    = nblks;  
  62.     pmem->OSMemNBlks    = nblks;  
  63.     pmem->OSMemBlkSize  = blksize;  
  64.     OS_EXIT_CRITICAL();  
  65.     *err   = OS_NO_ERR;  
  66.     return (pmem);                                                   (7)  
  67. }

0 0
原创粉丝点击