Rocket - debug - Example: Quick Access

https://mp.weixin.qq.com/s/SxmX-CY2tqvEqZuAg-EXiQ

 

介绍riscv-debug的使用实例:配置Quick Access功能。

 

 

1. Quick Access

 

快速访问,即暂停核心执行Program Buffer中的一段短的代码,然后再恢复核心运行。

 

具体流程如下:

需要注意的是,Program Buffer一般以ebreak指令结束。执行完Program Buffer最后的ebreak后,才执行第4步恢复核心的执行。所以正常情况下,快速访问抽象命令执行完成后,核心还是在正常运行状态。这也是第3步中,"the program buffer execution ends, but the quick access command continues"的意思,第3步中断后,"continue"继续执行第4步。

 

寄存器的格式如下:

 

所以执行快速访问抽象命令时,command寄存器的值为0x1000_0000.

 

2. 实例1:a single memory write

 

A. 首先准备好Program Buffer:

a. 写寄存器progbuf0: transfer arg2, s0:把s0的值保存到arg2寄存器;

b. 写寄存器progbuf1: transfer s0, arg0:读arg0中保存的目标内存地址;

c. 写寄存器progbuf2: transfer arg0, s1:把s1的值保存到arg0寄存器;

d. 写寄存器progbuf3: transfer s1, arg1:把arg1中保存的待写数据读到s1中;

e. 写寄存器progbuf4: sw s1, 0(s0):写目标内存地址为待存数据;

f. 写寄存器progbuf5: transfer s1, arg0

g. 写寄存器progbuf6: transfer s0, arg2

h. 写寄存器progbuf7: ebreak: 退出执行返回调试环境;

 

B. 写data0寄存器:写为目标内存地址;也就是Program Buffer中的arg0;

C. 写data1寄存器:写为待存数据;也就是Program Buffer中的arg1;

D. 写command寄存器:

a. cmdtype=1:抽象命令为快速访问命令;

 

3. 实例2:setting the m bit in mcontrol

 

这里只提示要点:

a. tdata1就是mcontrol寄存器,两者的地址是一样的:

b. mcontrol的bit6是m bit:

 

c. progbuf3中写的指令是错误的,应该是:transfer s0, arg0. 因为s0保存在arg0而不是arg2中。

 

posted @ 2019-11-27 21:59  wjcdx  阅读(391)  评论(0编辑  收藏  举报