赞
踩
JTAG/JLINK/OPENOCD/GDB
小狼@http://blog.csdn.net/xiaolangyangyang
JTAG:边界扫描链,硬件上有4根线,分别是TMS/TCK/TDI/TDO,协议上属于硬件协议;
JLINK:将串口协议转换成JTAG协议的硬件模块,串口端支持JLink cmd,JTAG段支持JTAG协议
JTAG有两种用途:
1、芯片可测试方法DFT的一种,用于测试芯片;
2、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 |
用户定义 | 用户定义 | 测试 | 用户定义 |
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
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
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:打开寄存器显示窗口
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。