电子说
ucos内存管理方法十分小巧,实时性好,非常值得借鉴。大致原理如下:
ucos把内存初始化成相同大小的内存块,使用单向链表的方式连接起来,使用时从链表摘下,释放时重新插入链表。
当然可以存在多条链表,根据用户需求配置,同一个链表内内存块是相同大小的。比如,以100或200字节为内存块的内存链表。
每条内存链表使用一个结构体(OS_MEM)控制,这个结构体描述了这一条链表中的内存属性,比如内存块大小,剩余内存块的数量,内存块总数量等等。
1、
此函数由系统内部调用,用户不必理会,主要是一些初始化动作,前面说了每条链表都有一个结构体OS_MEM控制。
ucos建立了一个OS_MEM结构体数组,这个函数就是把这个结构体数组成员使用单向链表连接起来,并且对结构体进行初始化。
ucos使用一个全局指针指向表头,方便结构体取用。每一个结构体都可以控制一个内存链表。结构体数量用户可以通过宏定义配置。
2、
此函数初始化并创建内存块链表。主要过程是从结构体链表中取下一个空闲结构体。根据参数提供的内存起始地址和内存块大小,把整个内存分为大小一致的内存块,使用单向链表连接起来。
再把内存块链表的属性信息填写到结构体中。此函数返回一个结构体指针。找到这个结构体就找到了这条链表。
3、
根据OS_MEM类型指针找到对应的链表结构体,如果空闲的内存块数量大于0,那么从链表中摘下一个内存块,然后修改OS_MEM结构体信息,返回内存首地址。
4、
这个简单,获得内存块链表的名称。
5、
这个简单,设置内存块链表的名称。
6、
释放内存,把用完的内存块,插入pmem对应的链表中,然后修改pmem结构体信息。
7、
查询指定的内存链表中的内存使用情况,查询结果放在OS_MEM_DATA 结构体中。
优点:
仔细阅读源码就会发现,每次取出内存块的时间是一样的,速度非常快,放入内存块消耗的时间也是一样,运行时间可控,实时性非常好,代码量很小。
缺点:
每条链表中的内存块都是一样大小,使用时会有些浪费。
全部0条评论
快来发表一下你的评论吧 !