标题:
浅析FreeRTOS_v4.5.0内存分配与回收及其改进方案(4)
[打印本页]
作者:
yuyang911220
时间:
2014-10-29 10:07
标题:
浅析FreeRTOS_v4.5.0内存分配与回收及其改进方案(4)
<
2
.
2
>
第2种动态内存回收
void
vPortFree
(
void
*
pv
)
{
unsigned
portCHAR
*
puc
=
(
unsigned
portCHAR
*
)
pv
;
xBlockLink
*
pxLink
;
if
(
pv
)
{
puc
-
=
heapSTRUCT_SIZE
;
//内存数据区的前heapSTRUCT_SIZE空间存放了管理本段内存数据区的控制数据
pxLink
=
(
void
*
)
puc
;
vTaskSuspendAll
(
)
;
//锁住调度器
{
//把释放出来的内存块添加到空闲内存链表xStart~xEnd之间
//(注:xStart~xEnd是按空闲内存大小,以从小到达的顺序链起来的单向链表[gliethttp])
//也就是这样虽然看上去,FreeRTOS可以实现各种内存块的申请,但是因为切割出去的小内存块
//在内存释放回收的时候,并不能自动进行内存合并整理,也就是空闲内存块不能变大,
//最后只能导致小内存空闲块越来越多,大内存空闲块越来越少,直到不能申请到大内存块
//可以使用《一种轻巧的“内存动态分配管理机制”》中的方法很好的解决(gliethttp)
//文章地址:
http://blog.chinaunix.net/u1/38994/showart_351550.html
prvInsertBlockIntoFreeList
(
(
(
xBlockLink
*
)
pxLink
)
)
;
}
//调度器解锁,此间会有若干处理,详细细节可以参见《浅析FreeRTOS_v4.5.0延时机制---vTaskDelay()的实现》
//文章地址:
http://blog.chinaunix.net/u1/38994/showart_392389.html
xTaskResumeAll
(
)
;
}
}
//------------------------------------------------------------------------------
<
3
.
1
>
第3种内存动态分配
void
*
pvPortMalloc
(
size_t
xWantedSize
)
{
void
*
pvReturn
;
vTaskSuspendAll
(
)
;
{
pvReturn
=
malloc
(
xWantedSize
)
;
//使用编译器自带的malloc函数
}
xTaskResumeAll
(
)
;
return
pvReturn
;
}
<
3
.
2
>
第3种动态内存回收
void
vPortFree
(
void
*
pv
)
{
if
(
pv
)
{
vTaskSuspendAll
(
)
;
{
free
(
pv
)
;
//使用编译器自带的free函数
}
xTaskResumeAll
(
)
;
}
}
//------------------------------------------------------------------------------
综上可知
,
FreeRTOS_v4
.
5
.
0对内存的动态分配支持的并不好
,
内存动态分配很简单
,
分配出去就可以了
,
但是在分配出去的内存的动态回收上
,
还是欠佳的
,
可以引入linux中的Buddy伙伴算法
,
就是可能麻烦一些
,
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0