FreeRTOS 第21-23章

FreeRTOS内核与内存管理是分开的,其只提供函数原型,内存的管理的实现可不同定义。在一般的实时嵌入式系统中,由于实时性的要求,都是直接操作物理内存,而没有引入虚拟内存,而且内存申请的时间也很苛刻,不同的申请函数使得耗费时间不同,这样的不确定性对于实时系统不允许的。

FeeRTOS规定的内存管理接口

void *pvPortMalloc( size_t xWantedSize )  //内存申请
void vPortFree( void *pv )                //内存释放
size_t xPortGetFreeHeapSize( void )        //获取未分配堆的大小
void vPortInitialiseBlocks( void )        //初始化堆内存函数
static void prvHeapInit( void )          //堆初始化函数

在FeeRTOS,可以有5种内存管理方案

heap_1.c

其只能申请不能释放内存,且申请时间是固定的,适合要求安全的,但是大多数嵌入式程序都是一开始创建好了就不需要删除,使得不用释放内存。两个静态变量来对内存分配进行管理

static size_t xNextFreeByte =(size_t) 0; //记录空闲位置,实际就是已经分配内存大小
static uint8_t * pucAkignedHeap =NULL   // 对齐后内存堆起始位置,8字节对齐

方案1中的堆是一个全局数组,通过内存起始位置+xNextFreeByte就可以确定从哪里开始申请内存

来看看pvPortMalloc的源码

首先判断申请的内存大小是不是8字节对齐,不是,则8字节对齐(申请30,会分配32各内存单元)。然后看是不是第一次使用,确保内存堆按照要求对齐的,然后判断申请的空间是不是已经超过系统能提供的内存大小,如果没有超过,说明能提供,则更新xNextFreeByte的值,则把能提供的内存首地址返回。在申请内存之前,需要将堆初始化,就算在启动代码定义好了堆的大小,但是分配的内存的首地址有可能不是对齐,就需要在初始化的时候对齐,并且初始化xNextFreeByte=0。

在该方案中,其它函数用作不大。

算了,后面的不说了,看了下没什么说的,就是预先定义好一个数组,这个数组在编译的时候就会预留好空间,堆就是用来实现动态分配内存的,它和启动文件中的堆不一样,如果函数中没有使用malco函数,就算启动文件中的堆尺寸为0也可以。所有定义好的全局变量或者动态变量编译的时候都是会预留空间的,因此不需要在运行的时候申请内存。只有在使用方案3的时候,在FreeRTOSConfig文件中定义的堆尺寸就没有用了,而其它内存管理办法的都是在定义的一个大数组中操作。

中断和裸机开发没什么区别,也需要开中断,配置优先级之类的。

CPU的利用率有需要打开配置的宏定义就可以

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值