【STM32】Keil中的Code,RO,RW,ZI以及堆栈

本文改自?链接: Keil中的Code,RO,RW,ZI分别表示什么
为方便了解,增加了一些内容。

keil在编译完成之后会出现这么一段文字。
在这里插入图片描述
这些参数的单位是Byte
Code:代码的大小
RO:常量所占空间,存储const常量和指令
RW:程序中已经初始化的变量所占空间,存储初始化值不为0的全局变量。
ZI:未初始化的static和全局变量以及堆栈所占的空间,存储未初始化的全局变量或初始化值为0的全局变量

上述参数和芯片Flash以及SRAM的对应关系是
Flash占用大小=Code+RO+RW
SRAM占用大小=RW+ZI

由于SRAM在掉电的时候数据会丢失,所以在主flash启动模式,上电后上电后首先从0x00000000(映射到0x08000000,这里只考虑从内部Flash启动)处获得中断向量表然后在运行用户代码之前会在标号2处有一段引导代码bootloder负责把存在Flash中的初始化变量的值Copy到SRAM中对应的变量位置(标号3),之后把ZI区域全部清零(标号4),之后才正式开始运行用户代码(标号5)。

所以在计算时RW要使用两次。
在这里插入图片描述
平常所说的堆栈指的是栈Stack,在单片机的启动文件中可以看到,单片机上电的时候会在RAM中分配一段(一般是高地址)空间,这就是栈。

栈主要用于存放局部变量,函数形参等,属于编译器自动分配和释放的内存,栈的大小不能超过内部 SRAM 的大小。如果工程的程序量比较大,定义的局部变量比较多,那么就需要在启动代码中修改栈的大小,即修改 Stack_Size 的值。如果程序出现了莫名其妙的错误,并进入了 HardFault 的时候,你就要考虑下是不是栈空间不够大,溢出了的问题。

栈是从高往低生长,所以结束地址就是栈顶地址。

<think>我们正在处理关于STM32F103RET6的ZI-data大小的问题。ZI-data是未初始化的全局变量和静态变量所占用的内存空间,在程序启动时由启动代码初始化为零。 根据引用[1]和[5],STM32F103系列根据容量分为小容量、中等容量和大容量产品。STM32F103RET6属于大容量产品,因为其型号中的"E"代表大容量(512KB Flash,64KB RAM)。具体来说: - STM32F103RET6具有64KB的RAM(即64*1024=65536字节)。 ZI-data的大小不是固定的,它取决于用户编写的程序。在编译后,链接器会生成一个.map文件,其中会详细列出ZI-data的大小(通常标记为.bss和COMMON段)。 因此,要确定特定工程的ZI-data大小,需要: 1. 使用MDK-ARM(Keil)或IAR等IDE编译工程。 2. 查看生成的.map文件,其中会包含类似以下的信息: ``` Total RO Size (Code + RO Data) xxxx Total RW Size (RW Data + ZI Data) yyyy Total ROM Size (Code + RO Data + RW Data) zzzz ``` 这里的ZI Data就是ZI-data的大小。 另外,根据引用[5]中关于启动文件的内容,启动文件会设置堆栈大小,并在初始化时清零ZI-data区域。 所以,对于用户的问题: - STM32F103RET6的RAM总大小为64KB(0x10000字节)。 - 具体工程中的ZI-data大小需要根据编译结果确定,不能一概而论。 如果用户需要优化ZI-data,可以: - 减少全局变量和静态变量的使用 - 使用局部变量 - 将不常用的全局变量移到堆上动态分配(但需注意堆大小设置) 最后,生成相关问题:</think>### STM32F103RET6 ZI-data 大小解析 #### 1. **ZI-data 定义** ZI-data(Zero Initialized Data)指**未初始化的全局/静态变量**在 RAM 中占用的空间。这些变量在程序启动时会被自动初始化为零。ZI-data 大小由用户代码决定,与芯片本身无关,但受芯片 RAM 容量限制。 #### 2. **STM32F103RET6 关键参数** - **RAM 总容量**:48KB(0xC000 字节)[^1][^3][^5] - **Flash 容量**:512KB(大容量型号)[^1] - **ZI-data 占用空间**:需通过编译结果获取(非固定值) #### 3. **查看 ZI-data 方法** 在 Keil/IAR 编译后,查看 `.map` 文件: ```plaintext Total RO Size (Code + RO Data) XXXX bytes Total RW Size (RW Data + ZI Data) YYYY bytes <-- 包含ZI-data Total ROM Size (Code + RO Data + RW Data) ZZZZ bytes ``` 其中: **ZI-data = RW Size - RW Data** #### 4. **ZI-data 优化建议**(当接近 RAM 上限时) 1. **减少全局变量**:改用局部变量或动态分配 2. **调整堆栈配置**:在启动文件 `startup_stm32f10x_xx.s` 中[^5]: ```assembly Stack_Size EQU 0x1000 ; 减小栈大小释放空间 Heap_Size EQU 0x0800 ; 减小堆大小释放空间 ``` 3. **使用内存复用技术**:如共享缓冲区 #### 5. **资源限制警告** STM32F103RET6 的 48KB RAM 在复杂应用中可能不足(如协议栈、GUI等)[^3]: - 若 ZI-data + Stack + Heap > 48KB,将导致硬件错误(如 CFSR 0x82 栈溢出) - 解决方案:升级至 STM32F4 系列(如 STM32F407,192KB RAM)[^3] --- ### 典型场景示例 假设工程编译后: - RW Size = 20KB - RW Data = 4KB - 则 **ZI-data = 20 - 4 = 16KB** 剩余可用 RAM = 48KB - (ZI-data + Stack + Heap) > 建议始终保留至少 10% RAM 余量(约 4.8KB)以保障稳定性[^3][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值