title: OpenOCD-JTAG调试
tags: ARM
date: 2018-10-13 23:36:28
Todo
[ ] JTAG 调试linux内核
[ ] linux下使用OpenOCD调试
[x] win下使用OpenOCD调试
概述
学习文档 韦东山 Eclipse,OpenOCD,OpenJTAGv3.1嵌入式开发教程版本5.pdf
硬件连接: PC>JTAG调试器>CPU
软件控制:IDE(KEIL/ADS/)> GDB(指令)> OpenOCD(实际命令)> JTAG调试器> 单板
JTAG控制CPU功能:
当CPU的地址信号ADDR=xxx,停止CPU-硬件断点
当CPU的数据信号DATA=xxx,停止CPU--软件断点
重新运行CPU
读取R0,..寄存器
控制外设,内存
百问网的OpenJTAG.exe这个GUI实际是封装了openocd.exe命令行
设置Workdir到程序代码目录
点击telnet,或者直接cmd输入telnet 127.0.0.1 4444
使用help查看帮助或者查看`Eclipse,OpenOCD,OpenJTAGv3.1嵌入式开发教程版本5.pdf
断点
硬件断点:一个程序只能打两个断点(ARM7),可以调试ROM,NOR
设置CPU里面的JTAG比较器,使硬件断点 Addr=A,当CPU发出A地址时停止
CPU是如何运行?CPU需要取指令,也就是需要发出地址信号去取得指令,JTAG就检测到这个地址
软件断点,可以有无数个软件断点.前提是断点的地址可写,所以无法调试NOR,或者ROM上的程序,具体可以看下面的led.c的示例
设置CPU里面的JTAG比较强,使其值=一个特殊值
替换掉希望断点位置(A)的值=这个特殊值,做好备份
当CPU读取到这个特殊值,程序断点
重新运行时,恢复这个(A)位置的指令
快速使用
常用命令
halt 停止cpu
reg 查看寄存器
mdw 0 //memory display word 查看内存
mww 0 0x12345678 //memory write word
load_image leds.bin 0 //下载程序到0地址,然后可以使用mdw读取0,看看是不是程序的bin
resume 0 //指定地址运行,如果不指定地址,则恢复运行
reset 复位目标板子
reset halt
step 0 //执行第一句话,并halt
step //单步执行
bp设置断点
bp 0x6c 4 hw 在0x6c的地址位置设置断点,硬件断点
rpb 0x6c 取消断点
测试led的断点
//led.c
void wait(volatile unsigned long dly)
{
for(; dly > 0; dly--);
}
int main(void)
{
unsigned long i = 0;
GPFCON = GPF4_out|GPF5_out|GPF6_out;
while(1){
wait(30000);-------------------尝试在这里断点,就能观察灯的变化
GPFDAT = (~(i<<4));
if(++i == 8)
i = 0;
}
return 0;
}
//反汇编摘要
00000044 :
44:e52de004 strlr, [sp, #-4]!
48:e24dd004 subsp, sp, #4; 0x4
4c:e3a03000 movr3, #0; 0x0
50:e58d3000 strr3, [sp]
54:e3a03456 movr3, #1442840576; 0x56000000
58:e2833050 addr3, r3, #80; 0x50
5c:e3a02c15 movr2, #5376; 0x1500
60:e5832000 strr2, [r3]
64:e3a00c75 movr0, #29952; 0x7500
68:e2800030 addr0, r0, #48; 0x30
6c:ebffffe9 bl18 ---------------------------尝试在这里断点
70:e3a02456 movr2, #1442840576; 0x56000000
74:e2822054 addr2, r2, #84; 0x54
78:e59d3000 ldrr3, [sp]
7c:e1a03203 movr3, r3, lsl #4
80:e1e03003 mvnr3, r3
84:e5823000 strr3, [r2]
88:e59d3000 ldrr3, [sp]
8c:e2833001 addr3, r3, #1; 0x1
90:e58d3000 strr3, [sp]
94:e3530008 cmpr3, #8; 0x8
98:1afffff1 bne64
9c:e3a03000 movr3, #0; 0x0
a0:e58d3000 strr3, [sp]
a4:eaffffee b64
Disassembly of section .debug_line:
使用openocd命令来调试断点
halt
load_image leds.bin 0 //下载程序
resume 0 //指定地址运行,如果不指定地址,则恢复运行
halt
bp 0x6c 4 hw //在0x6c的地址位置设置断点,硬件断点
resume//反复这个断点,就能观察灯的变化了
测试软件断点是否改变ram值
//读取原来的值
> mdw 0x6c
0x0000006c: ebffffe9
//设置软件断点
> bp 0x6c 4
breakpoint set at 0x0000006c
//读回这个ram值,发现改变了
>