- 在使用一个内存分区之前,必须先建立该内存分区。这个操作可以通过调用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)
- }
0422
最新推荐文章于 2021-11-10 10:30:25 发布