STM32内存结构介绍和FreeRTOS内存分配技巧
这是我第一次使用FreeRTOS构建STM32的项目,踩了好些坑,又发现了我缺乏对于操作系统的内存及其空间的分配的知识,故写下文档记录学习成果。
文章最后要解决的问题是,如何恰当地分配FreeRTOS中的堆、任务栈的空间。但是在概念的理解上,也需要知道STM32内存的相关知识。所以首先大致介绍一下STM32的内存结构。
STM32内存结构
STM32的数据在物理上分别储存在RAM和Flash中。RAM可读可写,掉电清零。Flash可读可写,但是读写时间很长,能掉电储存,并且一般空间比RAM大很多。
在关于如何使用RAM和Flash的问题上,STM32的内存又有了6个储存数据段和3种储存属性区的概念。

6个储存数据段
data
数据段,储存已初始化的,且初始化不为0的全局变量和静态变量。
bss
Block Started by Symbol。储存未初始化的,或初始化为0的全局变量和静态变量。
text
代码段,储存程序代码。
constdata
储存只读常量。
heap
堆,存放进程运行中被动态分配的内存段。其可用大小定义在启动文件startup_stm32fxx.s中,由程序员使用malloc()和free()函数进行分配和释放。
stack
栈,其大小定义在启动文件startup_stm32fxx.s中,由系统自动分配和释放。可存放局部变量、函数的参数和返回值,中断发生时能保存现场。但是static声明的局部静态变量不储存在栈中,而是放在data数据段。
3种储存属性区
RO(Read Only)
烧写到Flash中,可以长久保存。text代码段和constdata都属于RO。由于需要掉电储存,RO里也保存了一份data的数据。

本文档探讨了STM32的内存结构,包括RAM和Flash的特性,以及data、bss、text等数据段。重点介绍了FreeRTOS中的堆和任务栈管理,解释了如何恰当分配FreeRTOS堆和任务栈空间,提到了内存分配API的使用,并分享了通过API监控内存使用情况来优化内存分配的方法。此外,还讨论了在实际应用中如何根据需求调整Stack_Size和Heap_Size,以确保资源的有效利用。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



