1、西安邮电学院 计算机系,1,2018/7/7,嵌入式实时操作系统 C/OS-II,西安邮电学院-计算机系Tel: 85383409 (ZQL)Email: ,2018/7/7,西安邮电学院 计算机系,2,第6章 内存的动态分配,西安邮电学院 计算机系,3,2018/7/7,第6章 目录,1、 内存控制块2、 动态内存的管理,西安邮电学院 计算机系,4,2018/7/7,应用程序运行中有时需要临时用到一些内存资源,操作系统应能提供相应的 “动态内存分配” 管理功能(举例见下页)。uC/OS-II 支持动态内存分配管理。本章主要内容:,uC/OS-II动态内存管理方式;内存分区与内存控制块;动态内
2、存管理系统函数;,西安邮电学院 计算机系,5,2018/7/7,例如:消息队列应用中的 “消息缓冲区” 通常就是用 “动态分配的存储块” 实现。,西安邮电学院 计算机系,6,2018/7/7,第6章 目录,1、 内存控制块2、 动态内存的管理,西安邮电学院 计算机系,7,2018/7/7,6.1 内存控制块,uC/OS-II中将连续的大块内存按分区来管理,称之为 “内存分区”。分区由若干个体积相等、类型一致的 “内存块” 组成。uC/OS-II系统配置文件(OS_CFG.H)中的 OS_MEM_EN 用于“使能/禁能” 动态内存的功能支持。uC/OS-II使用 “内存控制块” (MCB)具体管
3、理内存分区以及分区中的内存块,分区与MCB有 “一对一” 的关系。,西安邮电学院 计算机系,8,2018/7/7,6.1 内存控制块,ECM 是一个下述的数据结构:,typedef struct void *OSMemAddr; void *OSMemFreeList; INT32U OSMemBlkSize; INT32U OSMemNBlks; INT32U OSMemNFree; OS_MEM ;,备注:OS_MEM 是 uC/OS-II 的系统管理资源,对用户几乎透明;在使用中,用户不必对其直接操作,用户通过系统函数管理动态内存。,西安邮电学院 计算机系,9,2018/7/7,6.1
4、内存控制块,内存中建立分区和内存块的方法:,声明一个二位数组;使用系统函数直接创建动态分区即可;,INT8U M_BLK 3080; 备注: 准备建立一个含有 30 个动态存储块,每个存储块具有 80 个 INT8U 数据类型单元的内存分区。,西安邮电学院 计算机系,10,2018/7/7,第6章 目录,1、 内存控制块2、 动态内存的管理,西安邮电学院 计算机系,11,2018/7/7,6.2 动态内存的管理,用户通过使用uC/OS-II提供的系统函数来使用、管理动态内存:,OSMemCreate( ) - 创建动态内存分区;OSMemGet( ) - 从指定分区获得一个内存块;OSMemP
5、ut( ) - 将内存块归还指定分区;,西安邮电学院 计算机系,12,2018/7/7,6.2 动态内存的管理,创建动态内存分区 - OSMemCreate( ),在使用一个内存分区之前,首先要使用OSMemCreate( )函数建立该分区;该系统函数的原型:,OS_MEM *OSMemCreate(void *addr,/内存分区指针INT32U nblks,/分区中的内存块总数INT32U blksize,/内存块大小INT8U *err/出错信息);,备注:函数正常返回一个 “内存分区控制块” 指针;否则,返回一个 NULL 指针。,西安邮电学院 计算机系,13,2018/7/7,6.2
6、 动态内存的管理,创建动态内存分区 - OSMemCreate( ) 举例:,OS_MEM *CommTxBuf;/声明内存控制块指针INT8U CommTxPart3080;/声明内存控制块格式void main (void) INT8U *err; OSInit( ); ; CommTxBuf = OSMemCreate(CommTxPart,30,80,err); ; OSStart( );,西安邮电学院 计算机系,14,2018/7/7,6.2 动态内存的管理,从指定分区获得一个内存块 - OSMemGet( ),创建了内存分区之后,既可以使用OSMemGet( )函数从指定分区获得一
7、个内存块;该系统函数的原型:,void *OSMemGet(OS_MEM *pmem,/内存分区控制块指针INT8U *err/出错信息);,备注:函数正常返回一个 “内存块” 指针;否则,返回一个 NULL 指针。在使用申请到的内存块时,切勿越界。用完后要及时归还。,西安邮电学院 计算机系,15,2018/7/7,6.2 动态内存的管理,从指定分区获得一个内存块 - OSMemGet( ) 举例:,OS_MEM *CommTxBuf;INT8U CommTxPart3080;INT8U err;INT8U *BlkPtr;void main (void) ; OSInit( ); ; Com
8、mTxBuf = OSMemCreate(CommTxPart,30,80,void MyTask(void *pdata) ; for (;) ; BlkPtr = OSMemGet(CommTxBuf, /使用内存块 BlkPtr ,西安邮电学院 计算机系,16,2018/7/7,6.2 动态内存的管理,将内存块归还制定分区 - OSMemPut( ),在一个内存块使用后,应使用OSMemPut( )函数尽快将内存块归还相应分区;该系统函数的原型:,INT8U OSMemPut(OS_MEM *pmem,/内存分区控制块指针void *pblk/欲归还的内存块指针);,备注:函数正常返回一
9、个 OS_NO_ERR;特别注意,在归还内存块时,要用户确认归属无误!切勿张冠李戴!,西安邮电学院 计算机系,17,2018/7/7,6.2 动态内存的管理,将内存块归还制定分区 - OSMemPut( )举例:,OS_MEM *CommTxBuf;INT8U CommTxPart3080;INT8U err;INT8U *BlkPtr;void main (void) ; OSInit( ); ; CommTxBuf = OSMemCreate(CommTxPart,30,80,void MyTask(void *pdata) ; for (;) BlkPtr = OSMemGet(CommTxBuf, ,西安邮电学院 计算机系,18,2018/7/7,6.3 动态内存的管理-实例,