一、设置:
1、怎么设置可以查看单片的内存(消耗)使用状况?
IAR的菜单栏 -->Tools -->IDE Options -->Messages -->Show build messages选择 ALL
设置完后IAR点MAKE,没有error的话最后会在Message框显示代码的大小
(菜单栏-->View-->Maessge-->Build)
1. Tools->option->messages show build messages设置成all
这样可以在编译后看到用了多少个RAM多少Code,中间每个文件使用情况也可以看得到。
2. Project->Options...(Alt-F7))的Linker->List中勾选Generate linker map file
这样可以生成map文件,这个就更详细了(需要什么自己勾选)。
3. Project->Options...(Alt-F7))的C/C++ compile ->List中勾选output list file
这样可以看到每个文件编译的细节的list文件,还可以看到反汇编(需要什么自己勾选)。
二、编译信息
1、 下面什么意思
4 960 bytes of CODE memory 4 150 bytes of DATA memory 44 bytes of CONST memory |
4 960 个字节的代码(占FLASH)
4150 个字节的变量数据(占RAM)
44 个字节的常量数据(占FLASH)
生成bin文件的大小= 4960+44
1、
9 486 bytes of CODE memory
404 bytes of DATA memory (+ 36 absolute )
520 bytes of CONST memory
1、的括号内表示内存的绝对使用量,对应你设的全局变量大小
2、表示共享的存储空间,和单片机的结构有关
2、2011年5月提问:
9 176 bytes of CODE memory (+ 30 bytes shared)
568 bytes of CONST memory (+ 18 148 bytes shared)
943 bytes of DATA memory (+ 114 bytes shared)
答:"+ 114 bytes shared"或linking后的"+114 bytes absolute"指的是您在程序中有144bytes 使用@ operator 或 #pragma location=operator 或__no_init volatile语法定义的数据。也可以说是可以在汇编中定义的数据。举例:P1OUT在430头文件中就用到了上述语法,当您读写P1OUT时,编译器和链接器就认为您使用了一个上述sahred/absolute数据。
编译器和链接器并不能真正地辨认出什么是RAM什么是Flash,它们使用DATA(没有指定固定的数据)和CONST/CODE(有指定固定的数据)概念来工作。
http://zhidao.baidu.com/question/268793362.html
在软件仿真下,可以看到整个程序走的时间,当语言然能看到C语言的时间了,单步走,就知道一条C的CPU周期,乘周期时间125NS ,就是一条指令的周期了!
2012.2.20 IAR 查看程序指令代码所花的时间
软件仿真设置:Project————Options————Debugger————Driver选Simulator就可以了。
然后View——Regstrers 的CPU Regstrers的CYCLECOUNTER 的值!
软件仿真时计算两断点CYCLECOUNTER(在CPU registers中)的差值,乘以指令周期(MCLK)
2012.6.28 各函数运行速度比对
原文:http://www.iartools.com/Info_ArticleList_Show.asp?ArticleId=147
1、在VIEW中选择PROFILING开打刨析记录。启动程序全速运行,当运行到一个断点或程序结束时,窗口中将显示对当年程序所有函数运行的刨析记录结果
2、代码覆盖分析:
代码覆盖分析用于帮助用户确认是否所有程序代码都得到执行,这对于鉴别程序代码中是否有不能被执行的部分特别有用。打开VIEW-CODE COVERAGE窗口,如图9显示的是当前代码覆盖分析状态报告,即哪部分代码在分析开始后至少执行了一次。
3、C-SPY可以在调试过程中随时显示整个调用链,跟踪显示当前调用函数内容,以方便调试和修改源代码中的错误。在VIEW-CALL STACK打开调用堆栈窗口其中显示的是程序调用过程中函数调用的列表。并将当前函数置顶。
4、增加调试功能
Debugger选项配置中的 Plugins选项卡,用于指定在调试阶段需要加载的C-SPY插件模块并启动其功能。例如选用实时操作系统RTOS插件模块,应用任务列表,队列等RTOS特定组件,可以使用户对基于实时操作系统上的应用程序有更全面的控制功能,同时使调试任务变的更轻松。
三、跳到函数、变量定义、Go to definition of
一般IAR默认是不可以能过右键直接查找变量、函数的定义的。
方法1、 你选中一个函数名在上面点右键发现“Go to definition of ……”是灰色的,无法找到函数的定义处。但是,IAR是支持快速查找变量、类型、函数甚至是宏定义功能的。设置方法如下:
1、打开工程,在菜单栏的【TOOLS】项下,选择【options...】
2、弹出的IDE options对话框中选择Project选项卡,勾选“Generate browse information"
3、设置完点击【确定】即可生效。
这时再来查找函数的定义,查找时先将鼠标在函数名上双击,定位光标到函数名字串,再右键弹出快捷菜单。发现原先灰色的“Go to definition of uart0Send”选项已经可选了。在单击“Go to definition of dummyInterrupt”后,IDE界面直接跳转显示到函数定义的地方。
方法2、
在工程的C编译器选项里的预编译添加$TOOLKIT_DIR$inc可以搞定。
深入剖析之通过IAR MAP文件查看目标文件内存分配
查看映象文件
检查project1.map文件,观察段是如何定义以及代码是怎样放置在存贮器中的。一个映象文件主要包含以下几点信息:
header包含连接选项;
CROSS REFERENCE段显示程序开始段的地址;
RUNTIME MODEL段显示运行模式的相关属性;
MODULE MAP显示被连接的文件。对每个文件而言,模块信息都作为程序的一部分被加载和显示,包括段标号和各段中定义的全址标号。
SEGMENTS IN ADDRESS ORDER 部分列出了所有构成用户的程序的段。
至此,project1.d90程序已经可以在IAR C-SPY调试器中运行了。
http://blog.chinaaet.com/detail/27117.html
map文件(内存映射文件)可能初手开发的时候甚少有去关注它的,甚至好些都不知道它是干嘛的,呵呵,只有一些有经验的老手或者搞移植搞深入研究的才会去查看它,初手往往上来就是在线调试、查看内存(这个都很少用)、看寄存器、断点(这个用的也少)等等,但是等你了解了map文件,再去完成上述调试的时候会让你事半功倍,且有一种运筹帷幄的感觉都不夸张。哈哈,说的这么多,还是上图介绍吧(俺还是喜欢图文并茂的感觉,话说乔布斯以前在每次开苹果新品展示会的时候,你看见的绝对大多数是图片形式的演讲稿,因为乔大爷深谙这个道理,估计这也是为什么iOS,Mac OS都是UI强大的原因吧):
首先当然要生成map文件了,注意IAR的默认设置是不生成map文件的,我们需要手动设置一下,如下图,然后点击准备就绪之后编译即可在$PROJ_DIR$FLASH_256KB_PFLASHList文件夹下找到:
生成之后,我们在IAR环境下打开它(当然可以以记事本直接打开,这里为了更直观),map文件主要由以下几部分构成:
(1)文件头中显示链接器版本,输出文件名,MAP 文件名以及链接器命令行等。
(2)RUNTIME MODEL ATTRIBUTES 部份显示 Endian 等属性;
(3) PLACEMENT SUMMARY 部份显示各sections 在存储器中的分布;
(4)INIT TABLE 部份显示与初始化有关的section tables;
(5)
MODULE SUMMARY 部份显示所有被连接的文件信息,包括目标文件和库文件等;
(6)
ENTRY LIST 部份给出了所有函数的入口地址及其所在的目标文件。
(7)文件尾中显示了总的代码和数据字节数(
想看下最后目标代码占用多少Flash和多少RAM的可以从这里查到)。
本篇就挑出我们在调试的时候常常会考虑到用到的几个部分,当然有兴趣的可以每个部分都可以看看,会让你受益匪浅的,下面就分部分介绍下:
(1)
PLACEMENT SUMMARY,该部分主要显示目标代码在芯片内部的存储器映射地址,可能会有人疑问为什么会分配到这些地址的呢,其实这些地址分配都是在前文讲的Linker文件(*.icf文件)里预定义好了,IAR根据所选目标芯片就按照该定义分配地址段,然后烧写进Flash,具体段定义可以到大前篇博客icf文件说明详细了解。
(2)
ENTRY LIST,开发工程内所有函数的入口地址,个人觉着这部分很有用,通过该地址映射再结合调试的时候观察内存空间可以方便整个工程执行情况,让你了若指掌,而且也方便你解读一个陌生程序的功能(例如参考别人的例程,网上的例程之类的),总之个人觉着这个部分用处很大,有心人可以在此处做很大文章。
(3)这是map文件末尾部分,最后给出了整个工程文件占用的资源情况,即芯片内部Flash和RAM的使用情况,便于你对工程开发规模上的掌握,最后给出工程编译链接输出信息。
仅通过崩溃地址找出源代码的出错行
编译地址分配:
在IAR窗口中,点击view》memory ,在内存窗口,点下拉框选择 SER 可知,SFR地址为
0x0000-0fff
RAM地址为:0x1c00-5bff
FLASH地址:0x5c00-45bff
结合看下面的地址分配图,即可知道各部分代码和数据被分配到什么地方。
****************************************
*
*
*
SEGMENTS IN ADDRESS ORDER
*
*
*
****************************************
SEGMENT
SPACE
START ADDRESS
END ADDRESS
SIZE
TYPE
ALIGN
=======
=====
=============
===========
====
====
=====
DATA16_AN
0102 - 0103
2
rel
0
0120 - 0121
2
0140 - 0141
2
0144 - 0145
2
015C - 015D
2
0168 - 016F
8
020A - 020B
2
0222 - 0225
4
0228 - 0229
2
0242 - 0245
4
024A - 024B
2
026A - 026B
2
0282 - 0285
4
028A - 028B
2
02A2 - 02A5
4
02A8 - 02A9
2
0340 - 0341
2
0350 - 0351
2
0380 - 0387
8
0392 - 0397
6
03AE - 03AF
2
03C0 - 03C3
4
03D2 - 03D3
2
0640 - 0641
2
0646 - 0648
3
064C - 064C
1
064E - 064E
1
065C - 065D
2
DATA20_I
1C00 - 1E26
227
rel
1
DATA20_Z
1E28 - 28B7
A90
rel
1
CSTACK
5400 - 5BFF
800
rel
1
//-------------------------------------以下为编译到FLASH的代码---------------------------
CSTART
5C00 - 5C2F
30
rel
1
ISR_CODE
5C30 - 5E63
234
rel
1
<CODE> 1
5E64 - D123
72C0
rel
1
INTVEC
FF80 - FFF9
7A
com
1
RESET
FFFE - FFFF
2
rel
1
DATA20_C
00010000 - 00019486
9487
rel
1
DATA20_ID
00019488 - 000196AE
227
rel
1
****************************************
*
*
*
END OF CROSS REFERENCE
*
*
*
****************************************
30 112 bytes of CODE
memory
5 303 bytes of DATA
memory (+ 81 absolute )
38 574 bytes of CONST memory
Errors: none
Warnings: none
:2477