迅为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 大家也可以使用这种方法,这里就 不在赘述,大家可以自行探索一下。