象现在的芯片,ISP功能和JTAG功能已经很强大了,基本上只凭这两个东西就差不多可以解决绝大部分问题.
只有一些极少数比较特殊的场合,实在需要硬件仿真器了,才用硬件仿真器上去试试.
我觉得用仿真器去代替实际的芯片,反而增加了系统的复杂度. 由于仿真器的介入,不管从物理连接, 还是在软件控制上,都增加了复杂度,并且还有可能出现仿真器跟实际硬件不一样的结果,毕竟仿真器 也是个别人开发出来的产品,可能本身就存在bug. 而也有可能是仿真器是对的,而芯片存在bug. 当然了,遇到这样的情况时,可以通过其它手段来解决的,但是从这一点上来看,仿真器并不是 太可靠的,只是在某些特殊的情况下,让你能够更快的调试. 例如模拟一个时序,你可以用仿真器 单步运行,然后慢慢来观察IO口的电平,这个用普通万用表或者LED都可以看清变化状态了。但是, 如果你有一台数字示波器的话,就不必这么罗嗦了,可以直接捕捉波形. 有时由于时序太快的 而导致器件无法识别,这种情况往往是单步运行可以,而全速就不行,这时就需要靠一点经验了, 在某些估计会出错的地方加上延迟.
至于一步一个脚印,我觉得用串口反馈就完全可以做到了。你可以开始只写一个个的模块, 然后分别测试,每个都测试通过之后,才放到一起,联合工作. 而需要设置断点的地方,你可以用一个 等待串口命令的语句,而需要返回某个变量或者内存的值,你可以通过串口来返回,当然也可以通过串 口来设置,只不过需要自己多写一小段程序而已,但这些东西一旦做好之后,以后也可以使用的。
使用仿真器比较方便的一个地方就是程序跑飞(例如指针越界,堆栈溢出等),这时你无法准确的知道 程序是在哪飞掉的,如果你有仿真器,就容易一些,估计还没飞之前,设置一个断点,然后再单步,看 它到底是在哪飞的,怎么飞的等等。然而,如果你的芯片具有JTAG,那么就可以通过JTAG实现这个功能, 而不用硬件仿真器。上次我在弄ARM_00_OS时,就是通过JTAG来解决问题的。软件仿真完全没问题,但是 上到硬件上全速就不行了,然而通过JTAG单步却没问题。这就有点郁闷了。后来想到是因为在特权模式下 访问用户寄存器的指令,后面不能紧跟访问备份寄存器。我在这些地方插入一个NOP之后,就解决掉问题了。
https://bbs.21ic.com/club/bbs/list.asp?boardid=35&t=2076437&tp=%u771F%u662F%u6655%u83DC
所以我的观点是,平时尽量不要用硬件仿真器,实在没办法时,才动用仿真器。
|