IAR使用技巧

2023-11-02

一、状态栏的解析
Compile:只对目前打开的c文件进行语法检查,不对它进行link;
Make:对工程所有打开的c文件进行语法检查和link(只编译有改动的文件或者设置变动的文件);
Rebuild All:编译链接当前工程(不管文件或者设置是否有变动);
Clean:清除当前工程的编译状态;
Batch buil:批量编译,打开Batch build 批量编译后,需要给批量编译起个名字,然后将本工程中的三个分类都添加到“Configurations to build”中,然后单击“Make” 就可以对这工程中的三个分类全部进行编译。
二、代码优化的设置

a.不优化,最适合调试,所有变量都可以看到;

b.Low类似于不优化,特别之处在于变量如果不再被使用时,即使仍然在有效的作用域内,调试时也观测不到;

c.中等优化的特点;

 d.高等级优化:最平衡、代码量优先(最少代码)、代码执行速度优先(最快速度运行),可以选择某一模式;

 

e.中高级优化可选额外配置: 

 

 

 

 

 编译后会把静态变量和全局变量地址重新组合,同一函数的变量地址尽量靠近,这样编译器就可以用同一个基址访问多个变量;

结论:优化选型次序是从低到高,从部分到全局;可以使用#pragma optimize预处理命令,可以精确调整单个c函数的编译器优化方向与级别;

有时,程序员希望不要调整运算的次序,不要编译器删除它自己认为没有用的代码,不要将变量分配在通用寄存器里等等,可以使用volatile对操作的对象进行申明;

三、关于头文件包含的位置:

四、 工具栏的解析:从左到右依次是:

  • 新建text文件;Ctrl + N
  • 打开text文件;Ctrl + O
  • 保存显示的文件;Ctrl + S
  • 全部保存
  • 打印;Ctrl + P
  • 剪切;Ctrl + X
  • 复制;Ctrl + C
  • 粘贴;Ctrl + V
  • undo the last action 撤销编辑 Ctrl + Z
  • redo the last undo action 恢复编辑 Ctrl + Y
  • 搜索框;Quick Search Text Box 快速搜索文本框;
  • 搜索上一个Shift + F3;
  • 搜索详细功能打开;
  • 搜索下一个;F3
  • 替换;Ctrl + H;
  • goto某一行某一列Ctrl + G ;
  • 上一个书签;跳转到上一个书签 Shift + F2;
  • 增加删除书签;标记/取消书签 Ctrl + F2;
  • 下一个书签;跳转到下一个书签 F2;
  • 跳转到上一步 Alt + 左箭头;
  • 跳转到下一步 Alt + 右箭头;
  • compile;Ctrl + F7;
  • make;F7;
  • 设置和删除断点;Ctrl + F9;
  • 仿真与下载程序;Ctrl + D;
  • 仿真不下载程序;

           1)书签:书签在编译的时候比较实用,可以快速找到标记书签所在行。可以使用快捷按钮,也可以使用快捷键。

      2)跳转到上/下一步:跳转是在编译代码通过跟踪代码留下的“脚步”,我们可以通过该方式找到这些“脚步”,同样也可以通过快捷键操作
  • 3)下载和调试:Download and Debug:是下载代码之后再进行调试。Debug without Downloading:只调试不下载。也就是说你之前下载过了代码,只需要再点击该按钮即可,否则会出现错误。
  •           对工程编译完的警告和错误进行定位查看方法;

五、API解释

Application Program Interface:函数接口,库是架设在寄存器和用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口;库开发的优点:开发速度快,可读性好;寄存器开发的优点:更直观,程序运行占用资源少;

六、启动文件.s的解析:

 启动文件是任何处理器在上电复位之后最先运行的一段汇编程序,在C代码运行之前,需要由汇编为 C的运行建立一个合适的环境;作用是:初始化堆栈指针SP、初始化程序计数器指针PC、设置堆栈的大小、设置异常向量表的入口地址、配置外部SRAM作为数据存储器地址(用户配置)、设置C库的分支入口main(用于调用main函数)、新版本的还可能调用系统函数配置时钟函数

七、字体的问题总结:

1、如何使用操作系统自带而IAR没有的字体?

常见的单片机开发环境,IAR和Keil使用较为广泛。相较于Keil,IAR在编译速度,编译效率,支持的芯片范围等一些方便具有优势。但是IAR的默认编辑界面视觉效果不友好,自带的字体有限,且基本上不怎么好看。但是可以设置出自己满意的字体;

在IAR的APPDATA文件目录中找到IarIdePm.ini文件,编辑选择自己要使用的字体名。其中Common是通用字体,TextEditor是编辑器代码字体。代码字体选用了Keil默认的;(在控制面板里找到字体名称)

 

 2、部分文件字体显示与设置的字体不一致?不要勾选“Auto-detect character encoding”

 八、IAR快捷键

1、显示行号:在代码段点击右键,找到Options->Editor,将右面的Show Line Numbers勾选上就可以了;

2、注释的快捷键:Ctrl+K;取消注释:Ctrl+Shfit+K;

3、Ctrl+Alt+V,可以使用IAR提供的内部代码的编写,如if语句;

4、格式化源码:选择代码段,然后CTRL + T;TOOLS->OPTIONS->EDITER->Auto Indent->CONFIGS;

注意:a,b,c三个参数;

