首页 > 系统相关 >FreeRTOS在STM32中是如何使用内存的

FreeRTOS在STM32中是如何使用内存的

时间:2023-06-25 15:47:30浏览次数:62  
标签:FreeRTOS 中是 STM32 大小 heap 空间 Size

转载自:《FeeRTOS在STM32中是如何使用内存的》

没有FreeRTOS 的时候:STM32 资源的分配:

 

有FreeRTOS 后(注意 FreeRTOS 的任务栈空间位于 FreeRTOS 的堆之中):

 

STM32无OS编程 Stack_Size和Heap_Size大小设置的意义

其中STACK_SIZE和HEAP_SIZE在STM32的启动文件startup_stm32fxx.s中都有定义,这两个值一般的工程都不需要调整,足够使用。

 1 Stack_Size      EQU     0x400
 2  
 3                 AREA    STACK, NOINIT, READWRITE, ALIGN=3
 4 Stack_Mem       SPACE   Stack_Size
 5 __initial_sp
 6                                                   
 7 ; <h> Heap Configuration
 8 ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
 9 ; </h>
10  
11 Heap_Size       EQU     0x200
12  
13                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3

 

在使用STM32编程时,一般情况下我们不会关注堆栈空间的大小,因为在STM32的启动文件中,已经帮我们预先设置好了堆栈空间的大小。如下图所示的启动代码中,Stack栈的大小为:0x400(1024Byte),Heap堆的大小为:0x200(512Byte)。

1,Stack Size,一般小工程0X400足够,所以默认无需设置太大,确实需要调整,可根据实际需求手动修改。
2,Heap Size,如果没有用到标准库的malloc,就是废物,纯属浪费内存,所以直接设置为0即可。

 

FreeRTOS中的堆

FreeRTOS中的堆也属于ZI区,但是它与STM32内存结构中的堆并不占用相同的空间,两个堆同时存在。以下出现的堆(heap)表示FreeRTOS堆,另外在STM32启动文件中定义大小的堆称为系统堆。

FreeRTOS有5种heap的实现方式,在STM32CubeMX中默认为heap_4.c。这种方式可以满足大部分使用需求,暂时不用关注其实现细节。

这一个堆的大小定义在FreeRTOSConfig.c中:

FreeRTOS创建任务时默认的任务栈大小为128字,在32位系统中即为128*4=512Byte,再加上TCB块占用84Byte,一共596Byte。而大小为3072Byte的堆允许创建3个这样的任务,占用约1800Byte。堆中剩余的部分则存放了系统内核、信号量、队列、任务通知等数据。

需要创建更多任务时,堆的大小可自行修改。用RAM的空间减去已分配的空间,即为能给堆分配的最大空间:

Space=RAM−bss−data−SysHeap−Stack

 

FreeRTOS堆和任务的空间分配

FreeRTOS堆和任务栈在运行中具有很强的动态性,其大小很难估计。

我们在实际使用中,可以先把空间调整得大一些。程序正常运行后,再通过一些API查看堆栈剩余的空间大小,估算程序运行中需求内存空间的最大值。最后将这个最大值乘一个安全系数,得到最终应该分配的空间大小。安全系数推荐1.3到1.5。

查看堆(heap)剩余空间的API有:
1 size_t xPortGetFreeHeapSize( void );             //获取当前未分配的内存堆大小
2 size_t xPortGetMinimumEverFreeHeapSize( void );     //获取未分配的内存堆历史最小值

它们返回值的单位都是字节。

需要注意的是,xPortGetFreeHeapSize()在使用heap_3.c时不能被调用;xPortGetMinimumEverFreeHeapSize()则只能在使用heap_4.c或heap_5.c时生效。

 

查看任务栈剩余空间的API:
UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );

这个函数可以获取一个任务从创建好到调用此函数时,任务栈空间的历史最小剩余值(HighWaterMark)。使用这个函数时需注意,它的返回值的单位是字(STM32里1个字长为4个字节)。

这个API默认是关闭状态,需要手动在Cubemx(或配置文件中)将宏INCLUDE_uxTaskGetStackHighWaterMark置为1。

我在使用过这些API后发现,他们本身也会占用相当的内存空间,尤其是uxTaskGetStackHighWaterMark(),会拖慢任务运行速度。所以在程序的正式版中,应该将他们删除。

 

任务栈空间和FreeRTOS堆空间优化

以上关系搞清楚,那么又该如何定heap的空间大小呢,可以先进行一个粗略的计算,假设任务1分配2kbytes栈,任务2分配3kbytes栈,队列大概占1k,用户malloc大概2k,这么算一共就是8k。那么在资源有限的情况下可以先把heap空间分个15k。

