建立一个内存分区,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
- 建立一个内存分区,OSMemCreate()
- UC/OS-II的内存管理OSMemCreate()分析
- 查询一个内存分区的状态,OSMemQuery()
- uC/OS-II内存管理之OSMemCreate()代码可读性的一点改进
- 内存分区
- 内存分区
- 内存分区
- 内存分区
- 内存分区
- 内存分区
- 内存分区
- 内存分区
- 内存分区
- 内存分区
- 内存分区
- 内存分区
- 建立虚拟分区
- DB2建立分区数据库
- 云与Web端技术资料集锦
- 利用alias自定义快捷命令
- Office2016、Project2016以及Visio2016下载、安装及激活心得
- 行内元素和块级元素
- Becoming a ScrumMaster
- 建立一个内存分区,OSMemCreate()
- Linux如何查看进程,杀死进程、启动进程、查看日期、等常用命令
- IPMI的相关说明
- L1-048. 矩阵A乘以B
- java基本数据类型和引用数据类型
- Android Studio中JNI NDK开发(一)
- CSS overflow 属性
- java equals重写判断一个类的两个对象(摘自java从入门到精通)
- Android中Notification的使用