首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

浅析FreeRTOS_v4.5.0内存分配与回收及其改进方案 2007

浅析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种方式不提供内存回收机制
}
继承事业,薪火相传
返回列表