5、程序{ }花括号的配对内容查找:智能选择光标所在括弧内的区域,CTRL + B则自动的把这段内容反色的选中;

6、自动往后:选中某些行,然后使用TAB键,可以实现自动的后退;

7、F9 光标处添加/删除断点;Ctrl+F9 使能/失能断点;

8、Ctrl + H替换字符串;

9、Ctrl + G跳到指定行;

10、Ctrl+Shift+F 在文件中搜索;

11、Ctrl+F4 关闭当前窗口打开的文件;

12、Ctrl+D进入下载程序和仿真页面;

13:逐行调试(单语句或者单函数):F10;

14:进入函数或者单行:F11;

15:程序全速运行:F5;

16:退出调试:Ctrl+Shift+D;

17:返回上个界面:Ctrl+Tab;解释:打开多个.c文件之后,进行.c文件查看切换;

18:代码左移:Shift+Tab;

19:取消Debugger(调试):Ctrl+shift+D;

20:自动补全:Ctrl+ Alt +Space;

九、IAR操作小技巧

1:复制和粘贴几行的部分代码(后半部分)  按住Alt键,再用鼠标拖动就可以复制和粘贴后半部分;

2:复制一行技巧   从上一行的最后开始复制,这样粘贴的时候只需要从放在最后就可以粘贴到下一行了;

3:有时IAR中右键不能跳转函数的问题;我们应该放在函数前面然后单击右键跳转,而不是选中函数!

4:在线调试:Live Watch

只有全局变量才可以在Live Watch中查看,可以实时看到变量的变化情况,刷新时间可以修改,在tool->option里设置;

5:Navigate导航功能  

可以通过“Go to…”功能直接跳转到当前源文件中的某一行、某一列的某一个字符的位置;还可以在程序的某一行设置标签“Toggle BookMark”,然后通过“Go to BookMark”跳转到标签的位置(上一个、下一个)

6:Find and Replace查找和替换功能  

查找和替换是我们在编程中使用最频繁的功能。如果定义的变量在多个文件中使用,但是在此时并不清楚这些变量的具体位置时,我们可以使用全局搜索功能,将变量的位置在Message中罗列出来,这样可以快速找到变量,加强了程序的可读性。这种情况适用于程序代码超多并且整个工程包含大量源文件时使用。具体步骤为:“Find and Replace”→ “Find in Files”在其中输入要查找的变量名或者字符串,然后点击“Find”即可。快捷键“Ctrl+Shift+F”。 

7:仿真几个试图调出方法

寄存器视图:View-->>Registers-->>Registers 1;

内存视图:View-->>Memory-->>Memory 1;

栈区视图:View-->>Stack-->>Stack 1;

Symbol存储视图:View-->>Symbolic Memory;

8:批量操作断点

前面打的√去掉可以暂时屏蔽断点功能,可以打钩再次恢复断点;

可以使能和禁止所有的断点;可以删除全部的断点;

9:调试期间修改程序,重新生成仿真方法

10:两种模式:Debug&Release  Release模式下不可以进行仿真(发布状态);

11:一个c文件拆分为4个窗口的方法;注:只在自己的.c文件中有用,拖动边界即可恢复界面;

 

12:全局静态变量查看

13:内存调出查看:地址的读取方式可选(16位、32位等等);注意小端模式和大端模式;

14:Call Stack(查看当前栈空间,既此时正在执行的函数及Context)的妙用,比MDK好用

注意:call back就是当前函数执行过程的空间展示;

在Debug模式下,IAR菜单栏选择View -> Call Stack,执行到某一断点,或者程序暂停时,就可以清晰的看到当前时刻的栈空间信息,既所调用的函数等信息;代码从复位函数开始执行,可以非常直观的看到函数的调用顺序,可以看到即将跳入的函数,在程序跑飞是特别好用,比如知道程序调到了某个硬件算法出错(比如数组越界、非法修改内存、未初始化就使用某个外设等等),那就在此处加个断点,然后通过这个call stack查到前面那个函数,就是有可能出问题的函数;

Call Stack可以让调试在没有运行损失的情况下显示完整的函数调用链。这通常会帮助我们确定目前函数的上下文,跟踪变量和参数中的不正确值的来源从而定位出现的问题。

当发生函数调用的时候,栈空间中存放的数据是这样的:

1、调用者函数把被调函数所需要的参数按照与被调函数的形参顺序相反的顺序压入栈中,即:从右向左依次把被调函数所需要的参数压入栈;

2、调用者函数使用call指令调用被调函数,并把call指令的下一条指令的地址当成返回地址压入栈中(这个压栈操作隐含在call指令中);

3、在被调函数中,被调函数会先保存调用者函数的栈底地址(push ebp),然后再保存调用者函数的栈顶地址,即:当前被调函数的栈底地址(mov ebp,esp);

4、在被调函数中,从ebp的位置处开始存放被调函数中的局部变量和临时变量,并且这些变量的地址按照定义时的顺序依次减小,即:这些变量的地址是按照栈的延伸方向排列的,先定义的变量先入栈,后定义的变量后入栈;

所以,发生函数调用时,入栈的顺序为:参数N、参数N-1、参数N-2…参数3、参数2、参数1、函数返回地址、上一层调用函数的EBP/BP、局部变量1、局部变量2…局部变量N

