在单片机程序开发过程中,使用调试器给程序打断点、单步运行等调试功能是很方便了解程序的运行情况的,但是这些调试的底层原理是怎样的,本文就来介绍下。
以S3C2440为例,其cpu是基于arm9架构的,在cpu的内部有个JTAG模块,这个模块具有以下特点:
1、cpu发出的地址信号、数据信号都是通过JTAG模块的;
2、JTAG可以控制cpu的运行;
3、JTAG可以直接访问外设,读取外设的寄存器数据。
在调试单片机的时候,实际操作都是通过JTAG模拟器(并口wiggler、JLink、openJTAG等)一端连接到开发板,另一端连接到pc机上,在pc机上运行ADS、keil和openOCD就可以对单片机进行调试了。
arm9 cpu实现调试程序的原理是其内部设有2个比较器,当比较器判断运行程序相关的值与预设的值相同时,就会产生断点。断点的实现有两种方式,一种是硬件断点,即比较地址,首先预设断点地址A,当程序运行到地址A时就会产生断点,由于arm9 cpu只有两个比较器,因此这种方式的断点只能有两个;另一种是软件断点,当给程序设置断点时,cpu中的JTAG模块把断点地址处的数据进行替换,当cpu运行到断点地址处,取出的数据等于替换的数据,产生断点,程序重新运行时,再把原数据替换回去,这种断点理论上可以有无数个,但是有个前提,就是要求内存中的数据可写,因此无法调试NOR Flash和ROM上的程序。