当前位置:网站首页>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"优化成一个地方。
}
边栏推荐
- export , export default, import complete usage
- interface
- 使用navicat连接mysql数据库时常报的错误:2003、1698、1251
- Universal js time date format conversion
- 向量叉乘的几何意义及其模的计算
- Camera coordinate system, world coordinate system, pixel coordinate system conversion, and Fov conversion of OPENGLDEFocal Length and Opengl
- STL源码剖析:class template explicit specialization代码测试和理解
- 2020 ACM | MoFlow: An Invertible Flow Model for Generating Molecular Graphs
- Go 使用 freecache 缓存
- DNS domain name resolution services
猜你喜欢
随机推荐
RAID disk array
阿里二面:Sentinel vs Hystrix 对比,如何选择?
B站崩了,如果是你是那晚负责的开发人员你会怎么做?
[硬核干货]由0到1,突破信息系统项目管理师(呕心沥血经验之谈)!!!
bean的生命周期
《心智社会》—马文·明斯基
向量的导数运算和向量叉乘以及点乘的导数运算
MySQL master-slave replication configuration construction, one step in place
interface
No, the Log4j vulnerability hasn't been fully fixed yet?
DHCP principle and configuration
首届人工智能安全大赛正式启动
Station B collapsed, what would you do if you were the developer in charge that night?
Playing script killing with AI: actually more involved than me
C#的访问修饰符,声明修饰符,关键字有哪些?扫盲篇
The calculation of the determinant of the matrix and its source code
Required request body is missing problem solving
go : 使用gorm查询记录
Ali two sides: Sentinel vs Hystrix comparison, how to choose?
[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及









