当前位置:网站首页>Keil编译大小和存储说明
Keil编译大小和存储说明
2022-07-30 05:51:00 【电子龙】
Keil、IAR编译(Build)窗口打印出来的信息:
Program Size: Code=2596 RO-data=268 RW-data=44 ZI-data=1028
72765 bytes of readonly code memory
3508 bytes of readonly data memory
20202 bytes of readwrite data memory
5676 bytes of CODE memory
926 bytes of CONST memory
1148 bytes of DATA memory
相信大家都看到过上面的信息,应该都知道它们大概的意思,但关于存储这一块的细节知识又有多少朋友去深入理解过呢?
要知道代码、常量、全局、局部变量存储在哪儿,就需要了解FLASH和RAM的一些特性,在工程中要具体分析其大小及对应存储地址,可以从map文件中分析。
为了照顾大部分人,简要说一下上面打印信息的意思。这里提醒一下大家,网上也有一大堆相关资料,但网上好些资料说的有歧义,可能会误导大家,如:RW-data为已初始化的全局变量。加了static修饰的变量叫静态变量,和全局变量还是存在差别,但已初始化的静态变量也会归为RW-data中。
1.Keil编译窗口信息
Program Size: Code=2596 RO-data=268 RW-data=44 ZI-data=1028
Code:指代码的大小;
Ro-data:指除了内联数据(inline data)之外的常量数据;
RW-data:指可读写(RW)、已初始化的变量数据;
ZI-data:指未初始化(ZI)的变量数据;
Code、Ro-data:位于FLASH中;
RW-data、ZI-data:位于RAM中;
提醒:RW-data已初始化的数据会存储在Flash中,上电会从FLASH搬移至RAM中。
关系如下:
RO Size = Code + RO Data
RW Size = RW Data + ZI Data
ROM Size = Code + RO Data + RW Data
2.IAR编译窗口信息
IAR存在两种情况,但意思都差不多,只是显示不一样:
编译工程(点击Make),会出现如下信息:
72 765 bytes of readonly code memory
3 508 bytes of readonly data memory
20 202 bytes of readwrite data memory
编译单个文件(点击Compile),会出现下面信息(若没有DATA就没有那一行):
5 676 bytes of CODE memory
926 bytes of CONST memory
1 148 bytes of DATA memory
readonly code:代码大小(类似于CODE);
readonly data:常量数据(类似于CONST);
readwrite data:可读写变量数据(类似于DATA);
说明:
IAR中的Data相当于Keil中RW Data + ZI Data
内存(RAM)分配
本节扩展一下RAM的一些知识,有助于大家对程序运行时RAM的情况。
内存分为5类:
1、栈区(stack): 由编译器自动分配和释放 ,存放函数的参数值,局部变量的值等。
2、堆区(heap) : 一般由程序员(使用malloc)分配和(使用free)释放, 若程序员不释放,则一直被占用。一般来说,单片机类的程序一般没有使用堆。
3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
4、文字常量区(const) :常量字符串就是放在这里的。
5、程序代码区 (code): 存放函数体的二进制代码。
经典例子:
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main(void)
{
int b;// 栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; 123456\0";//在常量区,p3在栈上。
static int c =0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
边栏推荐
- go : go-redis 基础操作
- (GGG)JWT
- 空间顶点到平面的距离计算的证明及其源码
- Redis download and installation
- LVM and disk quotas
- Electron使用romote报错 : Uncaught TypeError: Cannot read property ‘BrowserWindow‘ of undefined
- MySQL题外篇【ORM思想解析】
- 让百度地图生成器里的“标注”内容展开--解决方案
- window.open()的用法,js打开新窗体
- The newcomer deleted data by mistake, and the team leader skillfully used MySQL master-slave replication to delay the recovery of losses
猜你喜欢

VR机器人教你如何正确打乒乓球

阿里二面:Redis有几种集群方案?我答了4种

What new materials are used in the large aircraft C919?

华为发布“十大发明”,包含计算、智能驾驶等新领域

Pioneer in Distributed Systems - Leslie Lambert

New material under the plastic restriction order - polylactic acid (PLA)

Go 结合Gin导出Mysql数据到Excel表格
![[硬核干货]由0到1,突破信息系统项目管理师(呕心沥血经验之谈)!!!](/img/9a/f3e4bdd0ce8ec153a8e6bdbff5647e.jpg)
[硬核干货]由0到1,突破信息系统项目管理师(呕心沥血经验之谈)!!!

STL源码剖析:bound friend template friend代码测试和理解

LVM and disk quotas
随机推荐
idea built-in translation plugin
学生成绩管理系统(C语言)
空间顶点到直线的距离计算及其源码
The introduction of AI meta-learning into neuroscience, the medical effect is expected to improve accurately
bin文件夹下的roslyn文件夹
assert
Go 使用mencached缓存
进制转换。。。
Ali Ermian: How many cluster solutions does Redis have?I answered 4
go : 使用gorm修改数据
No, the Log4j vulnerability hasn't been fully fixed yet?
go : 使用 grom 删除数据库数据
[硬核干货]由0到1,突破信息系统项目管理师(呕心沥血经验之谈)!!!
LVM and disk quotas
雷总个人博客看到
2020 数学建模之旅
Rodrigues: vector representation of rotation matrices
和AI一起玩儿剧本杀:居然比我还入戏
How to understand plucker coordinates (geometric understanding)
go : 使用gorm查询记录