0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Keil、 IAR编译存储相关说明及拓展

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-20 11:38 次阅读

写在前面 Ⅰ

Keil、IAR编译(Build)窗口打印出来的信息

Program Size:Code=2596RO-data=268RW-data=44ZI-data=1028

72 765 bytes ofreadonly codememory

3 508 bytes ofreadonly datamemory

20 202 bytes ofreadwrite datamemory

5 676 bytes ofCODEmemory

926 bytes ofCONSTmemory

1 148 bytes ofDATAmemory

相信大家都看到过上面的信息,应该都知道它们大概的意思,但关于存储这一块的细节知识又有多少朋友去深入理解过呢?

要知道代码、常量、全局、局部变量存储在哪儿,就需要了解FLASH和RAM的一些特性,在工程中要具体分析其大小及对应存储地址,可以从map文件中分析。

简要说明其意思 Ⅱ

为了照顾大部分人,简要说一下上面打印信息的意思。微主这里提醒一下大家,网上也有一大堆相关资料,但网上好些资料说的有歧义,可能会误导大家,如:RW-data为已初始化的全局变量。加了static修饰的变量叫静态变量,和全局变量还是存在差别,但已初始化的静态变量也会归为RW-data中。

1.Keil编译窗口信息

Program Size:Code=2596RO-data=268RW-data=44ZI-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 ofreadonly codememory

3 508 bytes ofreadonly datamemory

20 202 bytes ofreadwrite datamemory

编译单个文件(点击Compile),会出现下面信息(若没有DATA就没有那一行):

5 676 bytes ofCODEmemory

926 bytes ofCONSTmemory

1 148 bytes ofDATAmemory

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

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • IAR
    IAR
    +关注

    关注

    5

    文章

    319

    浏览量

    36310
  • keil
    +关注

    关注

    68

    文章

    1196

    浏览量

    165434
  • 编译
    +关注

    关注

    0

    文章

    616

    浏览量

    32404
收藏 人收藏

    评论

    相关推荐

    IAR编译环境使用小技巧(2)

    IAR下出现abort handle或hardware fault后,如何处理
    的头像 发表于 12-13 13:29 509次阅读
    <b class='flag-5'>IAR</b><b class='flag-5'>编译</b>环境使用小技巧(2)

    实战经验 | KeilIAR、CubeIDE 中变量不被初始化方法

    关键词:不被初始化,编译环境 目录预览 1、前言 2、IAR 实现变量不初始化方法 3、Keil 实现变量不被初始化方法 4、CubeIDE 实现变量不初始化方法 01 前言 有些时候在我们的应用过
    的头像 发表于 11-24 18:05 1016次阅读

    请问Helix的汇编文件有没有IAR版本的?

    现在做个可以播放mp3文件的东西,参考原子的资料还有网上下载的都是keil版本,mdk编译工程速度实在太慢,习惯IAR了,哪里可以找到IAR版本的Helix?
    发表于 11-09 07:12

    Maxim开发环境是什么?支持keiliar

    Maxim开发环境是什么?支持keiliar
    发表于 11-09 06:59

    STM32通过命令行编译和下载keilIAR工程的方法

    STM32通过命令行编译和下载keilIAR工程的方法
    的头像 发表于 10-31 17:01 980次阅读
    STM32通过命令行<b class='flag-5'>编译</b>和下载<b class='flag-5'>keil</b>和<b class='flag-5'>IAR</b>工程的方法

    keil好用还是iar好用?

    之前操作stm32,一直用keil的mdk5编译环境。最近开始弄智能车比赛,发现飞卡的kinetis类的芯片基本上大家都用的是iar环境。就想问一下这两者之间的区别是怎么样的?哪个更好用一些呢?
    发表于 10-31 07:14

    Keil_IAR项目内Jlink无法找到IC的解决方案

    Keil_IAR项目内Jlink无法找到IC问题Keil 或者IAR 项目内Jlink 无法找到IC 问题(编译环境问题)
    发表于 10-19 07:55

    keil自动化编译脚本

    这是一个 keil 的自动化编译脚本,可被其他脚本或程序调用,接收参数并按参数编译 keil 工程,而不必打开 keil 软件,实现程序上的
    的头像 发表于 10-16 17:04 605次阅读
    <b class='flag-5'>keil</b>自动化<b class='flag-5'>编译</b>脚本

    IAR的工程怎么移植到keil

    IAR的工程怎么移植到keil
    发表于 09-21 07:48

    Keil修改ARM编译器及配置方法

    Keil MDK自 V5.36 版本之后,默认就不带 Arm Compiler V5版本编译器。如果需要使用 V5 版本编译器,就需要自己下载并安装。
    发表于 09-19 10:41 2270次阅读
    <b class='flag-5'>Keil</b>修改ARM<b class='flag-5'>编译</b>器及配置方法

    Mini51DE_Series_BSP_CMSIS_v3.02.000在IAR编译报错是为什么?

    IAR 8.32 编译时报如下错误: Error[Pe235]: variable \"__stdout\" was declared with a
    发表于 08-22 07:38

    为什么KeilIAR更受欢迎

    说起KeilIAR,你可能觉得这种集成开发环境界面比较古老,又不好用。但这里告诉大家一个事实: 不管是单片机初学者、还是开发者,使用KeilIAR的占比相对其他工具都要高,而且,不
    的头像 发表于 08-01 11:05 949次阅读
    为什么<b class='flag-5'>Keil</b>比<b class='flag-5'>IAR</b>更受欢迎

    为什么IAR编译器对开源ISA:RISC-V业务至关重要?

    为什么IAR编译器对开源ISA:RISC-V业务至关重要? 演讲ppt分享
    发表于 07-14 17:15 2次下载

    IAR支持中文了,keil还会远吗?

    相信最近有访问 IAR 官网的小伙伴已经看到了,其实,我最早发现 IAR 支持中文,是在前段时间下载 IAR EWARM V9.40 的时候。
    的头像 发表于 07-04 09:26 1268次阅读
    <b class='flag-5'>IAR</b>支持中文了,<b class='flag-5'>keil</b>还会远吗?

    Keil为啥比IAR更受欢迎?

    其实,还有一个现象可以说明KeilIAR是单片机的主力开发工具,那就是很多MCU厂商推荐使用的IDE,或者提供代码例程就是Keil,或者IAR
    的头像 发表于 06-26 15:23 1069次阅读
    <b class='flag-5'>Keil</b>为啥比<b class='flag-5'>IAR</b>更受欢迎?