程序断点与数据断点

若是你作嵌入式开发,那你必定得对程序断点(program breakpoint)和数据断点(data breakpoint)有所了解。程序断点你可能还据说过,但数据断点就有可能不是很了解了,更有可能不知道如何去用了!如今,就让咱们去了解全部类型的“断点”吧!

程序断点就是指处理器指令断点,通俗的说就是:当程序运行到某个地方时,咱们但愿程序停下来,即程序“断”了!停下来的目的,就是给咱们检查当前程序运行的状态的机会。对于软件开发人员来讲,对于程序断点一点都不陌生,它是咱们调试程序的必需手段。但对于嵌入式开发,咱们还得对程序断点进行区分:软件程序断点和硬件程序断点。

为了说明硬件程序断点,咱们先要了解软件程序断点是如何实现的。你想过了吗?软件程序断点究竟是如何实现的?当你用Visual Studio进行软件开发时,你能够设置不少的断点,对不?咱们知道,若是处理器在运行的过程当中,若是碰到了一条非法的指令,那会出现一个异常中断,程序也会停了下来。软件程序断点就是利用这个特性来实现的,当咱们设置一个断点时,调试工具就在咱们所想设置的程序位置上放置一条非法的指令,同时保留原来的指令。当程序运行时,一旦运行到了咱们设置了断点的地方,即如今指令是非法的位置,处理器就会产生一个异常中断从而停了下来。固然,调试工具会接管这一中断,并在中断服务程序中,将保存的原来的指令恢复回去。固然,于此同时也会给程序员调试程序的机会,并由程序员决定何时继续运行程序。从理论上说,软件程序断点能够设n个,这里的n趋近于无穷(固然内存不容许?)。

有了软件程序断点的概念,那么就好理解硬件程序断点了。在介绍硬件程序断点时,咱们先要问一问,为何要引入硬件程序断点。引入一种新的概念,每每意味着老的概念存在必定的局限性。那软件程序断点存在什么局限性呢?想一想看,在嵌入式系统中,若是咱们想调试一个boot loader(参见《什么是boot loader》一文),而此时处理器还在运行位于FLASH中的程序,此时软件程序断点这种方法还有效吗?固然不行,由于FLASH中的内容并不能像内存同样,被处理器经过一个写操做直接更改。在FLASH中更改内容(或称对FLASH进行编程)存在必定的协议,而显然处理器不会去实现这一协议的,这会严重影响处理器的通用性。此外,即便实现了,其效率也不会高。即然这样,软件程序断点不能运用到boot loader的调试中去。解决方法时什么呢?就是处理器提供必定的寄存器用于存放程序的断点位置,当咱们经过调试工具设置断点时,调试程序会将所需中断的指令地址放入处处理器的程序中断寄存器中。显然,处理器的这种寄存器是有限的,所以,咱们不能设置n个。

如今让咱们说一说数据断点。试想一想,当咱们在调试程序时,若是发现所定义的一个数据结构中的某一个值老是被意外的更改。根据咱们的经验,这种意外更改是由于程序中存在bug的缘故。在这种状况下,咱们很难找出根源在哪儿。若是处理器有一种功能,当某块内存区或具体的地址被意外更改时,停下来就行了。这就是数据断点的做用!处理器若是提供这种功能,咱们能更方便的找出出错的根源。高级的处理器每每提供这种功能!类同的是,处理器的数据断点也是经过处理器提供相应的设置寄存器来实现的,固然也是有限的!

如今让咱们看一看,处理器处理硬件程序断点与数据断点的区别是什么。对于硬件程序断点,咱们知道,处理理器须要从内存中取指,而处理器也有一个程序指针PC(program counter),经过将PC值与咱们所设置的程序断点位置值相比较,处理器就能够实现硬件程序断点了。但数据指令就不同了,处理器必须监听地址总线,当发现有向关心的地址写数据时,就中断程序的运行。

相信读过这篇文章后,你听到软件程序断点、硬件程序断点和数据断点时,必定很坦然了。最后,我想指出的是,若是你正在为你的嵌入式产品选择处理器,考虑处理器是否支持数据断点是颇有必要的!程序员

相关文章
相关标签/搜索