标题:
浅析FreeRTOS_v4.5.0内存分配与回收及其改进方案 2007
[打印本页]
作者:
yuyang911220
时间:
2014-10-29 10:04
标题:
浅析FreeRTOS_v4.5.0内存分配与回收及其改进方案 2007
浅析FreeRTOS_v4
.
5
.
0内存分配与回收函数及其改进方案
-
-
-
pvPortMalloc
(
)
和vPortFree
(
)
文章来源
:
http
:
//gliethttp.cublog.cn[转载请声明出处]
[
注
:
以下为FreeRTOS_v4
.
5
.
0在at91sam7s64处理器上的动态内存分配、释放函数
(
gliethtp
)
]
FreeRTOS_v4
.
5
.
0一共提供3中动态内存分配和回收机制
,
可以通过具体需要任意选择其中一种
,
第1种
:
只是提供堆数组上地址的线性分配
,
不提供内存回收
;
第2种
:
提供堆数组上地址的线性分配和回收
,
但是回收过程不能将小内存合并成大内存
第3种
:
使用编译器自带的malloc和free函数
以上不论哪一种方式都是对堆数组xHeap进行操作
,
其定义如下
:
static
struct
xRTOS_HEAP
{
//ulDummy仅仅用来告诉编译器分配的configTOTAL_HEAP_SIZE个字节连续空间的起始地址是4字节对齐的
unsigned
portLONG ulDummy
;
unsigned
portCHAR ucHeap
[
configTOTAL_HEAP_SIZE
]
;
}
xHeap
;
//------------------------------------------------------------------------------
<
1
.
1
>
第1种内存动态分配
void
*
pvPortMalloc
(
size_t
xWantedSize
)
{
void
*
pvReturn
=
NULL
;
#
if
portBYTE_ALIGNMENT
!
=
1
if
(
xWantedSize
&
heapBYTE_ALIGNMENT_MASK
)
{
//字节对齐,at91sam7s64默认使用4字节对齐
//所以下面折行程序,将xWantedSize扩展成4字节的倍数,
//比如:xWantedSize=13,那么xWantedSize=13+(4-13%4)=13+3=16(gliethttp)
xWantedSize
+
=
(
portBYTE_ALIGNMENT
-
(
xWantedSize
&
heapBYTE_ALIGNMENT_MASK
)
)
;
}
#
endif
vTaskSuspendAll
(
)
;
//锁住调度器
{
if
(
(
(
xNextFreeByte
+
xWantedSize
)
<
configTOTAL_HEAP_SIZE
)
&
&
(
(
xNextFreeByte
+
xWantedSize
)
>
xNextFreeByte
)
)
//防止申请数据空间超出4字节范围,过大溢出
{
//还有足够的空间,那么把申请到的空间首地址作为返回地址
pvReturn
=
&
(
xHeap
.
ucHeap
[
xNextFreeByte
]
)
;
//取得堆数组中xNextFreeByte偏移处的地址值
xNextFreeByte
+
=
xWantedSize
;
//调整xNextFreeByte,为下一次分配空间做准备
}
}
//调度器解锁,此间会有若干处理,详细细节可以参见《浅析FreeRTOS_v4.5.0延时机制---vTaskDelay()的实现》
//文章地址:
http://blog.chinaunix.net/u1/38994/showart_392389.html
xTaskResumeAll
(
)
;
return
pvReturn
;
//将申请到的内存块起始地址返回
}
<
1
.
2
>
第1种动态内存回收
void
vPortFree
(
void
*
pv
)
{
(
void
)
pv
;
//第1种方式不提供内存回收机制
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0