FreeRTOS实时操作系统(十六)内存管理

系列文章

FreeRTOS实时操作系统(一)RTOS的基本概念

FreeRTOS实时操作系统(二)任务创建与任务删除(HAL库)

FreeRTOS实时操作系统(三)任务挂起与恢复

FreeRTOS实时操作系统(四)中断任务管理

FreeRTOS实时操作系统(五)进入临界区、任务调度器挂起与恢复

FreeRTOS实时操作系统(六)列表与列表项

FreeRTOS实时操作系统(七)时间片调度及RTOS的滴答定时器

FreeRTOS实时操作系统(八)任务状态查询及时间统计函数

FreeRTOS实时操作系统(九)时间延时函数及消息队列

FreeRTOS实时操作系统(十)信号量

FreeRTOS实时操作系统(十一)队列集

FreeRTOS实时操作系统(十二)事件标志组

FreeRTOS实时操作系统(十三)任务通知

FreeRTOS实时操作系统(十四)软件定时器

FreeRTOS实时操作系统(十五)Tickless低功耗模式

FreeRTOS实时操作系统(十六)内存管理


文章目录

  • 系列文章
  • 内存管理
  • API函数
  • 实验测试


内存管理

动态创建:自动地从 FreeRTOS 管理的内存堆中申请创建对象所需的内存,并且在对象删除后,
可将这块内存释放回FreeRTOS管理的内存堆
静态创建:需用户提供各种内存空间,并且使用静态方式占用的内存空间一般固定下来了,即使任务、队列等被删除后,这些被占用的内存空间一般没有其他用途

前面使用的一些创建惹怒我、队列、信号量等,采用的都是动态创建的方式,比起静态的方式,更加简便、灵活。

标准C库也提供了函数malloc()和free()实现动态申请和释放内存,但是没有线程安全的相关机制,内存碎片化等缺点

FreeRTOS提供了五种内存管理算法:(介绍heap_4)
FreeRTOS实时操作系统(十六)内存管理_第1张图片
heap_2 内存管理算法使用最适应算法,找出最小的,满足条件的内存碎片,但不能合并空闲内存块

heap_4使用了首次适应算法(第一个满足条件的内存块),也支持内存的申请与释放,并且能够将空闲且相邻的内存进行合并,从而减少内存碎片的现象。

heap_5 内存管理算法是在 heap_4 内存管理算法的基础上实现的,但是 heap_5 内存管理算法在 heap_4 内存管理算法的基础上实现了管理多个非连续内存区域的能力,heap_5 内存管理算法默认并没有定义内存堆 ,需要用户手动指定内存区域的信息,对其进行初始化。

API函数

函数 描述
void * pvPortMalloc( size_t xWantedSize ); 申请内存
void vPortFree( void * pv ); 释放内存
size_t xPortGetFreeHeapSize( void ); 获取当前空闲内存的大小
  1. void * pvPortMalloc( size_t xWantedSize );
    xWantedSize:申请的内存大小,以字节为单位;
    返回值:返回一个指针 ,指向已分配大小的内存。如果申请内存失败,则返回 NULL。

  2. void vPortFree( void * pv );
    *pv:指针指向一个要释放内存的内存块;

  3. size_t xPortGetFreeHeapSize( void );
    返回值:返回当前剩余的空闲内存大小

实验测试

void task2( void * pvParameters )
{
	uint8_t t = 0;
    uint8_t * buf = NULL;
    while(1)
    {
			buf = pvPortMalloc(30);                 /* 申请内存 */
			if(buf != NULL)
			{
				printf("申请内存成功!\r\n");
			}
			else 
				printf("申请内存失败\r\n");

			if(buf != NULL)
			{
				vPortFree(buf);                     /* 释放内存 */
				printf("释放内存!!\r\n");
		    } 
		
		if(t > 50)
		{
			t = 0;
			printf("剩余的空闲内存大小为:%d\r\n",xPortGetFreeHeapSize());
		}	
		t++;		
		vTaskDelay(20);
    }
}

测试成功,这里的buf存放的是申请后的地址,所以如果申请一次内存后,多次释放的时候就会出现问题。

这里申请的是30个字节的大小,但是在打印的时候,申请释放前后的总的占用大小差值并不是30,因为还有一些句柄啥的会创建

你可能感兴趣的:(FreeRTOS,FreeRTOS,嵌入式操作系统,stm32,HAL)