15:设置页面右边线的距离,可对齐注释等等,也提醒程序员一行不要太长,不然打印出来就会越界;

注意:Tab size和Indent size的设置,见上右图;

Tab size表示在非行头缩进时跳动的字节数量;Indent size表示缩进的字符宽度,一般设为4;

Tab key function里的Insert tab表示插入制表符;Indent with spaces表示插入空格,一般选这个,为了移植到别的编译器对齐;

16:虚拟空格,行末是否会出现虚拟的空格;

注:scan for changes files 表示去;外部编译器更改文件后自动加载到IAR软件里

注:show bookmarks 表示显示书签;

17:删除行末没有用到的空格

用于换行符\后删除空格,因为\后如果有空格的话会报错,一般和enable virtual space一起勾选;

十、调试快捷键按钮

a.步过,执行当前这句话,如果这句话是函数调用,就把整个函数执行完,停在下一句;

b.步进,执行当前这句话,如果这句话是函数调用,就进入到函数里,停在函数的第一句话;

c.步出,一直执行到从当前的函数返回,停在函数返回后的下一句话;

d.下一条语句,执行C语言的一条语句,停在下一句代码上,运行到下一语句和逐行运行类似;

e. 一直运行到光标所在行,并停在这一行上;

f.全速运行到遇到断点;

g.暂停调试,使正在奔跑的程序立定;

h.复位,指令指针回到开头;

###:注意事项总结

(1)变量的值在Debug时可以随时修改;

(2)在live watch里才可以实时查看全局变量的值的变化(全速运行时),在watch里全速运行时,全局变量反而无效 ;

 

(3)watch窗口里查看局部变量时,有时会显示err是因为局部变量在栈区,函数运行完销毁,不调用时无效;

(4)可以在IAR文件里直接修改工程名进行移植程序,可以打开工程文件名所在的位置,修改到对应的文件名上即可;

(5)软件右上角有个f()功能,可以查看当前c文件的所有函数;

 (6)debug里可以设置断点选择,一般如果选择硬件断点的话,不要超过3个(3个足够);也可以使用软件断点,但是软件断点跑起来比较慢,所以及时取消断点;

(7)空白部分显示点点点

   

(8)几个单词的解释

①Breakpoints:也就是断点;

②Disassembly:反汇编,也就是你写的程序经过编译烧写之后,在单片机中的样子;

③Memory:内存,可以查看全部内存中的数据,看起来就像一般的16进制编辑器;

④Symbolic Memory:符号内存,不但能看到内存数据,还能看出来对应程序中的什么变量;

⑤Register:寄存器,查看全部寄存器的内容;

⑥Watch:观察,可以根据你的需要,指定查看什么,根据楼主的经验,查看全局变量方便一些,在变量可见范围内,也可以查看局部变量和静态变量(static);

⑦Locals:查看函数局部(变量等)内容,包括函数的参数;

⑧Statics:查看静态内存变量,注意不是指静态变量(static),而是生命周期是整个程序生命期的变量,原则上不在堆栈中的局部变量,应该都是静态内存变量;

⑨auto:自动,指的不是C语言中的自动变量,而是指根据指令指针当前的位置,自动显示出相关的变量;

⑩Call Stack:调用栈,表示到当前位置的函数调用顺序图;

⑪Stack:栈,就是栈的数据表示;

(9)修改程序运行起点的方法:可以指定程序中IAR识别的任意标号或者函数名称;

在工程中Project>Options>Debugger>Setup>Run to;

(10)在反汇编窗口和内存窗口中快速定位函数位置和变量位置的方法:

我们经常需要在Disassembly窗口中找到指定函数的位置,或者需要在Memory窗口中找到指定变量的位置,一般情况下选中函数名称然后把函数名称拖放到Disassembly窗口,相关函数就会显示在Disassembly窗口中,也可以把变量名称用相同的操作显示在Memory窗口中。

(11)单步调试速度缓慢的问题的解决方法:

①硬件仿真系统需要为单步调试留下足够的硬件断点,在调试中的单步运行通常是用断点来实现的,通过把断点设置在下一个语句后,来完成单步调试的功能。硬件的断点数量是有限的,如果没有可用的硬件断点,调试器就会在每个汇编指令处停止一下,这样完成一条完整的语句的所有汇编代码越多时间就越长。

②在Trace和Function Profiling窗口中使用Enable/Disable按钮关闭数据跟踪功能。因为在每个单步之后要收集这些跟踪的数据,所以数据跟踪可能会降低单步的速度。需要注意的是,紧紧关闭相关的窗口是不能关闭数据跟踪功能的,必须通过Enable/Disable按钮来完成。

③只打开有限数量的SFR寄存器窗口,这可以通过2种方法实现。一种是通过在Watch窗口中手动输入SFR寄存器的名字;另一种是创建自定义的特殊功能寄存器组,操作步骤如下,Tools>Options>Register Filter>Use register filter;

④如果不需要Memory和Symbolic Memory窗口,关闭它们,因为在每个单步之后要读出这些内存数据,如果不需要Watch,Live Watch,Locals,Statics窗口,关闭它们,原因同上。

⑤关闭Stack窗口和相关的设置,Tools>Options>Stack,去掉Enable graphical stack display and stack usage tracking的选择;

⑥提高调试器和目标板的通讯速度;

(12)无法go to define的解决方法:

