freertos的动态内存分配之heap_1.c解析

一、freertos的动态内存分配原理

        首先,freertos的动态内存分配是一种“假”动态内存分配策略。所谓“假”,是指实质并不是做到真正意义上的动态分配,而是事先分配了一个足够大的静态数组,然后freertos的内存管理策略会对这一块大的静态数组进行内存管理。所以,freertos中用到的它自身的动态内存分配时候,都只是使用的这一个静态数组,即这一段内存保存数据。

二、分析环境

        为了方便,笔者都是使用的STM32平台,使用STM32CubeMX生成的MDK5.0工程。

三、heap_1.c的具体动态内存分配方法

        第一种的动态内存分配的方法比较简单,它所支持的动态内存分配,一旦分配了之后不可以释放,其实跟定义一个全局数组差别不大,只是这样是为了方便管理。

四、实际代码分析

        正常来说,我们主要看看pvPortMalloc跟vPortFree函数,但是我们前面说过第一能释放的,所以vPortFree函数是没做任何操作的,故这里只分析pvPortMalloc函数。

图一

        图一代码,是内存对齐方式,跟踪这个portBYTE_ALIGNMENT定义,可以发现是8字节对齐的,这里不做解释。所谓定义几字节对齐的理解,其实就是动态分配时候的最小单位。例如按照8字节对齐,那么最小申请的单位则为8B的倍数,即8,16,24这些。其它几种的对齐方式也是这样的。


图2

图2,是内存分配的主要开始。

1、它会先挂起所有线程,接着pucAlignedHeap定义的是一个静态的uin8_t *的指针,它初始指向PULL。所以,动态内存分配的时候,才会进入这个第一个if判断里面,以后都不需要了。那这个if结构里,其实只是把这个指针指向我们事先定义的这个大的静态数组的首地址。至于132行的语句,是会做地址的对齐,即这个大数组的首地址也是按照我们8字节的对齐方式对齐的。

2、第一个if语句无非就是判断大小是否合法,这个很好理解。判断合法之后,xNextFreeByte是初始为0,pucAlignedHeap为内存开始地址,所以,第一次分配之后会把 动态分配的地址保存在pvReturn里,供最后return返回。而后一个语句,则是xNextFreeByte += xWantedSize;这里是为了给下次分配做准备,即下次分配的返回地址为首地址往后移动xWantedSize大小后的地址。后面的以此类推。

四、总结

        freertos的第一种动态内存分配比较简单,这里就说到这里了。

        如有错误或者有不懂需要沟通,请联系邮箱:[email protected]

你可能感兴趣的:(freertos的动态内存分配之heap_1.c解析)