iar调试

时间:2023-03-09 15:31:54
iar调试

我们可以自己建立自己的工程了,但这一步只是开发中的第一小步。今天就来说说开发中举足轻重的另外一件事:调试。

其实调试本身也并不难,楼主总结,调试关键在于两件事,一是运行,二是观察,为了更好的实现这两者,就牵涉到如何设置断点。

运行很简单了,仔细观察调试工具栏:

从左向右依次是:复位,暂停,步过,步入,步出,下一句,至光标,运行,退出调试模式。

运行是以指令指针为参照的,在环境中表现为绿色的小箭头:

指令指针指向的该行,表示的是接下来准备要执行的代码行。

复位:指令指针回到开头,
暂停:使正在奔跑的程序立定
步过:执行当前这句话,如果这句话是函数调用,就把整个函数执行完,停在下一句
步入:执行当前这句话,如果这句话是函数调用,就进入到函数里,停在函数的第一句话
步出:一直执行到从当前的函数返回,停在函数返回后的下一句话
下一句:执行C语言的一条语句,停在下一句代码上
至光标:一直运行到光标所在行,并停在这一行上
运行:运行到遇到断点
退出调试模式:……额,就是退出调试模式

观察,就是看——看什么?什么都看!

在菜单View中,我们可以了解都有哪些可以看,重点都在中间那一段中。

我们主要来看看重点中的重点,楼主比较常用的有以下这些:
Breakpoints:也就是断点
Disassembly:反汇编,也就是你写的程序经过编译烧写之后,在单片机中的样子
Memory:内存,可以查看全部内存中的数据,看起来就像一般的16进制编辑器
Symbolic Memory:符号内存,不但能看到内存数据,还能看出来对应程序中的什么变量
Register:寄存器,查看全部寄存器的内容
Watch:观察,可以根据你的需要,指定查看什么,根据楼主的经验,查看全局变量方便一些,在变量可见范围内,也可以查看局部变量和静态变量(static)
Locals:查看函数局部(变量等)内容,包括函数的参数
Statics:查看静态内存变量,注意不是指静态变量(static),而是生命周期是整个程序生命期的变量,原则上不在堆栈中的局部变量,应该都是静态内存变量。
auto:自动,指的不是C语言中的自动变量,而是指根据指令指针当前的位置,自动显示出相关的变量
Call Stack:调用栈,表示到当前位置的函数调用顺序图
Stack:栈,就是栈的数据表示

除了上述这些,还有一些可以看的东西,由于楼主不常用,因此楼主也不是百分百的清楚它们的意义和用法,就不在这里胡说八道了。
总体来说即使只弄明白上述这些,在调试的时候也足够了,绝对能让你想看哪里,就看哪里。

最后是断点,这个东西,可简单可复杂。所以下面我们简单来说说,便于大家好接受。

基本的断点,通过下载调试按钮旁边的有着红色圆的按钮,就可以在光标当前行进行设置或者取消了,

当然你也可以直接点击代码左侧的灰色区域,使断点出现或者消失。

这是一个普通的位置断点,在IAR中也被称为代码断点,也就是当运行到这里的时候停下来。下图是断点窗格里看到的代码断点

设置好代码断点,让程序运行,程序就会在运行到断点的位置时自动暂停下来了。
以前经常有童鞋来问楼主,打了断点为啥停不下来……很简单,压根没跑到你设置断点的地方呗!

在我使用的环境中,除了代码断点,还支持条件断点和高级断点的设置。

可能是由于楼主也不太会使用这个,只能设置到读写某个变量时暂停,我连单独的读或写操作都无法指定,如下图所示。

在用其他环境调试的时候,楼主也经常利用条件断点来监视某个变量被修改成非法值的时机点,以此来跟踪调查程序运行混乱的问题。

简单总结一小下,调试时我们在做程序的时候,话费最多时间的阶段,所以从学习IDE的使用开始上手,能有效提高我们调试的效率,把程序做得更大更好更稳定。