文章目录
裸板调试方 需要结合汇编源码
点灯
串口打印
JTAG
JTAG(Joint Test Action Group,联合测试工作组),主要用于芯片内部测试。
标准的JTAG接口是4线:TMS、TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。
JTAG位于CPU内部,当cpu与外设的地址信号,数据信号都要经过JTAG。
电脑上的应用程序有 keil、ADS、openOCD
JTAG调试器有Jlink、openJTAG、并口wigger。
可以控制cpu,
如,当地址信号 == xxx 时,让cpu停止工作,读寄存器,重新运行 ,,,硬件断点(ARM9只有两个比较器)
如,当数据信号 == xxx时, 让cpu停止工作,读寄存器,重新运行,,,软件断点
cpu从0地址执行,想让运行在某地址时停止
1. 设置硬件断点
设置JTAG的比较器,让ADDR == xxx,当cpu发出xxx地址时停止。
2.设置软件断点
设置JTAG的比较器 DATA == B 并且修改xxx地址的内存的值为B,当CPU读入的值 == B时 停止。重新运行时回复xxx地址的原来值。
用硬件断点只能打两个断点,可调nor上的程序。
软件断点可以是无数个,前提是各个xxx地址可写,因此无法调试NOR 和 rom等无法像内存一样写的存储器上的程序。
汇编级别 用openJTAG调试 逐条指令调试
装好驱动,打开telnet功能,点击telnet,
结合汇编代码,难度大,要求高,
- 先停止cpu
halt
- 再加载bin到内部ram的0地址
load_image nand.bin 0
poll
查看当前pc值 cpu执行的到哪里的step 0
使cpu从0地址开始执行一步 pc置0step
运行一条指令resume 0
从头开始运行reg
查看寄存器值mdw 0x53000000
读取某个地址的值mww 0x30000000 0x12344567
将值写入地址
源码级别 用openJTAG调试
重定位之前的代码不能用源码级别的调试,只能用汇编级别的调试,逐条指令调试。
有工具 arm-linux-gdb,win下arm-elf-gdb,但都是用的命令行,这些工具依赖
有eclipse软件,图形界面,但是也是依赖arm-elf-gdb,所以需要先安装gcc-arm-none-eabi-xxxx-major-win32.exe。
源码级别调试,有前提
- 源码已经重定位好,处于对应的连接地址。在源文件某处A设置断点,底层的情况,JTAG会根据断点A所在内存地址的位置去修改内存(软断点)。
- 若程序链接地址是SDRAM,用openocd初始化SDRAM
- 用openocd下载代码到SDRAM
- 链接脚本lds对代码的分段必须是固定形式,.text .data(.rodata .data) .bss
- 被调试的程序为elf格式,里有“调试信息” 编译时加-g
命令行源码级别调试
- 先用openocd初始化内存,借助init.bin,(
halt---load_image init/init.bin
) - 再用gnu-gcc-arm工具连接openocd,(
arm-xxx nand_elf---target remote 127.0.0.1:3333
) - 再下载elf文件,(
load
) - 执行一条指令
si
- 设置断点
break main.c:21
文件的21行 - 继续运行到断点处,
c
(continue) - 列出当前处源代码,
l
(list)
eclipse GUI源码级别调试
也必须先设置内存,初始化内存。。。。
新建新工程
虫子 调试配置
新建调试文件,选择文件
commands窗口填写:
target remote 127.0.0.1:3333
load
break _start
c