首先,Project -->Clean,清理所有编译信息,然后重新编译一下;然后等待编译完成,会看到右下角有个绿色的进度条在跑,这是IAR在同步所有的文件,建立联系,等待这个进度完成,就可以跳转了;

 (13)右键功能的几个解释

①Go to Definition of XXX: 查找XXX的定义 快捷键:F12

②Go to Declaration of XXX:查找XXX的声明

③Find All Reference to XXX:查找XXX所有被调用的地方

④Find All Calls to XXX : 查找所有调用XXX的函数(XXX必须是函数)

⑤Find All Calls from XXX :查找所有XXX调用的函数(XXX必须是函数)

(14)window窗口解释

1.Close Document:关闭选项卡(关闭选中的一个窗口)

2.Close Window:关闭某一窗口(比如工作空间、view里的某一示图)

3.Split:拆分窗口就是将一个窗口拆分为上下左右四个窗口

4.Move Tabs to New Vertical Editor Window:新建垂直编辑窗口

5.Move Tabs to New Horizontal Editor Window:新建水平编辑窗口

6.Move Tabs to the Next Window:移动标签去之后的窗口

7.Move Tabs to the Previous Window:移动标签去之前的窗口

8.Close All Tabs Except Active:关闭除了活跃的所有选项卡

9.Close All Tabs to the Right of Active:关闭活跃窗口右边所有标签

10.Close All Editor Tabs:关闭所有编辑选项卡

(15)使用数据断点的方法

选择要打断点的代码行,或在Memory中选中某一个要监测的数据,点击右键->Set Data Breakpoint:

在弹出页面选择该Data断点实现的条件,例如该Data的读、写,或者可以在Conditions中设置断点产生条件,如Data == 100时进入断点。以及通过Action 在断点执行时产生相应的动作。

(16)Set next statement:手动执行到某行代码

如果断点已经执行完,还想继续跳到该断点,或者想手动执行到某行代码,可以在断点处右键,选择Set next statement

(17)设置堆栈大小的方法

依次选择Linker -> config,然后点击Edit,选项卡选择Stack/Heap Size,编辑实际堆栈大小:更改后需要rebuild;

(18)如何静态查看程序Stack栈使用详情,以及栈深度?

在Option->linker中勾选Enable stack usage analysis,之后Rebuild编译完,可以在.map中查找Stack Usage栈使用分析;

上图分析:可以清晰的看到Program程序里使用最大的stack大小为1392bytes, Uncalled function(如中断)使用的stack大小为最大1824bytes和其他所占用的bytes。所以,程序里要设置比Program 1392+Uncalled Function占用的stack空间才行,否则会导致overwrite或程序跑飞等异常。

公式如下;CSTACK Size >= maxstack(“Program entry”) + totalstack(“interrupt”) + safety margin(100);

Maximum call chain: 最大调用链所占Stack大小;

(19)动态查看程序运行中Stack占用情况的方法

程序运行中,可以查看Stack的当前占用量,以及总量;在Tools->Option->Stack中勾选如下图:程序运行时(Debug),选中View->Stack;

在程序运行中,打断点或者暂停程序,Stack窗口就会显示栈使用情况,如下图:可以看到当前栈指针位置、(该断点时刻栈的使用情况)、当前栈空间内容及地址、全部已使用的Stack空间、以及未使用的Stack空间。

(20)使用Memory查看程序运行中各种过程数据的方法

例如查看某个指针指向的数据内容:Debug模式下,右键Watch 一个char *的指针dataC,这时只能看到指针指向的第一个数据:

 

同样在View菜单下,点击Memory1,将dataC指针存放的地址放到Goto的内容栏中,即可查看数据内容:

 

(21)IAR Map文件解析堆栈信息

通过Option->Linker勾选 map,则编译后会生成.map文件,包含了项目各种编译信息,如下图:

 

编译后,在编译目录中/list/文件夹中,找到并打开.map文件,文件最上面可以看到编译时间、Linker的版本、编译的程序文件等,堆栈信息都在"PLACEMENT SUMMARY" 的"P2"中,我们向下拉,找到"P2"最后一个part,可以看到堆Heap 栈Stack的起始地址;

再往下ENTRY LIST之后就是程序中各种函数/变量编译的信息:

可以看到函数名,地址等信息,其中Code Gb代表全局函数:,其中code说明为代码,Gb说明为“全局的”函数(Global)

可以看到除了中断向量表,第一个编译的出的Object文件为 cmain.o,该入口函数位于main.c文件。

分析如下:

静态函数:类型为Code Lc,即静态(局部Local)函数;

 

 全局变量也叫“全局数据”,因为它的类型为“Data Gb”。(文件内)静态变量:“Data Lc ” 使用static关键字定义的变量,只有在当前文件内使用,所以它属于静态(“局部”Local)变量。

 

 全局变量也叫“全局数据”,因为它的类型为“Data Gb”。(文件内)静态变量:“Data Lc ” 使用static关键字定义的变量,只有在当前文件内使用,所以它属于静态(“局部”Local)变量。

 

注意:(函数内的)静态变量:定义在函数体内的静态变量,如上图中的,xxx::byteCounter;

(22)IAR xx.icf存储资源文件解析:

IAR中使用.icf文件 划分存储资源

(23)IAR各编译文件含义:

