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

    文章

    358

    浏览量

    36837
  • keil
    +关注

    关注

    69

    文章

    1214

    浏览量

    167473
  • 编译
    +关注

    关注

    0

    文章

    663

    浏览量

    33100
收藏 人收藏

    相关推荐

    如何获取入口函数不是__iar_program_start的Program entry的stack使用情况

    entry的stack使用相关信息: 如果对应启动代码没有使用默认的入口函数__iar_program_start,需要使用--entry链接器选项指定对应的入口函数(以使用入口函数
    的头像 发表于 11-25 16:23 426次阅读
    如何获取入口函数不是__<b class='flag-5'>iar</b>_program_start的Program entry的stack使用情况

    分享一个keil MDK编译信息增强工具

    今天给大家分享一个 keil MDK 编译信息增强工具:keil-build-viewer. 1 keil-build-viewer介绍 这是一个
    的头像 发表于 11-14 11:01 792次阅读

    Keil编译器优化方法

    我们都知道,代码是可以通过编译器优化的,有的时候,为了提高运行速度或者减少代码尺寸,会开启优化选项。
    的头像 发表于 10-23 16:35 926次阅读
    <b class='flag-5'>Keil</b><b class='flag-5'>编译</b>器优化方法

    GD32F103 KeilIAR pack包

    电子发烧友网站提供《GD32F103 KeilIAR pack包.rar》资料免费下载
    发表于 10-15 17:25 154次下载

    keil编译后报错redefinition的原因?怎么解决?

    keil编译后报错redefinition如何解决?
    发表于 09-27 06:15

    怎样将keil中的程序导出

    1. 准备工作 在开始导出程序之前,需要确保已经完成了以下准备工作: 安装Keil MDK-ARM软件。 创建一个新的项目,并添加所需的源文件和库文件。 配置项目设置,包括芯片型号、编译器选项、链接
    的头像 发表于 09-02 10:23 2108次阅读

    Keil中变量不被初始化方法

    介绍使用KeilIAR和CubeIDE的操作方法,本文中所用芯片为:STM32G431RBT6。Keil中没有这个关键字,而且会有版本的区别,下面分别介绍:为了防
    的头像 发表于 08-30 11:47 863次阅读
    <b class='flag-5'>Keil</b>中变量不被初始化方法

    芯海通用 MCU应用笔记 :在 IAR 及 MDK 开发环境下使用 printf 函数重定向移植差异指南

    UART 口输出打印信息。在 IAR9.x版本下,IAR 官方已经不再支持 fputc 接口的重定向,此时若移植原 Keil 下代码,则无法在 IAR
    发表于 05-16 11:56

    请问如何编写.bin程序使用IAR或GreenHill将文件存储到外部存储器中?

    你好, 我们使用带有 CYT4DN 和 S25HS 外部存储器的自定义COOLDIM_PRG_BOARD 。 我们正在尝试闪存 .bin 图像 文件到外部存储器中。 因此,我想知道 IAR
    发表于 05-15 07:22

    X-CUBE-SPN7-1.0.0 MDK编译,电机抖动的原因?

    :en.X-CUBE-SPN7.zip,版本1.0.0 用keil MDK5 编译之后,烧录到开发板,电机无法启动,且抖动剧烈。但是没有找到原因。 网上说,IAR编译的代码能够正常
    发表于 05-09 07:47

    IAR for stm8编译很慢很慢有时候就无响应了是怎么回事?

    小弟第一次用这个编译器,IAR for stm8编译很慢很慢有时候就无响应了,有遇到过得吗?
    发表于 05-08 06:00

    ARM7使用IAR或者KEIL,设置中断优先级后,默认就是中断嵌套吗还是需要专门处理?

    使用IAR或者KEIL,设置中断优先级后,默认就是中断嵌套吗,还是需要专门处理?
    发表于 04-19 08:09

    keil如何生成带有编译日期的BIN文件?

    【求助】keil 如何生成带有编译日期的 BIN 文件
    发表于 04-18 08:13

    Keil使用AC6编译提示CUDA版本过高怎么解决?

    今晚搞 ToughGFX 最后快成功了 ,Keil 编译又提示: *** Using Compiler \'V6.14\', folder: \'D:Keil
    发表于 04-11 07:56

    iar中Optimizations设置为None或Low时编译不成功怎么解决?

    我在IAR仿真时发现某个变量突然会变化,想逐步看看哪里问题 于是把Optimizations设置为None或Low 结果编译不成功,信息为以下 Error[Li005]: no definition
    发表于 03-25 08:30