浅析FreeRTOS_v4.5.0内存分配与回收及其改进方案 2007
- UID
- 1029342
- 性别
- 男
|
浅析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种方式不提供内存回收机制
} |
|
|
|
|
|