.dep文件:ide所使用的文件依赖信息,这个会自动生成的,可以删掉

.ewp文件:工程文件/project,包含代码,编译,链接选项等,不包含调试设置等信息,这个不能删

.ewd文件:工程调试设置,保存的是IAR设置中的Debugger选项,这个最好不要删

.eww文件:解决方案/工作空间/workspace,可以直接双击打开,可以放多个工程文件,最好也不要删

(24)六大数据监控窗口详细解析

①6个视图子菜单窗口的显示内容都类似,总共四个属性

 

Expression:表达式名称,一般指变量和函数等。Value:对应的值;

Location:对应所在位置,寄存器、RAM、Flash等。Type:变量/函数类型

Watch:普通查看表达式/变量值窗口

Watch菜单下面有4个子菜单:Watch1 ~4,但都是一样的,可以分别开4个窗口出来同时查看表达式/变量值。一般这个窗口我们比较常用,添加自己想要查看的变量值。特点:A.通过手动添加需要查看的表达式/变量;B.只有暂停调试才会更新对应的值;

Live Watch:查看实时表达式/变量值窗口

Live可以翻译成“现场”、“活的”,所以我就称为查看实时变量。Live窗口与上面Watch窗口类似,差别在于:A.变量须为静态(全局);

B.变量实时更新(程序在运行时)

Quick Watch:快速查看表达式/变量值窗口

快速浏览变量窗口主要结合另外一个视图菜单Macro Quicklaunch一起使用,达到精确地控制变量值。

Auto:自动显示表达式/变量窗口

当程序暂停在某一个地方,自动显示暂停坐在位置的表达式/变量,而不需要像Watch要手动添加。

Locals:局部变量窗口

这个子菜单和Atuo类似,也是自动显示,区别在于:Locals是显示的局部表达式变量,而静态/全局变量不会显示。

Statics:静态变量窗口

该子菜单同样具有Atuo的特性,自动显示。但是,它显示的内容是静态变量(静态局部、静态全局、全局变量)。所以,通过该视图窗口就可以查看给内存分配了哪些静态变量。

(25)菜单栏详细解析:

 

1.Undo:撤销编辑 Ctrl + Z;2.Redo:恢复编辑 Ctrl + Y;3.Cut:剪切 Ctrl + X;

4.Copy:复制 Ctrl + C;5.Paste:粘贴 Ctrl + V;6.Select All:全选 Ctrl + A;

7.Find and Replace>Find:查找 Ctrl + F;Find and Replace>Find Next:查找下一目标 F3;Find and Replace>Find Previous:查找上一目标 Shift + F3;Find and Replace>Find Next (Selected) :在选中对象里查找下一目标 Ctrl + F3;Find and Replace>Find Previous (Selected):在选中对象里查找上一目标 Ctrl + Shift + F3;Find and Replace>Replace:替换 Ctrl + H;Find and Replace>Find in Files:在对话框中指定条件查找;Find and Replace>Replace in Files:在对话框中指定条件替换;Find and Replace>Incremental Search:在对话框中查找字符 Ctrl + I;

8.Navigate>Go To:前往行列 Ctrl + G;Navigate>Toggle Bookmark:标记/取消书签 Ctrl + F2;Navigate>Previous Bookmark:跳转到上一个书签 Shift + F2;Navigate>Next Bookmark:跳转到下一个书签 F2;Navigate>Navigate Backward:跳转到上一步 Alt + 左箭头;Navigate>Navigate Forward:跳转到下一步 Alt + 右箭头;Navigate>Go to Definition:跳转到定义 F12;

9.Code Templates>Insert Template:插入模板 Ctrl + Alt + V;Code Templates>Edit Templates:编辑模板;

10.Next Error/Tag:显示下一错误/目标 F4;11.Previous Error/Tag:显示上一错误/目标 Shift + F4;

12.Complete Word:完型语句 Ctrl + Alt + 空格;13.Complete Code:完型类/结构体代码 Ctrl + 空格;

14.Parameter Hint:参数提示 Ctrl + Shift + 空格;15.Match Brackets:括号匹配;

16.Toggle All Folds:折叠/打开当面编辑代码 Ctrl + Alt + F;17.Auto Indent:自动缩进(对齐) Ctrl + T

18.Block Comment:块注释 Ctrl + K;19.Block Uncomment:块取消注释 Ctrl + Shift + K;

20.Toggle Breakpoint:添加/取消断点 F9;21.Enable/Disable Breakpoint:使能/失能断点 Ctrl + F9;

应用举例1:插入/编辑模板;经常使用同样一段代码,就可以使用这个功能。IAR默认只有if、for这两个模板,我们可以自己添加(编辑)模板,比如添加一个while模板,点击“编辑模板”菜单就可以进入编辑状态,编辑的语法很简单,可以参考自带模板。

应用举例2:完型语句;小学时学习过完型填空,这里相当于就是那个意思,也就是将单词补全。比如完整的代码为USART_Initializes,而实际只需要输入USA字母就可以补全。

应用举例3:自动缩进;这个功能比较实用,在你代码比较凌乱(也就是不对齐的情况),使用该功能就可使代码自动对齐。

(26)File文件菜单

1.New:新建文件/工作空间 Ctrl + N;2.Open:打开文件/工作空间 Ctrl + O;3.Close:关闭文件;4.Save Workspace:保存工作空间;

