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

来源:互联网 发布:mysql insert安装教程 编辑:程序博客网 时间:2024/06/08 18:32
在使用一个内存分区之前,必须先建立该内存分区。这个操作可以通过调用OSMemCreate()函数来完成。程序清单 L7.2说明了如何建立一个含有100个内存块、每个内存块32字节的内存分区。程序清单 L7.2 建立一个内存分区OS_MEM *CommTxBuf;INT8U    CommTxPart[100][32];void main (void){    INT8U err;    OSInit();    .    .    CommTxBuf = OSMemCreate(CommTxPart, 100, 32, &err);    .    .    OSStart();}程序清单 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)]。程序清单 L7.3 OSMemCreate()OS_MEM *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err){    OS_MEM  *pmem;    INT8U   *pblk;    void   **plink;    INT32U   i;    if (nblks < 2) {                                               (1)        *err = OS_MEM_INVALID_BLKS;        return ((OS_MEM *)0);    }    if (blksize < sizeof(void *)) {                                (2)        *err = OS_MEM_INVALID_SIZE;        return ((OS_MEM *)0);    }    OS_ENTER_CRITICAL();    pmem = OSMemFreeList;                                          (3)    if (OSMemFreeList != (OS_MEM *)0) {        OSMemFreeList = (OS_MEM *)OSMemFreeList->OSMemFreeList;    }    OS_EXIT_CRITICAL();    if (pmem == (OS_MEM *)0) {                                     (4)        *err = OS_MEM_INVALID_PART;        return ((OS_MEM *)0);    }    plink = (void **)addr;                                         (5)    pblk  = (INT8U *)addr + blksize;    for (i = 0; i < (nblks - 1); i++) {        *plink = (void *)pblk;        plink  = (void **)pblk;        pblk   = pblk + blksize;    }    *plink = (void *)0;    OS_ENTER_CRITICAL();    pmem->OSMemAddr     = addr;                                    (6)    pmem->OSMemFreeList = addr;    pmem->OSMemNFree    = nblks;    pmem->OSMemNBlks    = nblks;    pmem->OSMemBlkSize  = blksize;    OS_EXIT_CRITICAL();    *err   = OS_NO_ERR;    return (pmem);                                                 (7)}

0 0
原创粉丝点击