目的
学习和理解实时操作系统
声明
习题答案是笔者基于相关书籍和网上内容自己理解的,有不对或疑问的地方大家一起沟通
硬件平台
Arm-CortexM3内核
一.什么叫内存分区?什么叫内存块?内存分区和内存块之间有什么关系?
内存分区:操作系统进行管理的基本内存单元
内存块:申请和释放内存的基本单元
关系:内存分区,有若干内存块构成
二.同一个分区的内存块是按什么组织起来的?
通过内存块中单向链表的方式组织起来的,详见下图:
上图中的实现非常巧妙,具体代码如下:
具体实现思想:
空闲块关联:空闲内存块前4个byte存储下一个空闲内存块,直到所有的内存块被链接完,最后一个空闲内存块前4个byte存储空地址表示结束。
内存申请:取第一个空闲块返回给应用,同时OSMemFreeList指向下一个空闲块
内存释放:将当前内存块挂载到空闲内存块链表上(空闲内存块链表头部)
注:OSMemFreeList指向当前空闲内存块,其存储的内容是下一个空闲内存块的地址
三.什么叫内存控制块?内存控制块都记录了什么信息?
内存控制块:用来管理内存分区中内存块的数据结构
内存控制块成员:1>内存分区首地址;2>空闲块链表首地址;3>内存块总数;4>空闲块总数;5>空闲块大小(单位byte),详见如下数据结果:
四.设计一个有两个任务的应用程序,其中一个任务用来进行两个加数的运算,另一个任务用来显示结果,要求把加法运算的结果存放到动态内存当中。
实现方法:
1>创建一个信号量,实现两个任务的同步,即任务0计算出结果后,任务1才能得到显示的结果
2>申请一块动态内存,加数运算的结果。
关键代码:
验证结果:
总结
该内存管理只是确保申请内存的实时性(申请和释放内存时间是一样的),应用性差;
由于是固定内存块大小,申请和释放内存都是对内存块进行操作,不存在内存碎片概念