[STM32F1] stm32内存空间分配学习

[复制链接]
841|5
 楼主| dspmana 发表于 2024-2-29 11:32 | 显示全部楼层 |阅读模式
如图是一张stm32的内存映射图,其中代码区是从0x0800 0000开始的,他的结束地址是0x0800 0000加上实际芯片的flash大小,他的ram的起始地址是0x2000 0000,然后结束地址依然是加上芯片实际的ram大小。


digit0 发表于 2024-2-29 13:28 | 显示全部楼层
在STM32单片机中,内存空间的分配主要包括Flash(ROM)和RAM(SRAM)两大部分。

1. Flash(ROM)

代码区:存放程序执行的机器码,不可被修改。
RO-data(只读数据段):存储常量、字符串字面量等只读数据,在运行时不能被更改。
RW-data(读写数据段):存放初始化为非零值的全局变量或静态变量,这部分内容在系统上电后会从Flash复制到RAM中,并在运行时可读可写。
2. RAM(SRAM)

堆(Heap):动态内存区域,通过malloc()、calloc()、realloc()等函数动态申请和释放内存。
栈(Stack):用于存储局部变量、函数调用时保存的上下文信息(如寄存器备份),栈大小由编译器决定并在运行时自动增长和收缩。
静态区(Static Area):
初始化的全局变量和静态变量:在程序启动时分配并初始化。
未初始化的全局变量和静态变量(ZI-data, Zero Initialized Data):虽然在源代码中没有赋初值,但在程序开始前会被自动清零。
此外,STM32内部还有不同块的RAM划分,例如Core Coupled Memory (CCM)、Tightly-Coupled Memory (TCM) 等,以及可能存在的外部扩展RAM(External SRAM)。

在实际编程过程中,开发人员需要注意合理安排各个部分的内存使用,避免栈溢出、堆碎片等问题。同时,还可以通过STM32CubeMX工具配置芯片的内存分布,以及通过查看链接脚本(Linker Script)了解更详细的内存布局情况。
理想阳 发表于 2024-2-29 13:29 | 显示全部楼层
STM32内存学习还是很重要的,也是基础部分,
ClarkLLOTP 发表于 2024-2-29 17:15 | 显示全部楼层
好像超过一点也是可以的
heisexingqisi 发表于 2024-2-29 22:18 | 显示全部楼层
是不是可以指定存放的位置。
Henryko 发表于 2024-2-29 22:23 | 显示全部楼层
ClarkLLOTP 发表于 2024-2-29 17:15
好像超过一点也是可以的

后面的空间是没有保障的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

2859

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部