打印
[牛人杂谈]

调试Cortex-M0的时候,怎样保证在main入口处能停下来

[复制链接]
1031|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yiyigirl2014|  楼主 | 2016-8-27 22:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
绝大多数时候,用仿真器调试程序的时候,都可以先在main停住程序。
然后,非常偶尔的,也可能碰到几种可能,程序会自由跑,不会停在main,当调试遇到在main停不住的问题时,先检查下是否是这些问题,然后对症下药。

沙发
yiyigirl2014|  楼主 | 2016-8-27 22:55 | 只看该作者
情景一,Keil的Project Option->Debug->Settings里面,
   reset方法选的是HWRESET,
   通常硬件reset后,所有断点也会reset, 因此程序启动后会自由跑,不会停在main.
   解决办法:将reset方法改为Autodetect或SysResetReq通常能解决问题。

情景二,编译连接的时候,main函数被link到了RAM区域。
   造成main不能被"断住"的原因是,运行到main之前,程序会将自身从ROM复制到RAM,
   于是连同设定在main位置处的断点也一并覆盖掉了。
   解决办法: 改写scatter文件,或使用简单link办法,确保main函数被link在ROM中。
              注:以芯唐(Nuvoton) NUC1xx系列芯片,ROM的起始映射地址为0,
                  RAM的起始映射地址为0x20000000

使用特权

评论回复
板凳
yiyigirl2014|  楼主 | 2016-8-27 22:56 | 只看该作者
另外提供一个一劳永逸的办法:
使用Nu-Link调试器,并用Nu-Link安装包提供的
SH_startup_NUC1xx.s代替您的项目中原先的startup_NUC1xx.s,
重新编译运行项目,Nu-Link会对针对上述问题做特别处理,确保在main入口能暂停程序。
(安装完 Nu-Link驱动后,可在这个位置找到SH_startup_NUC1xx.s
C:\Keil\ARM\BIN\Nu_Link\SemiHost\SH_startup_NUC1xx.s)

使用特权

评论回复
地板
wahahaheihei| | 2016-8-27 22:57 | 只看该作者
这个方法很好,可以用于分析启动文件。

使用特权

评论回复
5
734774645| | 2016-8-28 09:31 | 只看该作者
通过修改启动文件,可以指定主函数的保存位置。

使用特权

评论回复
6
643757107| | 2016-8-28 11:47 | 只看该作者
关于.s文件里面的内容如果掌握清楚了,必然成为高手,它包含整个系统结构的布局

使用特权

评论回复
7
zhuotuzi| | 2016-8-28 22:52 | 只看该作者
这种在main函数之前停止有什么好处吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

213

主题

3531

帖子

10

粉丝