轻量级操作系统FreeRTOS的内存管理机制(一)

2024-05-27 11:48

本文主要是介绍轻量级操作系统FreeRTOS的内存管理机制(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 本文由嵌入式企鹅圈原创团队成员朱衡德(Hunter_Zhu)

近几年来,FreeRTOS在嵌入式操作系统排行榜中一直位居前列,作为开源的嵌入式操作系统之一,它支持许多不同架构的处理器以及多种编译工具链,具有轻量级、容易移植和使用的特点。本篇文章将会对FreeRTOS提供的几种内存分配策略进行介绍,FreeRTOS允许开发者根据自己的项目实际需要选择不同的内存分配策略或者自定义分配内存策略。

一、FreeRTOS内存分配源码

FreeRTOS在创建任务、队列、互斥量、信号量、软件定时以及事件组的时候需要从RAM中分配内存,源码目录:FreeRTOSv9.0.0\FreeRTOS\Source\portable\MemMang下提供了5中内存分配机制的实现,本文将会讲解heap1.c,heap2.c, heap4.c三种。

二、配置FreeRTOS内存大小

在FreeRTOSConfig.h头文件中宏configTOTAL_HEAP_SIZE用于配置内核可用的RAM大小:

在heap1.c, heap2.c, heap3.c源文件中,分配的内存实际上是用一个静态数组ucHeap来表示:

在MDK编译后生成的.map文件里面可以查看ucHeap符号信息:


ucHeap属于RW数据,在RAM中运行时的地址是0x20002788,大小是前面分配的20*1024字节。

三、heap1.c内存分配机制

heap1.c是FreeRTOS提供的多种内存分配策略中最简单的一种,其使用一个全局静态变量xNextFreeByte来记录未分配使用的内存空间的位置,每分配一次就会往后进行偏移。另外,在这种方式中,已经分配的内存不会再释放。

3.1 void *pvPortMalloc(size_t xWantedSize)

应用程序调用此函数请求分配内存,需要注意的是函数中有两个地方为满足字节对齐的要求进行调整(cortex-m3为例,8字节对齐):

1)为确保从静态数组ucHeap中分配给应用程序的内存块是8字节对齐,函数会判断xWantedSize是否为8的倍数,如果不是,就会添补字节,因此有时候分配到的内存比实际请求的内存还要多;

2)确保从静态数组ucHeap中第一个8字节对齐的地方开始进行内存分配,用静态变量pucAlignedHeap记录首次对齐的地址作为有效空间的首地址;

内存分配示意图:

上图中可以看到ucHeap前面和后面都有因字节对齐而丢弃的空间,所丢弃的空间大小要求的字节对齐数,对于cortex-m3系列是8,实际有效的分配空间为:

即ucHeap数组实际大小减去字节对齐数。

3.2void vPortFree( void *pv )

在这种分配策略中,对于已经分配的内存不进行释放。

 

前面主要主要介绍了heap1.c中内存分配的策略,也提到了内存分配过程中字节对齐,在heap2.c和heap4.c中字节对齐的操作和heap1.c中一样。对于heap2.c和heap4.c的内存分配原理会在下篇”FreeRTOS几种内存分配机制(二)”中进行讲解。

这篇关于轻量级操作系统FreeRTOS的内存管理机制(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1007392

相关文章

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常