嵌入式开发过程中,最大一部分时间都在调试中。这几天一直忙于研究嵌入式调试有关的内容,主要涉及ARM和AVR。调试一般分为软件仿真和硬件调试。
一般情况下软件仿真都用来调试与算法有关的问题,实际上一般我会把与算法有关代码放在VC下面调试,这样会减轻很多痛苦,然后再直接放到嵌入式系统中调试。
硬件调试一般涉及到具体的设备,手头上比较有东西才行。目前比较流行的就是基于JTAG来进行调试。有关JTAG调试的原理的说明应该有很多。PC机调试器通过调用有关接口来实现与目标嵌入式系统通过。目前比较流行的调试工具有H-JTAG,ULINK,JLINK。这三者中,我用过前两者,第三个应该与第二原理差不多,可能它们支持的接口不一样而已。现在就H-JTAG和ULINK进行说明。这两者有很大不同(从实现手段来说)。H-JTAG使用了调试代理,所谓代理就是一个中转站。PC机调试器通过调用或者向调试代理发数据,然后再由调试代理解释收到的数据然后将信息转换成控制信号,通过驱动PC并口来发送控制信号。这样很多的事情就由PC机来做了,所以调试工具制作成本比较底,关键的是调试代理。ULINK实现的原理又有所不同。PC机调试器一直通过USB,通过调用USB驱动直接将数据发送到ULINK中,再有ULINK中的CPU对数据进行分析,最后产生调试控制信号送调试目标,ULINK做成这样的原因就是USB没有象并口那样有很多控制线,另外USB的速度比较快,牺牲的成本和以后升级不方便,降低了可重用性。象AVR中的JTAGIC MKII也是基于这种原理。
但是不管那种实现方法和手段,目前对于进行嵌入式程序调试还是不能象VC中的调试器那样可以随心所欲(除非你买得起很贵的仿真器,那些真的很爽,我在公司用过,不过对于小公司和个人来说有点不现实。其实如果好好研究其实现原理一翻,其基本都是一样的) 存在或多或少的问题。如果RAM空间不够,需要在ROM中调试时,就严重受到硬件断点个数的影响。象ARM7/ARM9有两个硬件断点,AVR最多支持四个,这些限制严重影响程序的调试。
一般情况下软件仿真都用来调试与算法有关的问题,实际上一般我会把与算法有关代码放在VC下面调试,这样会减轻很多痛苦,然后再直接放到嵌入式系统中调试。
硬件调试一般涉及到具体的设备,手头上比较有东西才行。目前比较流行的就是基于JTAG来进行调试。有关JTAG调试的原理的说明应该有很多。PC机调试器通过调用有关接口来实现与目标嵌入式系统通过。目前比较流行的调试工具有H-JTAG,ULINK,JLINK。这三者中,我用过前两者,第三个应该与第二原理差不多,可能它们支持的接口不一样而已。现在就H-JTAG和ULINK进行说明。这两者有很大不同(从实现手段来说)。H-JTAG使用了调试代理,所谓代理就是一个中转站。PC机调试器通过调用或者向调试代理发数据,然后再由调试代理解释收到的数据然后将信息转换成控制信号,通过驱动PC并口来发送控制信号。这样很多的事情就由PC机来做了,所以调试工具制作成本比较底,关键的是调试代理。ULINK实现的原理又有所不同。PC机调试器一直通过USB,通过调用USB驱动直接将数据发送到ULINK中,再有ULINK中的CPU对数据进行分析,最后产生调试控制信号送调试目标,ULINK做成这样的原因就是USB没有象并口那样有很多控制线,另外USB的速度比较快,牺牲的成本和以后升级不方便,降低了可重用性。象AVR中的JTAGIC MKII也是基于这种原理。
但是不管那种实现方法和手段,目前对于进行嵌入式程序调试还是不能象VC中的调试器那样可以随心所欲(除非你买得起很贵的仿真器,那些真的很爽,我在公司用过,不过对于小公司和个人来说有点不现实。其实如果好好研究其实现原理一翻,其基本都是一样的) 存在或多或少的问题。如果RAM空间不够,需要在ROM中调试时,就严重受到硬件断点个数的影响。象ARM7/ARM9有两个硬件断点,AVR最多支持四个,这些限制严重影响程序的调试。