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

    文章

    400

    浏览量

    38333
  • keil
    +关注

    关注

    69

    文章

    1224

    浏览量

    171777
  • 编译
    +关注

    关注

    0

    文章

    687

    浏览量

    34935
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Keil5中查看栈大小

    :打开生成的.map文件,在Image Symbol Table部分查找栈的相关信息,包括栈的大小和使用情况。 3、利用IDE的功能: 方法说明Keil编译器在
    发表于 11-14 06:32

    DDR存储拓展教程

    的XC7A200T系列,他们的开发板FPGA型号也和我们今年比赛用板有很大的不同。这些地方都需要我们仔仔细细地阅读源码去做平台的移植工作。 三、平台移植 关于DDR的拓展工程都在yrtl
    发表于 10-28 07:25

    GD32F470使用__attribute__语句,keil编译通过但是scons编译不通过,为什么?

    问题语句: uint16_t ltdc_lcd_framebuf0[800][480] __attribute__((at(LCD_FRAME_BUF_ADDR))); 上述语句在keil编译
    发表于 10-14 06:05

    文件系统,使用iar编译报错,gcc可以正常编译,为什么?

    文件系统,使用iar编译报错,gcc可以正常编译,为什么?
    发表于 09-23 06:54

    如何解决在 Keil编译时出现 FILE DOES NOT EXSIT 错误?

    如何解决在 Keil编译时出现 FILE DOES NOT EXSIT 错误?
    发表于 08-25 08:25

    Keil / IAR 开发环境下的 Debug 模式下,用户是否可以在空闲 ru 期间立即添加新的断点?

    Keil / IAR 开发环境下的 Debug 模式下,用户是否可以在空闲 ru 期间立即添加新的断点
    发表于 08-21 07:56

    请问如何在 Keil μVision 或 IAR EWARM 中使用观察点进行调试?

    如何在 Keil μVision 或 IAR EWARM 中使用观察点进行调试?
    发表于 08-20 06:29

    求助,关于NanoEdge AI Studio生成的库交叉编译器版本疑问求解

    20231009\", 那么问题来了,怎么在NanoEdge AI Studio设定交叉编译器呢,比如设置为armcc、armclang、iccram,因为我需要将库加到keil或者iar工程里面。 看样子这个软件生成的库是a
    发表于 08-08 07:25

    IAR Arm开发工具链中--function_sections编译选项的使用

    本文主要介绍在IAR Arm开发工具链中不修改源代码的情况下使用‑‑function_sections编译选项把函数放到单独的section。
    的头像 发表于 06-13 13:53 1506次阅读
    在<b class='flag-5'>IAR</b> Arm开发工具链中--function_sections<b class='flag-5'>编译</b>选项的使用

    使用RASC生成Keil工程

    手动新建一个名为“Workspace_Keil”的文件夹,并将该文件夹作为我们的工作空间,我们的所有Keil工程都会放在这个文件夹里面。值得注意的是:为了避免编译错误,该工作空间文件夹必须放在全英文的路径下,不能包含有中文字符。
    的头像 发表于 05-15 14:46 874次阅读
    使用RASC生成<b class='flag-5'>Keil</b>工程

    没有keil如何编译ccg5工程?

    没有keil如何编译ccg5工程? 我可以使用 cubeIDE 作为 arm 工具链吗
    发表于 05-12 07:36

    Keil MDK到IAR EWARM:通过工程迁移实现项目资产的更好管理

    对于需要统一开发环境或涉及多核架构(如Cortex-A/R)的项目,越来越多的用户选择从Keil MDK迁移到IAR EWARM。这就会面临着需要将之前的Keil MDK工程迁移到IAR
    的头像 发表于 05-08 09:03 994次阅读
    从<b class='flag-5'>Keil</b> MDK到<b class='flag-5'>IAR</b> EWARM:通过工程迁移实现项目资产的更好管理

    Keil uVision 5安装包下载,详细安装教程~

    、点击Close关闭授权窗口。 15、软件安装与激活全部完成。 Keil5使用说明 确保已安装proteus及对应开发环境(Keil for ARM或IAR)。 安装对应驱动:
    发表于 03-15 12:10

    STM32CubeIDE编译设置是否有像keil一样有编译后执行Bat脚本的功能和设置?

    STM32CubeIDE编译设置问题,是否有像keil一样有编译后执行Bat脚本的功能和设置?或者有相关的脚本和插件?
    发表于 03-14 15:59

    Keil编译为什么很慢?

    Keil编译为什么很慢?
    发表于 03-07 16:24