ucosiii中的内存管理OS_MEM

2016-05-23 22:27 阅读 457 次 评论 0 条

在程序编写时,有数据需要缓存不想占用太多的存储空间,想用到ucos中的memory mangement(内存管理)。

ucos的内存管理是对ANSI C中的malloc()与free()的一个补充,有点有两个分配和释放存储器的时间比malloc要短,且时间固定,可以测量;第二个不会产生内存碎片(fragmentation)。

OSMEM只支持分配相同大小的RAM blocks,一个内存分区只能包含整数个RAM blocks。内存分区基本上就是一个大数组。

ucos中可以包含多个内存分区,每个内存分区本身可以不同大小,内存分区内的blocks也可以是不同大小。

image

OSMEM的使用过程,先通过OSMemCreate()建立内存分区,并且分配OS_MEM变量的存储空间,并且分配内存分区的空间(如MyPartitionStorage[12][100])。尽管在ucos的文档中,还支持通过malloc为OS_MEM与内不能分区分配空间的方法,但是个人不推荐,因为在嵌入式开发中,malloc在heap段上分配空间,这个空间一直不会释放,相当于占用了程序的heap size,而heap size一般是由用户手动分配的,设置不好可能会溢出。而静态数组是在.bss段,在程序编译时分配了大小,在程序运行时,会自动分配相应的大小。

在ucos中,考虑在内存blocks分配完毕的情况下,继续申请内存blocks,可以增加计数信号量(counting semaphore),而信号量的初始计数应该是blocks的个数,工作方式如下图所示。这个用法值得推荐。

image

PS:OSMemGet() 与OSMemPut()运行时间很快,可以在中断函数中调用。

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:ucosiii中的内存管理OS_MEM | 起点博客
分类:应用笔记 标签:

发表评论


表情