cortex-m3软件断点/单步执行的实现机制

本文介绍了Cortex-M3处理器在软件调试中的两种关键机制:软件断点和单步执行。软件断点通过在SRAM中替换指令为BKPT指令实现,而硬件断点适用于ROM并有限数量。单步执行涉及处理器在调试模式下的DAP交互和DHCSR寄存器的操作,允许逐行执行代码并处理中断情况。
摘要由CSDN通过智能技术生成

一.软件断点
软件断点设置后,断点处的代码如果是存放在SRAM中,相应的一条指令(C语言中的一行代码可能对应多条处理器指令)会被调试器(debugger)替换成cortex-m3的BKPT指令,当程序运行到这一BKPT指令时,处理器会被停机(halt),用户可以用调试器做出相应的操作。用户在操作完成继续执行指令时,原来C语言中的那一条指令会被调试器重新写入到该地址,并且取消停机,处理器从这一指令开始继续执行程序。

当然,以上操作需要断点处的指令所在地址是SRAM等可写的存储器,如果是ROM等不可写存储器,就只能使用CM3处理器通过FBU提供的硬件断点功能(在检测到程序执行到某一地址时,由处理器硬件自动停机),但是硬件断点最多只有8个,而软件断点的个数没有限制。

二.单步执行
典型情况是,要执行单步执行,处理器已经在debugger的控制下停机,这时处理器处于调试模式(debug state)。用户通过软件执行单步执行时,实际上debugger会通过DAP向 处理器中DHCSR寄存器的C_STEP写1,使处理器退出调试模式并执行以下三步操作:
1.根据中断状态执行以下操作中的一种:
1)没有将要进入的中断,则直接执行一条指令
2)有被挂起的中断,且该中断的优先级允许它被执行,则会进入该中断对应的服务函数
3)执行下一条指令,并由此产生了一次中断
注意:2)和3)都会导致一次中断压栈操作
2.将 DFSR.HALTED设置为1
3.回到调试模式

另外,如果DHCSR.C_DEBUGEN为0,则debug事件并不能使处理器被停机,而是进入debug monitor中断,在该中断中也可以执行单步操作(当然也可以通过读取存储器或外设等进行调试),基本原理和停机时的单步执行类似,可以参考ARMv7-M Architecture Reference Manual的C1-696页。

参考资料:
1.The Definitive Guide to Arm Cortex-M3 and Cortex-M4 Processors
2.ARMv7-M Architecture Reference Manual
3.https://zhuanlan.zhihu.com/p/34003929
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值