Nu-Link调试器的断点调试功能,我们最初实现了下面两种:
1. RAM中的程序,通过指令替换的方式实现,可以用任意多个断点
2. flash中的程序,利用Cortex-M0硬件的支持,可以支持到4个断点。(断点靠的很近的话,可以有8个断点)
RAM中的断点用途不大,因为总是希望让程序尽可能的直接在flash中跑。
算上调试器本身需要一些断点资源,于是实际上,、
使用Cortex-M0,用户能用到的调试断点数就只有3个。
有没办法突破3个断点的限制呢?答案是肯定的。
考虑方案1:
将1个硬件断点设定在下一条跳转指令处,其他硬件断点设定在中断入口处。
运行到断点处,再移动断点位置,通过飞快的改变4个硬件断点模拟出无限断点的效果。
实现希望是有的,难度是很大的,需要解析指令集,也需要改变中断入口。
最终没有选择这个方案。
考虑方案2:
直接替换flash ROM中的指令,如同实现RAM中软件断点的办法。先停止程序,将目标地址处的flash内容替换成
断点指令,再重新运行程序。
当然也是问题多多:
问题1: 擦写flash通常比写RAM慢很多。擦写动作要足够的快,用户才不会觉得调试起来很慢。
问题2:擦写flash会影响目标开发板的某些寄存器组,用户调试的时候发现某个寄存器不由控制的变化可不好。
问题3:擦写flash通常需要用到目标板的内存。如果这些内存用户另作他用(比如在做DMA),如何解决冲突?
问题4:每种芯片写flash的程序都不尽一样。。。。
问题5:有没可能断点处的指令只替换一次,需要运行被改写之前的实际指令时,通过模拟的方式由调试器代做?这样可以极大提高flash断点的效率。
要做到优越容易,做到完美很难。最后用方案2,前4个问题可以对付,不鸟问题5。
实现出效果,竟然也不错,flash断点几乎不比硬件断点和RAM断点慢。
于是Nu-Link调试器搭配芯唐Cortex-M0, 可以支持无限制flash ROM中的断点。
---- 写程序果然可以给人一点小小满足感。
阅读(3181) | 评论(2) | 转发(0) |