0x00 懵逼
当你写好的初始化代码head.S和链接脚本uart.lds共同编译出来的*.bin,烧录到NandFlash中的时候,发现串口输出一片空白,这时你的想法是什么,砸电脑还是干点其他有用的事?还是老实的搭建调试环境吧,上篇讲过如何调试源码级的代码,但若是初始化代码有问题,譬如sdram拷贝出问题或者链接脚本有问题的话,通过openjtag gui调试会比较靠谱。
0x01 烧录
先写一个脚本,利用oflash能快速的进行NANDFLASH烧录,脚本如下:
oflash 0 1 0 0 0 E:\gongkong\eclipse_projects\uart8266\uart.bin
pause
六个参数,分别表示: JTAG类型、CPU类型、Flash类型、读写类型、偏移地址、文件。最后双击运行。
0x02 打开opengui
如何用openjtag连接开发板,这里跳过,打开电源,先打开connect,再打开telnet
0x03 命令行进行调试
详细指令如下:
poll 查询目标板当前状态
halt 中断目标板的运行
resume [address] 恢复目标板的运行,如果指定了 address,则从 address 处开始执行
step [address] 单步执行,如果指定了 address,则从 address 处开始执行
reset 复位目标板
bp <addr> <length> [hw] 在地址 addr 处设置断点,指令长度为 length,hw 表示硬件断点
rbp <addr> 删除地址 addr 处的断点内存访问指令(Memory access commands)
mdw ['phys'] <addr> [count] 显示从(物理)地址 addr 开始的 count(缺省是 1)个字(4 字节)
mdh ['phys'] <addr> [count] 显示从(物理)地址addr 开始的count(缺省是1)个半字(2字节)
mdb ['phys'] <addr> [count] 显示从(物理)地址 addr 开始的 count(缺省是 1)个字节
mww ['phys'] <addr> <value> 向(物理)地址 addr 写入一个字,值为 value
mwh ['phys'] <addr> <value> 向(物理)地址 addr 写入一个半字,值为 value
mwb ['phys'] <addr> <value> 向(物理)地址 addr 写入一个字节,值为 valueload_image <file> <address> [‘bin’|‘ihex’|‘elf’]
将文件<file>载入地址为 address 的内存,格式有‘bin’、‘ihex’、‘elf’
dump_image <file> <address> <size>
将内存从地址 address 开始的 size 字节数据读出,保存到文件<file>中
verify_image <file> <address> [‘bin’|‘ihex’|‘elf’]
将文件<file>与内存 address 开始的数据进行比较,格式有‘bin’、‘ihex’、‘elf’reg 打印寄存器的值
arm7_9 fast_memory_access ['enable'|'disable']
使能或禁止“快速的内存访问”
arm mcr cpnum op1 CRn op2 CRm value 修改协处理器的寄存器
比如:arm mcr 15 0 1 0 0 0 关闭 MMU
arm mrc cpnum op1 CRn op2 CRm 读出协处理器的寄存器
比如:arm mcr 15 0 1 0 0 读出 cp15 协处理器的寄存器
arm920t cp15 regnum [value] 修改或读取 cp15 协处理器的寄存器
比如 arm920t cp15 2 0 关闭 MMU
virt2phys virtual_address 获得虚拟地址对应的物理地址