RTOS中动静结合的内存管理实现
时间:09-28
来源:3721RD
点击:
大块的内存分区中,一个任务申请了该空间,则该空间的一部分将跨越到另一个内存块,对该内存块的操作可能覆盖另一个内存块的数据。如果把一个大块放到了小块的分区中,则在分配的时候将分配了多余的空间,造成了内存空间的浪费。找到所 图2创建内存分区流程图属分区后,直接把该块放到该区空闲内存链表的尾部。
上述系统分区的方式其实是小范围动态分区上实现的静态方式。因为每个内存块大小是固定的,这样不可避免地要浪费一部分空间。对于这个问题的解决,系统还提供了一种纯动态的解决办法,就是调用malloc/free函数来申请内存块。
2.1.3 内存用户区的动态内存分配
从内存划分图中可以看到有一块用户内存区,这是一块内核不会使用的内存区。该区留给用户使用,对于这块区域的申请和释放不调用系统提供的Mem_Alloc/Mem_Free函数,而是直接调用c语言提供的malloc/free函数。malloc具有不确定性,因为它的执行时间和空闲内存块的数量有关,而且多次使用malloc/free调用和释放内存块,可能产生大量的内存碎片。所以这种方式的调用要谨慎。由于用户内存区大小是可配置的,所以用户可以控制该区大小以减少碎片产生的问题。同时对于系统调用,例如任务堆栈分配,不会因为碎片太多而导致分配失败的问题。
3. 小结
动静结合的方式给用户提供了比较大的自由度,用户可以从系统分区中申请内存块,也可以从用户内存区申请内存块。这样增加了系统的灵活性,同时也限制了大量碎片产生的可能(在不频繁删除建立系统内存分区的前提下)。也增加了部分c代码的可移植性。
- ucos-ii学习笔记——动态内存分配原理及使用(11-28)
- 程序的内存分配(11-27)
- 明晰C内存分配的五种方法的区别(05-13)
- 嵌入式实时系统中的优先级反转问题(06-10)
- 实时系统中混合任务集的动态电压调节算法(06-18)
- 嵌入式实时系统及其在通信系统中的应用(04-19)