Chinaunix首页 | 论坛 | 博客
  • 博客访问: 153232
  • 博文数量: 31
  • 博客积分: 1455
  • 博客等级: 上尉
  • 技术积分: 340
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-09 02:20
文章存档

2012年(2)

2011年(18)

2010年(11)

分类: 嵌入式

2010-03-31 23:30:45

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中的断点。
---- 写程序果然可以给人一点小小满足感。








阅读(3084) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

X-Hawk2010-05-16 15:36:31

bigcm0: 赞一个!X-Hawk老大是Nu-Link创始人吧,Nu-Link提供内部固件代码吗?Nu-Link可以在线升级不?
只是nu-link的coder
公开固件代码容易带来维护的压力哦

bigcm02010-04-26 09:13:34

赞一个!X-Hawk老大是Nu-Link创始人吧,Nu-Link提供内部固件代码吗?Nu-Link可以在线升级不?