使用openocd调试Linux内核,OpenOCD-JTAG调试

本文介绍了如何使用OpenOCD和JTAG调试Linux内核,详细阐述了硬件连接、软件控制流程以及JTAG的功能。通过实例展示了设置硬件和软件断点、读取寄存器、内存操作等调试步骤,还提到了OpenOCD的常用命令和烧录程序的过程。此外,文章提及了SDRAM初始化和GDB在Linux及Windows下的使用,以及Eclipse集成调试环境的配置方法。
摘要由CSDN通过智能技术生成

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值,发现改变了

>

你可以使用Cortex-Debug和OpenOCD调试泰凌微(TCL)微控制器。首先,确保你已经安装了OpenOCD和Cortex-Debug插件。然后,按照以下步骤进行设置和调试: 1. 配置OpenOCD:创建一个OpenOCD配置文件,用于连接和调试泰凌微芯片。在该配置文件中,指定目标设备和连接接口。你可以参考OpenOCD的文档和泰凌微芯片的手册来设置正确的配置。 2. 配置Cortex-Debug:在VS Code中打开你的项目,并确保已经安装了Cortex-Debug插件。打开调试器视图(Ctrl+Shift+D),然后点击配置按钮。选择"Cortex Debug"配置,它会在你的项目中创建一个`.vscode/launch.json`文件。 3. 在`.vscode/launch.json`文件中,找到`configurations`部分,并添加一个新的调试配置。配置项中需要指定OpenOCD的路径和配置文件路径。例如: ```json { "version": "0.2.0", "configurations": [ { "name": "Debug with OpenOCD", "type": "cortex-debug", "request": "launch", "servertype": "openocd", "configFiles": [ "${workspaceRoot}/path/to/openocd.cfg" ], "executable": "${workspaceRoot}/path/to/your/executable.elf", "svdFile": "${workspaceRoot}/path/to/your/svdfile.svd" } ] } ``` 确保将路径替换为你自己的OpenOCD配置文件、可执行文件和SVD文件的路径。 4. 现在你可以在VS Code中使用Cortex-Debug来调试泰凌微芯片了。点击调试视图中的绿色播放按钮,它将使用OpenOCD连接到目标设备,并开始调试你的代码。 这里只是一个简单的配置示例,你可以根据你的具体情况进行调整。确保你已经正确配置了OpenOCD和Cortex-Debug,并按照泰凌微芯片手册中的要求进行设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值