Keil编译大小和存储说明

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"优化成一个地方。

}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LG小龙哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值