论坛» 综合技术» 工业控制与自动化

迅为2K1000开发板龙芯平台Ejtag单步调试PMON的汇编阶段

菜鸟
2022-03-21 15:22 1楼

迅为2K1000开发板

Ejtag调试器

9.6小节中,我们在汇编节点实现了led闪烁的功能,如果您自己写的程序没有成功,我们该如何调试呢?就可以利用 Ejtag仿真器进行单步调试。

那我们要如何进行单步调试呢?我们是不是就得先知道每一个指令对应的地址呢?这样我们才可以打断点。我们先来修改一下在9.6 小节中的代码,我们加一个标签。如下图所示:

然后我们重新编译pmon 源码生成pmon 镜像并烧写到开发板,一定要将编译的烧写到开发板!!!接着在pmon-loongson3/zloader.ls2k 使用命令/opt/gcc-4.9.3-64-gnu/bin/mips64el-linux-objdump -d start.o > 1.txt

将编译得到的start.o文件进行反汇编并将结果输出到1.txt,添加led3_ctrl标签的目的是为了反汇编以后更加容易找到led3控制相关的指令,如下图所示:

使用命令vim 1.txt打开反汇编后的输出文件,找到标签led3_ctrl所在的位置,如下图所示:

从上图可以看出,控制led3相关的代码是从地址d60开始的,而MIPS的入口地址是0xbfc00000,所以我们是不是就可以把断点打的地址为0xbfc00d84的地方呢,这个地方对应的指令为点灯操作。

接着我们启动Ejitag工具并配置好Ejtag工具,在Ejtag命令行下输入命令hb 0xffffffffbfc00d84,注意,此

时开发板并未上电!!!

接着我们给开发板上电,此时hb命令会执行成,这时立刻输入set命令停止cpu,如下图所示:

然后我们输入命令hbls,查看断点是否设置成功,设置成功如下图所示:

接着输入命令cont,让cpu 执行到断点出停止,如下图所示:

然后使用命令unhb 0xffffffffbfc00d84 删除断点,这里一定要删除,不然si 命令不能往下执行,如下图所示:

接着输入命令si 1执行1 条执行,si 1的意思就是单步执行1 条指令,如下图所示:

此时我们可以发现led3已经点亮,说明我们之前写的汇编代码是没有问题的。如果大家没有点亮,可以使用set命令来查看通用寄存器的值来排查错误。

接着我们将断电打在关灯的指令位置,在反汇编1.txt文件中,我们可以发现关灯的指令是在da0位置,如下图所示:

所以我们输入命令hb 0xffffffffbfc00da0 将断点打在这个位置下,如下图所示:

然后执行cont命令运行cpu,cpu 会执行到这个断点位置,然后停止,如下图所示:

cpu已经停到这个位置了,我们就可以使用命令unhb 来删除断点了,这里一定要删除,不然si 命令不能往下执行,如下图所示:

接着输入命令si 1条指令,如果我们写的代码没有问题,可以发现led3 熄灭,如下图所示:

这样我们就在汇编阶段下调试完成了led,同理,调试其他的GPIO大家也可以使用这种方法,这里就不在赘述,大家可以自行探索一下。


工程师
2022-03-21 21:24 2楼

学习

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]