μC/OS-II 改进了ANSIC用来动态分配和释放内存的函数malloc()和free(),使它们可以对大小固定的内存块进行操作,从而使函数malloc()和free()的执行时间成为可确定的,满足了实时操作系统的要求。
一、内存控制块
μC/OS-II对内存进行两级管理,即把一个大片连续的内存空间分成了若干个分区,每个分区又分成了若干个大小相同的内存块来进行管理。操作系统以分区为单位来管理动态内存,而任务以内存块为单位来获得和释放动态内存。内存分区及内存块的使用情况由内存控制块来记录。
1.可动态分配内存的划分
μC/OS-II要求同一个分区内的内存块的字节数必须相等,而且每个分区与该分区内存块的数据类型必须相同。只需要定义一个二维数组,每个一维数组就是一个内存块。这样的定义只是划分出了分区和控制块,还不是一个真正的可以动态分配的内存区。只有将内存控制块与分区关联起来之后,系统才能对其进行相应的管理,它才是一个真正的动态内存区。
2.内存控制块OS_MEM的结构
系统给每个内存分区定义了一个内存控制块的数据结构,用来记录和跟踪每一个内存分区的状态。
- OSMemAddr:内存分区的指针
- OSMemFreeList:内存控制块链表的指针
- OSMemBlkSize:内存块的长度
- OSMemNBlks:分区内内存块的数目
- OSMemNFree:分区内当前可分配的内存块数目
3.空内存控制块链表
与其他控制块一样,在系统初始化时,会调用内存控制块的初始化函数OS_MemInit()定义并初始化一个空内存控制块链表。在这个空内存控制块链表中,一共有OS_MAX_MEM_PART个空内存控制块。每当需要创建一个内存分区时,就会从空内存控制快立案表中摘取一个控制块,把链表的头指针指向下一个空内存控制块。
二、动态内存的管理
1.创建动态内存分区
2.请求获得一个内存块
通过调用OSMemGet()向某内存分区请求获得一个内存块。返回值是所请求的内存块的指针。
程序在调用此函数时,应该事先知道分区中内存块的大小,并且使用该内存块时不能超出其长度,否则会引起灾难性的后果。当应用程序不再需要该内存块时,必须及时释放。
3.释放一个内存块
返回值是错误信息,如果调用不成功,则返回OS_MEM_INVAILD_PMEM控制块指针为空指针;OS_INVAILD_PBLK释放内存块指针为空指针,OS_MEN_FULL分区已满。
在调用此函数时,一定要确保把该内存块释放到它原来所属的内存分区中,否则会引起灾难性的后果。