5.Save Workspace As:另存工作空间;6.Close Workspace:关闭工作空间;7.Save:保存文件 Ctrl + S;8.Save As:另存文件;

9.Save All:保存所有文件/工作空间;10.Page Setup:打印页面设置;11.Print:打印 Ctrl + P;12.Recent Files:最近打开文件;

13.Recent Workspaces:最近打开工作空间;14.Exit:退出软件;

(27)View视图菜单

 

1.Messages>Build:编译信息;

  Messages>Find in Files:查找信息;

  Messages>Tool Output:工具信息;

  Messages>Debug Log:调试信息;

2.Workspace:工作空间窗口;

3.Source Browser>Source Browser:源码浏览器;

  Source Browser>References:引用窗口;

  Source Browser>Declarations:声明窗口;

  Source Browser>Call Graph:调用图窗口;

4.Breakpoints:查看断点窗口;

5.Disassembly:反汇编窗口;

6.Memory:内存窗口;

7.Symbolic Memory:内存标记窗口;

8.Register:寄存器窗口;

9.Watch:变量/参数查看窗口;

10.Locals:局部变量窗口;

11.Statics:静态变量窗口;

12.Auto:自动显示变量/参数窗口;

13.Live Watch:实时监视窗口;

14.Quick Watch:快速查看窗口;

15.Call Stack:调用堆栈窗口;

16.Stack:堆栈地址窗口;

17.Terminal I/O:终端窗口;

18.Images:图片窗口;

19.Cores:内核状态窗口;

20.Code Coverage:代码利用率窗口;

21.Toolbars>Main:主工具栏;

   Toolbars>Debug:调试工具栏;

22.Status bar:状态栏;

(28)Projcet工程菜单

 

1.Add Files:添加文件;

2.Add Group:添加组;

3.Import File List:导入文件列表;

4.Add Project Connection:添加工程链接;

5.Edit Configurations:编辑配置;

6.Remove:移除工作空间工程;

7.Create New Project:创建新项目;

8.Add Existing Project:添加已存在工程;

9.Options:目标选项配置 Alt + F7;

10.Version Control System:版本控制系统;

11.Make:编译工程 F7;

12.Compile:编译文件/组 Ctrl + F7;

13.Rebuild All:重新编译;

14.Clean:清除编译等中间文件;

15.Batch Build:构建批处理 F8;

16.C-STAT Static Analysis:静态分析;

17.Stop Build:停止编译 Ctrl + Break;

18.Download and Debug:下载并调试 Ctrl + D;

19.Debug without Downloading:调试(不下载);

20.Attach to Running Target:附加运行目标;

21.Make & Restart Debugger:编译并重新调试 Ctrl + R;

22.Restart Debugger:重新调试 Ctrl + Shift + R;

23.Download:下载;

24.SFR Setup:SFR设置;

25.Open Device Description File:打开设备描述文件;

26.Save List of Registers:保存寄存器列表;

(29)软件主窗口界面分析

 

Menu Bar菜单栏:该窗口是IAR比较重要的一个窗口,里面包含IAR所有操作及内容,在编辑模式和调试模式下存在一些不同。

Tool Bar工具栏:该窗口是一些常见的快捷按钮。

Workspace Window工作空间窗口:一个工作空间可以包含多个工程,该窗口主要显示工作空间下面工程项目的内容。

Edit Window编辑空间:代码编辑区域。

Message Window信息窗口:该窗口包括编译信息、调试信息、查找信息等一些信息的窗口。

Status Bar状态栏:该窗口包含错误警告、光标行列等一些状态信息。

(30)Debug调试菜单(调试模式才显示)

1.Go:全速运行 F5;

2.Break:停止运行;

3.Reset:复位;

4.Stop Debugging:停止调试 Ctrl + Shift + D;

5.Step Over:逐行运行 F10;

6.Step Into:跳入运行 F11;

7.Step Out:跳出运行 Shift + F11;

8.Next Statement:运行到下一语句;

9.Run to Cursor:运行到光标行;

10.AutoSetp:自动步骤运行;

11.Set Next Statement:设置下一条语句;

12.C++ Exceptions:C++异常;

13.Memory:内存保存/复位;

14.Refresh:调试更新;

15.Logging:调试日志;

注意:AutoSetp自动步骤运行:这个功能可以设定自动运行的xx模式,间隔xx时间运行,实践测试一下即明白,查看程序运行很方便;

(31)Disassembly反汇编菜单

这个菜单其实很简单,就是选择反汇编的模式,总共四种,我们一般选择自动模式(默认)

 

(32)下载调试工具

这个菜单的内容会随你工程配置的下载调试改变而改变,可以看见上面截图中有两种类型(ST-Link和Simulator)。这个菜单里面的内容使用频率较少,可以这么说,初学者和一般的工程师都使用不到。

 (33)Tools工具菜单:这个菜单主要是针对编辑代码相关的配置,对于自定义不同风格比较实用。

1.Options:工具配置选项;

Options工具配置选项是比较重要的一个菜单,里面包含了我们字体大小、颜色、快捷键、工程输出信息等一系列比较实用的内容。

2.Filename Extension:文件扩展名;

3.Configure Viewers:配置预览;

4.Configure Custom Argument Variables:配置自定义参数变量;

5.Configure Tools:配置工具;

