KEIL MDK Program Size 查看代码量

本文解析了KEIL RVMDK编译后的信息,详细解释了Code、RO-data、RW-data及ZI-data等概念及其在烧录与运行时所占空间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

KEIL RVMDK编译后的信息

 Program Size: Code=16288 RO-data=836 RW-data=104 ZI-data=2824 

 1、Code是代码占用的空间,RO-data是 Read Only 只读常量的大小,如const型,RW-data是(Read Write) 初始化了的可读写变量的大小,ZI-data是(Zero Initialize) 没有   初始化的可读写变量的大小。ZI-data不会被算做代码里因为不会被初始化。

 2、简单的说就是在烧写的时候是FLASH中的被占用的空间为:Code+RO Data+RW Data

       程序运行的时候,芯片内部RAM使用的空间为: RW Data + ZI Data


<think>根据引用[1],C语言编译后的汇编代码是编译器按照规则和优化策略生成的,而纯汇编代码可以由程序员自由组织逻辑。在ARM单片机中,程序编译后的大小是开发者关心的一个指标,因为它直接影响单片机的存储资源占用情况。对于ARM单片机(如使用Cortex-M系列的MCU),编译后程序大小的组成通常由以下几部分组成:1.代码段(TextSegment):存放程序执行代码的区域,包括ARM指令或Thumb指令。2.据段(DataSegment):存放已初始化的全局变量和静态变量。3.未初始化据段(BSSSegment):存放未初始化的全局变量和静态变量,程序加载时会被初始化为0。4.只读据段(Read-OnlyDataSegment):存放常量字符串等只读据。编译后显示的程序大小一般会以如下形式显示:-Code:代码段大小-RO-data:只读据大小(包括字符串常量等)-RW-data:已初始化的可读写全局变量大小(在运行时需要被复制到RAM)-ZI-data:未初始化的全局变量大小(在运行时初始化为0的变量所占用空间)其中:-FLASH占用=Code+RO-Data+RW-Data-RAM占用=RW-Data+ZI-Data解析方法:1.查看编译输出:编译器(如ARMCC、GCC)在编译后会输出程序各部分的大小。例如KeilMDK的输出格式如下:```ProgramSize:Code=xxxxRO-data=xxxxRW-data=xxxxZI-data=xxxx```2.使用map文件分析:map文件中会详细列出每个模块占用的代码空间、据空间,以及全局变量和静态变量的分配情况,从而可以定位占用较大的模块或变量。在分析程序大小时,可参考以下思路:-优化代码段:减少不必要的功能,使用更高效的算法,使用编译器的优化选项(如-Os优化大小)。-优化常量据:尽量使用压缩格式存储字符串等常量据。-减少全局变量:避免过多全局变量,特别是大的组或结构体。-注意库函使用:部分库函(如printf)会占用大量空间,可以考虑使用简化版本。引用[5]提到了PUSH和POP指令的栈操作顺序,虽然与程序大小无直接关系,但涉及到函调用时的栈操作,也会影响程序运行效率。</think> 根据引用内容及ARM体系结构,编译后程序大小(Program Size)的分析解析如下: ### 程序大小的组成结构 编译后的程序大小主要分为4个核心部分: 1. **Code (代码段)** - 存放所有可执行的ARM指令(如算术操作、分支跳转等) - 包含编译后的机器码和函体 - 固定占用Flash空间 2. **RO-data (只读据段)** - 存储常量据(如字符串常量、const全局变量) - 包含中断向量表等只读结构 - 固定占用Flash空间 3. **RW-data (已初始化读写据段)** - 包含初始化非零值的全局/静态变量(如 `int g_val = 5;`) - Flash中存储初始值,运行时加载到RAM - **占用双重空间**:Flash(初始值)+ RAM(运行值) 4. **ZI-data (零初始化据段)** - 存储默认零值的全局/静态变量(如 `int g_arr[100];`) - 程序启动时由启动代码初始化为0 - **仅占用RAM空间** ### 空间占用计算公式 - **Flash总占用 = Code + RO-data + RW-data** - **RAM总占用 = RW-data + ZI-data** ### 深度解析方法 1. **编译输出分析**(如Keil MDK): ``` Program Size: Code=10240 // 10KB指令 RO-data=512 // 512B常量 RW-data=256 // 256B初始化变量 ZI-data=4096 // 4KB零初始化变量 ``` → Flash占用:10240+512+256 = 11008 Bytes → RAM占用:256+4096 = 4352 Bytes 2. **Map文件定位**(关键方法): - 检查内存区域分布(如引用[4]的地址分配) - 定位大内存占用的模块: ``` ModuleA.o(Text) 0x800 // 代码段占用2KB ModuleB.o(Data) 0x400 // 据段占用1KB ``` 3. **优化手段**: - 减少冗余代码:避免大组拷贝(引用[1]) - 压缩常量据:合并重复字符串 - 调整内存模型:启用 `-Os` 编译优化 - 变量优化:将大型ZI-data改为动态分配 4. **特殊区域分析**: - **启动代码**:包含栈指针初始化(引用[5]) - **中断向量表**:属于RO-data的核心部分 - **对齐填充**:地址对齐导致的空隙(增加Code大小) ### 案例分析 若发现ZI-data异常增大: 1. 检查全局组声明:`static char buffer[2048];` 2. 确认是否需要动态分配:改为 `malloc(2048)` 3. 效果:ZI-data减少2KB → RAM节省2KB > **注**:栈空间(Stack)和堆空间(Heap)通常不包含在基础统计中,需单独配置(引用[3]启动流程) --- **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值