FreeRTOS笔记(十三)内存管理

上一文链接:FreeRTOS笔记(十二)资源管理


01 - 内存管理

  回顾一个最开初没有提问的问题,我们创建任务的时候,会生成一个TCB任务控制块,它需要在内存中占据一个空间,多任务中就会有多个TCB,谁给它们分配好空间?谁负责回收空间?一旦空间不够怎么办?
  任务需要被内核中不同的函数管理,所以肯定是使用全局变量或者静态变量,于是一个简单的回答是使用全局变量,每创建一个任务就存在一个全局变量,但是任务的创建是动态的,而全局变量的定义是静态的,并不能在系统运行期间再去定义一个全局变量,所以需要提前准备好一些全局变量(全局变量缓存池),当需要的时候就分配,这就是FreeRTOS的内存管理,它不是一个硬件,而是一个软件

Alt
  由于每一个单板的内存管理都可以不相同,所以FreeRTOS把内存管理归属到可移植层,由实际的情况去编写,同时FreeRTOS提供了若干个内存管理的范例,这些范例是通用的,使用纯C语言编写,与硬件无关,范例中提前准备好的全局变量是一个全局静态数组static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];,在head_x.c(x是数字)中,作用域只能是heap_x.c文件内,生存期是程序开始到结束,所以只能使用pvPortMalloc()返回ucHeap中某个位置的地址,使用指针间接访问

#if( configAPPLICATION_ALLOCATED_HEAP == 1 )
	extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
#else
	static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];

02 - 范例

  查看源码就可以知道每一个范例的内存管理算法、管理方式等,小白使用Sv9.0.0版本的FreeRTOS,提供了5个范例,区别如下
FreeRTOS版本:Sv9.0.0

范例算法分配方式释放方式优点缺点代码量(行)
head_1.c顺序分配,首次适应算法每次都从ucHeap数组中顺序切割内存分配确定,没有内存碎片内存不可重用185
head_2.c顺序分配,最佳适应算法每次从空闲链表中找一个大小最合适的内存把释放的内存有序地插入一个从小到大排序的空闲链表内存可重用,分配效率高大块内存得不到分配,相邻的空闲内存不会合并,存在内存碎片314
head_3.cstblib库决定调用了malloc()调用了free()内存管理由编译器决定代码量可能大大增加,内存分配不确定136
head_4.c顺序分配,最佳适应算法同head_2.c同head_2.c,另外合并相邻的空闲内存同head_2.c,另外限制了内存碎片,相邻空闲内存得到合并大块内存得不到分配477
head_5.c离散分配head_4.c,但是允许跨越不同的内存段同head_4.c同head_4.c,另外大块内存得分配分配和释放速度较慢526

03 - 总结

  • 内存动态分配的本质是在全局变量缓存池中取出全局变量
  • 内存碎片越少、使用效率越高,则分配和释放的速度越慢
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值