本文由嵌入式企鹅圈原创团队成员朱衡德(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.1void *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的内存管理机制(一)的更多相关文章

  1. 浅谈Linux内存管理机制

    经常遇到一些刚接触Linux的新手会问内存占用怎么那么多?在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在这 ...

  2. python的内存管理机制

    先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制 一.垃圾回收: python不像C++,Java等语言一样,他们可以不用事先声明变量 ...

  3. Java虚拟机内存管理机制

    自动内存管理机制 Java虚拟机(JVM)在执行Java程序过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区 ...

  4. 了解linux内存管理机制(转)

    今天了解了下linux内存管理机制,在这里记录下,原文在这里http://ixdba.blog.51cto.com/2895551/541355 根据自己的理解画了张图: 下面是转载的内容: 一 物理 ...

  5. 正确认识Android的内存管理机制,合理关闭进程 (一)

    随着大家收货后会有很多乐粉晒内存,为啦方便大家,在网上搜集了一些相关Andriod管理的相关机制合理管理内存,整理下发个贴. 首先要知道Android系统是基于Linux 2.6内核开发的开源操作系统 ...

  6. Spark内存管理机制

    Spark内存管理机制 Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行 ...

  7. JVM自动内存管理机制——Java内存区域(下)

    一.虚拟机参数配置 在上一篇<Java自动内存管理机制——Java内存区域(上)>中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置. 1.Java堆参数设置 a) ...

  8. 【转载】Linux 内存管理机制

    在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,主要特点是,无论物理内存有多大,Linux 都将其充份利用,将 ...

  9. 【JVM】5、JVM内存管理机制

    转自:http://blog.csdn.net/lengyuhong/article/details/5953544 近期看了看Java内存泄露的一些案例,跟原来的几个哥们讨论了一下,深入研究发现JV ...

随机推荐

  1. 强化学习读书笔记 - 05 - 蒙特卡洛方法(Monte Carlo Methods)

    强化学习读书笔记 - 05 - 蒙特卡洛方法(Monte Carlo Methods) 学习笔记: Reinforcement Learning: An Introduction, Richard S ...

  2. maven项目发布不成功的问题

    MyEclipes   里面有好多的项目,有些项目是插件有些是组件,  就是有些项目是被依赖的项目,有些事项目的主体,被依赖的项目需要打成jar 包放在maven的中央仓库里面,也是所说的maven的 ...

  3. Jmeter+Badboy实战经验三 Jmeter关联相关知识

    1. 什么时候需要使用关联? 有些参数是动态变化的,获取之后,再次操作的时候,参数的值已经发生了变化,这种情况下就会出现脚本不可运行的问题,就需要用到了关联 2. 关联是什么概念? 3.jmeter ...

  4. jQuery入门(一)

    相信学js的人多多少少听过JQuery,JQuery对于前端开发人员来说是不可或缺的,他让开发变得更加简单.那到底什么是JQuery呢?用一句话来说,JQuery就是一个javascript的库.所谓 ...

  5. hibernate jar包介绍

    Hibernate3.jar            这个是hibernate最主要的jar包 ant-1.63.jar      Ant 的核心包,在构建Hibernate 时会用到 antlr-2. ...

  6. (七)javascript中的数组

    一. 一维数组 1.1 声明数组 var 数组名=new Array(数组大小); 1.2  添加元素 <script> var a=new Array(3); a[0]="张三 ...

  7. Java基础——运算符

    一.赋值运算符 在前面的学习中,用到最多的是什么呢?就是“=” .例如:int money=1000;   //储存本金 使用“=”将数值1000放入变量money的存储空间中.“=”称为赋值运算符. ...

  8. 深究WeixinJSBridge未定义之因

    对于一个没有使用微信JS-SDK的网站来说,我们竟然收到了WeixinJSBridge is not defined 的报错: 去网上一搜,发现很多开发者都遇到类似的问题: 我的微信项目,没有用到微信 ...

  9. 剑指offer_数组中的逆序对

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P. 并将P对1000000007取模的结果输出. 即输出P%100 ...

  10. hibernate 三种状态的转换

    一.遇到的神奇的事情 使用jpa操作数据库,当我使用findAll()方法查处一个List的对象后,给对这个list的实体进行了一些操作,并没有调用update 或者 saveOrUpdate方法,更 ...