
JTAG/JLINK/OPENOCD/GDB
小狼@http://blog.csdn.net/xiaolangyangyang
JTAG/JLINK/OPENOCD/GDB
小狼@http://blog.csdn.net/xiaolangyangyang
一、OpenOCD
二、JTAG与JLINK的区别
JTAG:边界扫描链,硬件上有4根线,分别是TMS/TCK/TDI/TDO,协议上属于硬件协议;
JLINK:将串口协议转换成JTAG协议的硬件模块,串口端支持JLink cmd,JTAG段支持JTAG协议
三、JTAG用途
JTAG有两种用途:
1、芯片可测试方法DFT的一种,用于测试芯片;
2、JLINK调试debug;
四、JLINK用于debug
寄存器(要求/可选) | 位宽 | Capture Value | 相关指令 |
EXTEST | 0…0* | 测试 | 边界扫描寄存器 |
SAMPLE/PRELOAD | 用户定义 | Normal | 边界扫描寄存器 |
Bypass | 1…1* | Normal | Bypass |
INTEST | 用户定义 | 测试 | 边界扫描寄存器 |
RUNBIST | 用户定义 | 测试 | 用户定义 |
IDCODE | 用户定义 | 测试 | Device ID |
USERCODE | 用户定义 | 测试 | Device ID |
CLAMP | 用户定义 | 测试 | BYPASS |
HIGHZ | 用户定义 | 测试 | BYPASS |
用户定义 | 用户定义 | 测试 | 用户定义 |
五、JLINK V8常用命令集
1、连接到目标板
# usb
2、重启目标板
# r
3、停止cpu运行(halt)
# h
# halt
4、加载文件到设备
# loadbin <filename>, <addr>
5、下载设备数据到本地文件
# savebin <filename>, <addr>, <NumBytes> (hex)
# savebin aaa.bin 0 2000
6、跳到代码段地址执行
# g
7、单步执行
# s
8、设置pc寄存器的值
# SetPC <addr>
9、设置断点(软,硬)
# SetBP <addr> [S/H]
10、读寄存器值,需要在halt状态下
# Regs
11、写寄存器
# wreg <RegName>, <Data>
12、寄存器名可以是
R0-R15 | SP=R13 | PC=R15 | XPSR | MSP | PSP |
RAZ | CFBP | APSR | EPSR | IPSR | PRIMASK |
BASEPRI | FAULTMASK | CONTROL | BASEPRI_MA | IAPSR | EAPSR |
IEPSR | FPSCR | FPS0-FPS31 | CycleCnt |
13、读内存
# mem <Addr>, <NumBytes>
# mem 20002000 20
# mem8 20002000 20
# mem16 20002000 20
# mem32 20002000 20
14、写内存
# w4 <Addr>, <Data>
# w4 20002000 11223344 55667788
# w1 20002000 11 22 33 44 55 66
# w2 20002000 1122 3344 5566
15、设置jtag的传输速率
# speed <freq>|auto|adaptive
# speed 2000k
# speed auto
六、使用JLink+OpenOCD+gdb调试PI4步骤
1、硬件连接jlink;
2、启动openOCD
# openocd -f jlink.cfg -f raspi4.cfg
3、加载固件及cpu复位
# telnet localhost 4444
> halt // hold住cpu
> load_image benos.bin 0x80000 // 将固件image.bin加载到addr地址
> step 0x80000 // 将cpu指针指向addr地址
4、启动gdb进行调试
# aarch64-linux-gnu-gdb --tui benos.elf
(gdb) target remote localhost:3333
(gdb) step
(gdb) next
(gdb) info reg
(gdb) layout reg
七、GDB命令汇总
target [remote] [ip:port]:链接openOCD gdb server
step/s:单步调试,进入函数
next/n:单步调试,不进入函数
run:全速运行
finish:直到当前函数结束
until/u:直到当前循环结束
jump 5:跳转到程序第5行
return:强制返回当前函数
call/print <expr>:强制调用函数
watch i != 10:检测表达式成立则停止
break 6:在当前文件第6行打断点
break func:在当前文件函数处打断点
break fileName:N:在指定文件某行打断点
info breakpoints:显示所有断点
delete N:删除N号断点
delete:删除所有点
clear N:清楚行N上的所有断点
continue:继续运行到下一个断点
backtrace:显示当前函数栈信息
show language:查看当前语言
info frame:查看当前函数的程序语言
info source:显示当前的调试源文件
set language c++:手动设置当前的程序语言为c++
set language:查看可以设置的程序语言
kill:终止一个正在调试的程序
print var:print显示变量(var)值
print /x var:用16进制显示(var)值
print *a@10:如果a是一个数组,10个元素,如果要显示则
print x=4:修改运行时候的变量值
whatis var:显示一个变量var的类型
ptype var:以更详细的方式显示变量var的类型
gdb <program> core:调试同时指明生成core文件
list n1 n2:显示n1到n2行之间的代码
info reg:显示寄存器
layout reg:打开寄存器显示窗口
更多推荐
所有评论(0)