μC/OS-II 内存的动态分配

μ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分区已满。

 在调用此函数时,一定要确保把该内存块释放到它原来所属的内存分区中,否则会引起灾难性的后果。

188

4.查询一个内存分区的状态

 191

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值