Configure Tools配置工具可以增加一些相关的命令,有点类似于Keil目标配置选项中User里面用户添加命令。

6.Project Converter:工程转换;

Project Converter工程转换这个对于同时在Keil和IAR两个工具上开发的人比较实用,可以直接从Keil工程转换为IAR工程。操作很简单,找到需要转换的Keil工程,直接转换就是了,如下图:

 

(34)Help帮助菜单:非常有用

  

Content内容、Index索引、Search搜索是对应帮助文档里面的内容,如上:

Lincense Manager许可证管理,注册的时候就是这里。

About关于软件的版本信息。

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IAR使用技巧 的相关文章

  • 如何在 Android 设备上运行 VS Code [重复]

    这个问题在这里已经有答案了 我有 Galaxy Tab S6 它具有替代笔记本电脑的很酷的功能 例如连接鼠标和键盘 但不幸的是它运行 Android 操作系统 并且没有很多开发应用程序可用于 Android 所以我想是否有一个选项可以在至少
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • 为什么 i2c_smbus 函数不可用? (I2C——嵌入式Linux)

    有很多参考使用i2c smbus 开发嵌入式 Linux 软件时在 I2C 总线上进行通信的函数 什么时候i2c smbus函数如i2c smbus read word data在软件项目中引用了 ARM8 处理器错误 例如 i2c smb
  • 在 Intel 机器上构建 Apple Silicon 二进制文件

    如何在 macOS 11 Intel 上编译 C 项目以在 Silicon 上运行 我当前的构建脚本很简单 configure make sudo make install 我尝试过使用 host and target标志与aarch64
  • Beaglebone Black 的 U-boot 无法构建 - 目标 CPU 不支持 THUMB 指令

    我正在尝试按照 Chris Simmonds 的 掌握嵌入式 Linux 编程 中的说明为 Beagle Bone Black 构建 u boot 我已经构建了交叉工具链 现在正在尝试使用该工具链构建 Das U boot 但由于不支持 T
  • gdb 不会从外部架构读取核心文件

    我正在尝试在 Linux 桌面上读取 ARM 核心文件 但似乎无法找出我的核心文件 有什么方法可以指示 gdb 我的核心文件是什么类型吗 file daemon daemon ELF 32 bit LSB executable ARM ve
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • ARM NEON 矢量化失败

    我想在 ARM cortex a9 上启用 NEON 矢量化 但在编译时得到以下输出 未矢量化 不支持相关 stmt D 14140 82 D 14143 77 D 14141 81 这是我的循环 void my mul float32 t
  • 如何在WinMobile6上启用ARMv6非对齐访问?

    ARMv6 引入了一个很棒的功能 未对齐的内存访问 这使得代码中的某些事情变得更加简单和更快 但微软只在winCE6中提供了API 现在大多数 PDA 都基于 WinMobile6 基于 CE 5 x 默认情况下禁用未对齐访问 我尝试在 C
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 为什么前向引用 ADR 指令在 Thumb 代码中以偶数偏移进行汇编?

    To bx对于 Thumb 函数 需要设置地址的最低有效位 GNU 作为文档states https sourceware org binutils docs as ARM Opcodes html当地址是从一个生成时这是如何工作的adr伪
  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul
  • 你好世界,裸机 Beagleboard

    我正在尝试在我的 Beagleboard xm rev 上运行 hello world 类型的程序 C 通过调用 Cputs功能来自装配 到目前为止 我一直使用这个作为参考 http wiki osdev org ARM Beagleboa
  • 了解带有 pc 偏移的 Cortex-M 组件 LDR

    我正在查看这段 C 代码的反汇编代码 define GPIO PORTF DATA R volatile unsigned long 0x400253FC int main void Initialization code while 1
  • 2022年Android CPU架构分布(armeabi-v7a vs arm64-v8a)

    有没有关于 2022 年 Android 设备上的架构使用情况的官方信息 我有一个支持armeabi v7a 和arm64 v8a 的应用程序 我想要放弃对armeabi v7a的支持并且仅支持 64 位设备 arm64 v8a 但我找不到
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一
  • 尝试了解 ARM 二进制映像中的加载内存地址 (LMA) 和二进制文件偏移量

    我在一家ARM 皮质 M4 STM32F4xxxx 我试图了解二进制文件 elf and bin 在内存中构建并闪存 特别是关于内存位置 具体来说 我不明白的是LMA从实际的二进制文件偏移量进行 翻译 让我用一个例子来解释一下 我有一个 e
  • 如何在数据部分(RAM)中保留一定范围的内存并防止同一应用程序使用该内存的堆/堆栈?

    我想在 RAM 中保留 分配一定范围的内存 并且同一应用程序不应覆盖或使用该范围的内存进行堆 堆栈存储 如何在内存中分配一定范围的内存以防止堆栈 堆覆盖 我考虑过向应用程序本身添加 或分配 一个数组并保留内存 但它被编译器优化了 因为它在应

