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:打开寄存器显示窗口


什么是JTAG那么,我怎么样才能利用它呢? 

深入理解jtag接口协议

模拟JTAG协议脱机编程

JTAG基本原理与调试

JTAG的TAP状态机介绍

[JTAG]跟我学JTAG协议破解——第一弹+初识JTAG+TAP状态机

JTAG原理和应用

JTAG IEEE 1194.1笔记

jlink使用方法笔记

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