通过在任务函数中加入之前提到的3个API:

1 size_t xPortGetFreeHeapSize( void );             //获取当前未分配的内存堆大小
2 size_t xPortGetMinimumEverFreeHeapSize( void );     //获取未分配的内存堆历史最小值
3 UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ); //查看任务栈空间的历史最小值

就可以打印出来该任务自启动起来最小剩余栈空间大小。然后我们就可以计算出最大使用的大小,一般可以再乘以1.5左右作为最终分配的值。需要注意的是该函数不像前面两个返回的是bytes,而返回的以字为单位,真实的bytes需要乘以4。所以总体的原则就是:先分大再调小最终把它确定好。

标签:FreeRTOS,中是,STM32,大小,heap,空间,Size
From: https://www.cnblogs.com/FBsharl/p/17503031.html

相关文章

  • 初识FreeRTOS
    FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。 一、FreeRTOS收费问题1.FreeRTOS是一款“开源免费”的实时操作系统。遵循的是GPLv2+的许......
  • stm32 基于HAL工程硬件I2C读取PCF8563
    参考链接:https://download.csdn.net/download/xqw19891201/11267260  #include"stm32xxxx.h"#include"stm32xxxx_hal.h"#definePCF8563_ADDRESS0xA2//PCF8563的I2C地址I2C_HandleTypeDefhi2c;//I2C句柄//从PCF8563读取一个字节uint8_tPCF8563_ReadByte(......
  • Freertos学习01-Task Creat & Delete
    一、Freertos介绍FreeRTOS是一个开源的实时操作系统内核,它是由英国的RealTimeEngineersLtd.开发的。它提供了一些基本的内核功能,如任务管理、时间管理、信号量、队列和软件定时器等,可以帮助开发人员更容易地构建嵌入式系统。FreeRTOS是一个非常流行的实时操作系统内核,因为它是......
  • 《零死角玩转 STM32》pdf版电子书免费下载
    《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。适合stm32入门,简单易懂,层层递进,亲测效果良好,适合新手学习,......
  • STM32-mp157-A核Linux
    A核开发环境网卡连接1.NAT虚拟网卡连接互联网2.桥接(真实)网卡连接开发板ubuntu新建NAT网卡;设置桥接模式;搜索vmnet以管理员身份打开;设置桥接网卡为目标usb网卡;打开虚拟机linux网络设置;设置静态IPv4同一网段;ifconfig命令查看;打开windows网络设置;设置静态IPv4同一网段;打开终......
  • STM32-mp157d-M核裸机
    M核1.时钟配置2.延时函数HAL_delay(unsignedintMS);//实际延时时间:MS+1ms3.IO配置HAL库方法使用mp157时,stm32cubeMX不能生成GPIO初始化代码,需要根据具体分配情况自己完成GPIO初始化。初始化//配置PA5引脚__HAL_RCC_GPIOA_CLK_ENABLE();//使能Z组GPIO时钟GPIO......
  • SBERT现在在业界中是什么地位,是否常用?有没有比SBERT更好的同类技术?
    作者:transformer链接:https://www.zhihu.com/question/507525712/answer/2280236067来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。   通过下面这张图可以看看SBERT在语义匹配这一块的地位(见红色标记部分):效果上,SBERT<<SBERT-flow≈SBERT-W......
  • BLDC无刷直流驱动控制板资料,可驱动300W电机,已量产(STM32 CAN总线)输入电压:15~36V
    BLDC无刷直流驱动控制板资料,可驱动300W电机,已量产(STM32CAN总线)输入电压:15~36V驱动功率:300W~500W,20A电流检测,CAN通信总线功能介绍KEY1:运行KEY2:停止VR1:转速调节带霍尔传感器提供工程原理图和源码,AD9工程内有提供电机型号ID:1759609955138630......
  • 量产HLW8032串口通讯芯片的三相电参数采集系统项目资料 1主芯片采用STM32F407
    量产HLW8032串口通讯芯片的三相电参数采集系统项目资料1主芯片采用STM32F4072嵌入式软件使用UCOS2操作系统3通过3个独立串口实时采集三路三相电参数数据(通过HLW8032)4具备TFT液晶显示接口,实时显示三相电参数数据5为了采集电参数更加精确,系统具备红外解码芯片(HS0038),可在线标定电压......
  • STM32 IAP/OTA升级/BootLoader 升级方案 协议:ymode 1k
    STM32IAP/OTA升级/BootLoader升级方案协议:ymode1k包含上位机源码(VS2019/NET4.5)下位机源码Keil5.25验证芯片:STM32F103C8T6优点:可移植其他芯片ID:3360609508368547......