一次设定之后,LOG 打印就不需要你操心了,即使调试器通信错误,它也会把之前输出的数据保存下来的。看到这里,你应该知道 ini 文件到底有多重要了吧,你的所有调试命令都可以用它保存并在进入调试模式后自动执行,比如说你有一个断点,很复杂,不想每次设置,那么你可以在设置完一次后,从命令窗口将这个命令复制到 ini 文件中,比如像这样:
另外再说一点,KEIL 支持把某一块内存数据保存成文件,这个命令是 SAVE,感兴趣的话可以去官网了解一下。 注意事项上面说了 KEIL 命令调试的很多优点,现在说说它的缺点:1、KEIL 命令调试不支持指针,这个已经多次强调了,要实现指针的功能,只能间接使用。2、对程序运行造成一定的影响(事实上这个不关 KEIL 的事,是调试系统本身的问题)前面说过,调试器可以说是第三方监视器,虽然几乎没有侵入性(事实上对 CPU 还是有影响的),但是它还是会窃取 CPU 时钟的,而且在执行断点的时候,虽然由 ini 文件定义的函数由 KEIL 执行了,实际上上执行这些函数也是需要时间的,那这个时间怎么来,就是通过暂停 CPU 后去执行这些代码,这个你可以通过 DWT 计数器看出来,因为只有 CPU 执行了 DWT 才会计数,但是你会发现在执行这些代码时,DWT 是没有进行计数的(在 KEIL 函数的前后获取 DWT 计数,可以发现计数值不变):
也就是说 CPU 和 KEI 是在交替使用系统时钟的。平常来看,由于 KEIL 执行速度很快,看不出来问题,但到中断的时候却会出现问题。情况是这样的,驱动步进电机时,鱼鹰使用了这种调试方法打印每次进入定时器中断的时间,发现即使使用最高精度的情况下(CPU 运行时钟),每次进入中断的时间看似都是固定的,但步进电机还是表现出失步情况,也就是说系统内部时间看起来每次进入中断时间一样,但是实际情况是,已经丢失了时间(好好理解这句话),这个时间损耗就在运行这些命令上,而一旦把这些命令输出删去,就会发现电机不再出现失步了。这是一个比较大的缺陷,但是在一般情况下是不会有多大问题的,因为一般情况下窃取一点 CPU 时间也不会对整个系统有太大影响,前提是你别窃取太多了
一次设定之后,LOG 打印就不需要你操心了,即使调试器通信错误,它也会把之前输出的数据保存下来的。看到这里,你应该知道 ini 文件到底有多重要了吧,你的所有调试命令都可以用它保存并在进入调试模式后自动执行,比如说你有一个断点,很复杂,不想每次设置,那么你可以在设置完一次后,从命令窗口将这个命令复制到 ini 文件中,比如像这样:
另外再说一点,KEIL 支持把某一块内存数据保存成文件,这个命令是 SAVE,感兴趣的话可以去官网了解一下。 注意事项上面说了 KEIL 命令调试的很多优点,现在说说它的缺点:1、KEIL 命令调试不支持指针,这个已经多次强调了,要实现指针的功能,只能间接使用。2、对程序运行造成一定的影响(事实上这个不关 KEIL 的事,是调试系统本身的问题)前面说过,调试器可以说是第三方监视器,虽然几乎没有侵入性(事实上对 CPU 还是有影响的),但是它还是会窃取 CPU 时钟的,而且在执行断点的时候,虽然由 ini 文件定义的函数由 KEIL 执行了,实际上上执行这些函数也是需要时间的,那这个时间怎么来,就是通过暂停 CPU 后去执行这些代码,这个你可以通过 DWT 计数器看出来,因为只有 CPU 执行了 DWT 才会计数,但是你会发现在执行这些代码时,DWT 是没有进行计数的(在 KEIL 函数的前后获取 DWT 计数,可以发现计数值不变):
也就是说 CPU 和 KEI 是在交替使用系统时钟的。平常来看,由于 KEIL 执行速度很快,看不出来问题,但到中断的时候却会出现问题。情况是这样的,驱动步进电机时,鱼鹰使用了这种调试方法打印每次进入定时器中断的时间,发现即使使用最高精度的情况下(CPU 运行时钟),每次进入中断的时间看似都是固定的,但步进电机还是表现出失步情况,也就是说系统内部时间看起来每次进入中断时间一样,但是实际情况是,已经丢失了时间(好好理解这句话),这个时间损耗就在运行这些命令上,而一旦把这些命令输出删去,就会发现电机不再出现失步了。这是一个比较大的缺陷,但是在一般情况下是不会有多大问题的,因为一般情况下窃取一点 CPU 时间也不会对整个系统有太大影响,前提是你别窃取太多了