随机推荐

  • 用js制作一个视觉差背景

    我在网上冲浪的时候看到了一个文字和背景下滑速度不一致的情况 这看起来背景会有一种3d的感觉 于是研究了一下 首先先写出大概的html和css div class box div class bg div h2 我是一个文字 h2 p 我是一
  • 算法实验题1

    第一题 由1 3 4 5 7 8这6个数字组成六位数中 能被11整除的最大的数是多少 解答 可以使用暴力枚举法 将1 3 4 5 7 8的所有排列组合情况求出来 判断它们是否能被11整除 然后取其中能被11整除的最大值 但是这个方法的时间复
  • 蓝桥杯 第6天 动态规划(4)

    目录 1 121 买卖股票的最佳时机 力扣 LeetCode leetcode cn com 1 暴力解法 2 动态规划 2 122 买卖股票的最佳时机 II 力扣 LeetCode leetcode cn com 3 123 买卖股票的最
  • uni-app 页面样式

    页面样式与布局 尺寸单位 uni app 支持的通用 css 单位包括 px rpx px 即屏幕像素 rpx 即响应式px 一种根据屏幕宽度自适应的动态单位 以750宽的屏幕为基准 750rpx恰好为屏幕宽度 屏幕变宽 rpx 实际显示效
  • C++整数转成二进制方法总结

    经常遇到要用到二进制的情况 这里我就记录下 1 逐次经典位操作 返回一个含有二进制数的vector include
  • 【深度学习之图像理解】图像分类、物体检测、物体分割、实例分割、语义分割的区别

    Directions in the CV 物体分割 Object segment 属于图像理解范畴 那什么是图像理解 Image Understanding IU 领域包含众多sub domains 如图像分类 物体检测 物体分割 实例分割
  • 前端zip.js实现加密打包上传文件

    背景 一方面 部分系统对文件的私密性和安全性要求较高 实现前端加密打包 服务端不存储密码 下载时手动输入密钥并解压文件 另一方面 传输压缩包到客户端 节约了带宽 节约了传输时间 使用的库 zip js Support of the Zip6
  • List写入Excel,poi操作

    前言 公司最近需要将所有的报表导出集中到报表中心系统中 需要做一个通用的Excel工具类 让各个业务系统简单高效的生成Excel报表 由于原先各个业务系统生成报表方式都不一样 有的地方还直接使用了CSV 因此需要统一生成Excel 本来想用
  • Android Studio 可以正常编译运行 但是代码爆红

    这段时间毕设选题 选了一个自己曾经做过的题目 因为之前是用Android Studio2 3 3写的 现在导入Android Studio 3 2 1 代码报错 但是能正常编译运行 很是奇怪 主要报错原因是 找不到有些类 之前用Androi
  • zookeeper(二)——2PC理论、zookeeper集群、ZAB 协议

    一 关于 2PC 提交 Two Phase Commitment Protocol 当一个事务操作需要跨越多个分布式节点的时候 为了保持事务处理的 ACID特性 就需要引入一个 协调者 TM 来统一调度所有分布式节点的执行逻辑 这些被调度的
  • CTFshow php特性 web111

    目录 源码 思路 题解 总结 源码
  • adworld-crypto-banana_princess

    拿到了一个打不开的pdf文件 用hex editor打开一下看看 再看一下正常的pdf文件 猜测是用了rot13映射了一下字母字符 解密脚本 def load data filename content with open filename
  • SpringBoot线程上下文传递数据

    1 底层实现 使用ThreadLocal 使用方法 public T get public void set T value public void remove 2 自定义上下文 package com ybw context confi
  • golang 闭包函数的应用技巧

    一 有名函数和匿名函数 函数变量类型初始值为nil 函数字面量类型的语法表达格式是 func InputTypeList OutputTypeList 无参函数 func fun var f func 无入参无返回值的函数对象声明 初始值为
  • 以太坊教程:入门学习开发以太坊dapp

    一 区块链 1 分布式去中心化 比特币设计的初衷就是要避免依赖中心化的机构 没有发行机构 也不可能操纵发行数量 既然没有中心化的信用机构 在电子货币运行的过程中 也势必需要一种机制来认可运行在区块链上的行为 包括比特币的运营 亦或是运行在区
  • 【pytorch】Module.parameters()函数实现与网络参数管理

    我们知道可以通过Module parameters 获取网络的参数 那这个是如何实现的呢 我先直接看看函数的代码实现 def parameters self r Returns an iterator over module paramet
  • Edge插件之WeTab,画面优美,可以免费使用chatgpt,很难不爱

    目录 一 普通的edge新标签页 二 安装WeTab插件 1 WeTab插件的安装非常简单 只需在百度搜索wetab 进入官网 2 进入官网 点击edge图标 进入插件下载页面 3 这里由于我是已经安装成功 显示的是删除和启动 首次下载的话
  • element-ui el-tooltip 显示导致父元素 hover 失效问题解决

    添加如下css属性 el tooltip popper pointer events none pointer events 属性用于设置元素是否对鼠标事件做出反应 CSS 语法 属性值 pointer events auto 默认值 设置
  • maven3.8.2版本导致openjdk.jar包报错:Cannot find file

    真的吐血了快 又是maven问题 导致项目打包报错 maven问题梅开二度 我醉了呀 问题描述 在idea中使用Terminal终端 对项目进行打包 然后报错 报错信息 ERROR Failed to execute goal on pro
  • IAR使用技巧

    一 状态栏的解析 Compile 只对目前打开的c文件进行语法检查 不对它进行link Make 对工程所有打开的c文件进行语法检查和link 只编译有改动的文件或者设置变动的文件 Rebuild All 编译链接当前工程 不管文件或者设置