一.写在前面的话:
嵌入式设计中使用 RTOS 必然会带来额外的 RAM 消耗,然而许多初次接触 RTOS 的工程师并不清楚 如何评估 RAM 的消耗量。这篇文档以 FreeRTOS 为例,介绍评估 RAM 使用情况的一般方法,并给出 在 FreeRTOS 下优化 RAM 使用的方法,也由衷的期望读者在使用其他 RTOS 时,可以通过相似的思 路来解决问题。
二.FREERTOS RAM 使用情况
FreeRTOS 的组件包括调度器,内存管理单元及任务间通讯方法,当然还提供可选的软件定时器(事 实上,多数 RTOS 提供的组件都是这几项)。因此对 RAM 的使用情况的评估也与这几项直接相关。内 存管理单元提供内存管理办法,直接消耗内存的包括调度器,任务间通讯方法及软件定时器,当然每 一个任务还需要一定的堆栈空间。在具体的应用中,使用的任务数量可能不同,每个任务的堆栈空间 也可能不一样,任务间通讯的方式也可能不同,当然我们还要考虑到MCU 得内核和编译器优化选项的 问题。但是,通过简单的估算,还是可以轻松的得到 RAM 使用情况的大体信息。
文中提供的信息是以 STM32F407(Cortex-M4 内核)为硬件,IAR 编译选项开到最高,FreeRTOS 采 用最新的 v8.0.0 来进行测试的。基本情况呢我们慢慢来分析一下。
1. 调度器
采用嵌入式系统中比较常见的抢占式内核 256bytes 左右。真的很小,当然与 IAR 的编译优化有关系。
2.任务
一个任务的内存使用包括两个部分,任务控制块(Task Control Block,嗯,大名鼎鼎的 TCB)和任务 堆栈空间。在任务控制块的结构体信息中包含很多预编译选项(预编译选项包括什么,我建议你阅读 下源码),总体而言,毫无疑问的是你想要的越多,付出的也得越多。按最小配置情况来讲,任务控 制块需要 64bytes(任务名这里设置为 4 个 bytes)。
任务堆栈就是一个比较棘手的问题了,许多工程师一上来就分配 512bytes(⊙﹏⊙b 汗)。其实许多 任务用不了这么多的。想想任务堆栈都需要存些什么东西?CPU 寄存器值,任务中局部变量,调用的 函数参数和函数调用深度(使用迭代函数请慎重)。因此在进行任务堆栈分配时考虑到最糟糕情况就好了,就是上面提到的信息全部得以保存即可。并不是每个任务都需要 512bytes 的。最后,分配的值对齐,也就是 128,256,512 等等。
3.任务间通讯
任务间通讯是 RTOS 提供的另一项重要机制,方法很多,信号量,队列,邮箱等(如果你不知道我说 的是什么,搜下邵贝贝吧 :-D)。在 FreeRTOS 中,所有的通讯机制都是基于队列,因此,在 FreeRTOS 中这一项的估算围绕队列就可以了。一个队列需要 74bytes(最小配置,预编译选项请阅读 源码)。另外,至关重要的是,队列可以存放简单的数据,比如一个变量(这就可以诞生信号量),当然也可以存放数组,指针什么的。数组需要的空间,指针指向内容所需要的空间是需要额外计算的。
4.定时器
RTOS 往往都提供了软件定时器,用起来还是不错的,个人感觉在消费类电子产品中使用软件定时器 更合适些。一个定时器 56bytes。就这些。
总结一下。见下表。
在产品评估阶段,参考这些信息进行一般的估计是可行的,当然还是要给自己留点 Margin 的。
三.优化方法:
1. 分析空闲 RAM
FreeRTOS 提供了非常多的的方法来获得哪些 RAM 被分配了但是没有被使用。简单的阅读下代码注释马上就可以使用相关的函数了,都在 task.c 中。这个办法可以很好的降低任务堆栈所浪费的空间。
2. 在开发的后期对 FreeRTOS 进行尽可能小的配置
• 所有的任务都不会被阻塞你就可以删掉守护任务。
• 调试选项当然也应该关掉。
• 根据应用的情况,将最大优先级和最小堆栈量设置的尽可能小。
3. 如果这都不行,换更大 RAM 的器件吧,STM32 提供了最丰富的产品线。
关键字:STM32 单片机 FreeRTOS RAM 使用情况 优化方法
引用地址:
STM32单片机中,FreeRTOS RAM使用情况及优化方法
推荐阅读最新更新时间:2024-10-31 18:04
利用单芯片MCU提高照明系统能源交率
未来的20年中,亚洲发展中国家的用电量将位居全球前列,中国也将成为第一大电力消耗国。节约能源已经成为全球范围的一个热门话题。国际社会对能源效率日益重视,推动了《京都仪定书》和“能源之星”等新的能源法规和协定的诞生。目前,工业化国家纷纷承诺在未来十年内改善能源效率,减少温室气体排放。在某些情况下,这一承诺意味着通过制订法规强制性地提高传统用电系统的效率,因此,新的创新方案的设计和实施已迫在眉睫。
在住宅用电中,照明用电占相当大的比重。以家庭用电为例,空调、冰箱、热水器等耗电量高的电器一直是大家关注的焦点。而每天都在使用的照明电反倒被忽视。其实,每张电费帐单都要为照明用电支付1/6的费用。如何在中国推广节能的照明产品,提高照明系统的能
[应用]
51单片机片内数据存储器分为哪几个性质和用途不同的区域?
8051内部128B的数据RAM区,包括有工作寄存器组区、可直接位寻址区和数据缓冲区。各区域的特性如下: (1)00H~1FH为工作寄存器组区,共分4组,每组占用8个RAM字节单元,每个单元作为一个工作寄存器,每组的8个单元分别定义为8个工作寄存器R0~R7。当前工作寄存器组的选择是由程序状态字PSW的RS1、RS0两位来确定。如果实际应用中并不需要使用工作寄存器或不需要使用4组工作寄存器,不使用的工作寄存器组的区域仍然可作为一般数据缓冲区使用,用直接寻址或用Ri的寄存器间接寻址来访问。 (2)20H~2FH为可位寻址区域,这16个字节的每一位都有一个地址,编址为00H~7FH。 当然,位寻址区也可以用作字节寻址的一般
[单片机]
51单片机 基于方式1的单工通信
本实验主要是U1通过串口线TXD端将流水灯控制码以方式1发送到单片机U2的RXD,U2再利用接受的控制码控制流水灯点亮其P1口的8个发光二极管 单片机U1发送端 首先建立建立一个文件夹send,之后建立工作send,再添加一个send.c源文件,代码如下 #include reg51.h unsigned char code Tab ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void Send(unsigned char dat) { SBUF=dat; while(TI==0) //若发送中断标志位没有置 1 ,就等待 {
[单片机]
写给对MCU感兴趣的读者
随着科技时代的到来,我们的日常生活中越来越多的充斥着各种各样的电子产品,使社会生产力极大的提高,也使得我们的生活更加的丰富多彩。与此同时,这些电子产品的大量普及也带动了史无前例的创业和就业机遇,按用途大体可以划分为两类电子产品:一类主要为人们提供温饱之后的享乐之用,例如机顶盒、手机、平板电脑、MP3、MP4、电子词典、游戏机、电子宠物、智能玩具等;另一类主要为人们节约劳动力成本或使用的工作流程更加智能化,例如机械手、遥控器、温度检测仪、刷卡计费系统、智能剃须刀、捕猎器、智能调光器、安防器械、医疗器械等。 从市场容量来看,10年前电子产品的主要市场在国外,那个时候我国人民正在努力解决温饱问题。而10年后的今天,我国已经成为了全球最
[单片机]
一场MCU厂商的低功耗跃进竞技赛:ULPBench成为发力点
近日一系列的新品发布,为我们展示出微控制器产业的最新发展趋势,即迎合与物联网领域紧密联系并飞速发展的电源产业和移动设备市场。基于EEMBC协会去年提出的ULPBench 电能标准,MCU厂商已经踊跃的投身于这场跃进游戏,新产品不断刷新测试结果,行业的领导地位也在不停的交替。 这一系列的反应,很像一场市场游戏,当厂商需要提高自身技术用以节省功耗时,开发者将会成为最后的赢家。 在过去,低功耗的MCU往往意味着低性能,但各厂商正努力通过提供越来越强大的MCU来适应低功耗应用,进而对这种关系发起挑战。但是对开发者而言,却面临着如何评价MCU厂商的成果的问题。传统的规格,例如在mW/MHz情况下的工作电流,和睡
[单片机]
MSP432单片机学习记录(二)
前面的文章提到了ccs工程的创建,下面继续介绍msp432的使用,上一篇文章链接如下所示:MSP432单片机学习记录(Code Composer Studio) 另外一个就是芯片的资源官网查不到了,不知道啥原因,这里可以从一些其他老的网站看到一些,可以看下芯片资源,便于后面在选择芯片时候的考量。 低功耗、高性能 MSP432P401R MCU 带浮点单元和 DSP 加速功能的 48MHz 32 位 ARM Cortex M4F 功耗:95uA/MHz 工作功耗和 850nA RTC 待机操作功耗 模拟:24 通道 14 位差动 1MSPS SAR ADC,两个比较器 数字:高级加密标准 (AES256) 加速器、CRC
[单片机]
采用AT89S52单片机的家庭智能浇花器设计方案
随着人们生活水平的提高,花卉逐渐收到人们的青睐,陶冶情操,净化空气。利用单片机设计了一款家庭智能浇花器实现自动浇花,节省人力,方便人们出差的时候,不至于影响花卉的生长,如果在家也可以关断浇花器,手动浇花。浇花器设置为两种方式,一种是定时定量浇花,一种是根据湿度浇花。采用哪种方式是通过按键控制或者红外遥控的,在采用定时定量浇花时,数码管显示时间和流水时间,在选用根据湿度浇花时,数码管显示是目前的湿度。 1 总体设计 利用AT89S52单片机设计了自动浇花器,针对不同的花卉,此智能浇花器设置为两种方式:一是定时定量浇花,二是利用湿度传感器检测花卉(也可以用于蔬菜等)的湿度,采集的湿度传送到单片机芯片,单片机根据湿度控制是否浇水,如
[单片机]
STM32 USART使用DMA设置
1、外设时钟初始化 首先初始化需要用到的外围设备设备的时钟,需要初始化的始终有USART RX DMA使用的DMA1、USART1、USART1使用的GPIO、AFIO(如果USART的管脚需要Remap则需要打开否则不用); /* DMA clock enable (USART RX using dma1) */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* USART clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /* Enable GPIO cloc
[单片机]