当前位置: 首页 > news >正文

手把手教你用EJTAG调试龙芯开发板:从硬件连接到GDB远程调试

龙芯开发板EJTAG调试实战:从硬件对接到源码级调试全解析

第一次接触龙芯开发板的EJTAG调试时,我盯着那排密密麻麻的接口引脚发愣——TDI、TDO、TCK、TMS这些缩写就像密码一样让人摸不着头脑。更让人崩溃的是,当你好不容易接上线缆,却发现调试器毫无反应,而开发板却开始发烫。这种经历相信不少嵌入式开发者都深有体会。本文将带你避开这些坑,从硬件连接到GDB远程调试,一步步掌握龙芯平台的底层调试技巧。

1. 认识EJTAG:龙芯调试的钥匙

EJTAG作为MIPS架构的专用调试接口,在龙芯处理器上扮演着不可替代的角色。与常见的JTAG不同,EJTAG在标准JTAG基础上扩展了更多调试功能:

  • 处理器控制:暂停/恢复CPU执行、单步调试
  • 寄存器访问:直接读写通用寄存器和特殊功能寄存器
  • 内存操作:查看和修改任意内存地址内容
  • 断点支持:硬件断点设置与触发

龙芯2K1000、3A5000等主流型号都支持完整的EJTAG功能,但需要注意早期型号如龙芯2F并不兼容。在开始调试前,建议先用cat /proc/cpuinfo确认处理器型号:

processor : 0 cpu model : Loongson-3A R4 (Loongson-3A5000) @ 2500MHz

2. 硬件连接:避开那些看不见的坑

2.1 接口定义与线序

龙芯开发板通常采用2×7 2.54mm间距的排针作为EJTAG接口,实际使用中需要注意:

引脚信号方向说明
1EJTAG_TMS输入测试模式选择
3EJTAG_TCK输入测试时钟(建议<10MHz)
5EJTAG_TDI输入测试数据输入
7EJTAG_TDO输出测试数据输出
9EJTAG_TRST输入测试复位(低电平有效)
11GND-接地

重要提示:12号引脚通常不焊接,连接时务必确认1脚位置(通常有方形焊盘标记),反接可能导致硬件损坏。

2.2 调试工具选型

市面上常见的EJTAG调试器主要有:

  1. 龙芯官方调试器

    • 兼容性最佳
    • 支持USB 2.0高速传输
    • 识别为ID 2961:6688
  2. 开源方案

    • 基于FT2232H的方案
    • 成本较低但需要自行编译驱动
    • 适合DIY爱好者

连接后,可以通过lsusb命令确认调试器是否被正确识别:

$ lsusb Bus 001 Device 004: ID 2961:6688 Loongson EJTAG Debugger

3. 软件工具链配置

3.1 安装ejtag-debug

ejtag-debug是龙芯官方提供的调试工具套件,安装步骤如下:

# 下载源码包 wget http://ftp.loongnix.org/toolchain/ejtag-debug/ejtag-debug-3.10.13.tar.gz # 解压并编译 tar zxvf ejtag-debug-3.10.13.tar.gz cd ejtag-debug-3.10.13 ./configure --prefix=/opt/ejtag make -j4 sudo make install

编译依赖包括:

  • flex/bison
  • libusb-1.0
  • readline开发包

3.2 常用调试命令

进入交互模式后,可以执行多种调试操作:

$ /opt/ejtag/bin/ejtag_debug ejtag> cpu0 ejtag> reg $a0 # 读取a0寄存器 ejtag> mem 0x80000000 # 查看内存内容 ejtag> dis 0x80001000 5 # 反汇编5条指令

4. GDB远程调试实战

4.1 配置gdbserver

ejtag-debug内置了GDB server功能,启动命令如下:

ejtag_debug --gdbserver --port 2333

在另一个终端中,使用交叉编译工具链中的gdb连接:

loongarch64-linux-gnu-gdb vmlinux (gdb) target remote :2333 (gdb) b start_kernel # 设置内核断点 (gdb) c # 继续执行

4.2 调试技巧

  1. 硬件断点

    (gdb) hbreak *0x80001000

    相比软件断点,硬件断点不会修改指令,适合调试ROM代码

  2. 查看反汇编

    (gdb) layout asm (gdb) ni # 单步执行汇编指令
  3. 监控变量

    (gdb) watch *(int*)0x8000ff00

5. 常见问题排查

问题1:连接后无响应

  • 检查线序是否正确
  • 测量TCK信号是否有波形
  • 确认TRST信号是否处于无效状态(高电平)

问题2:GDB连接超时

  • 确认防火墙放行了2333端口
  • 检查ejtag_debug是否以root权限运行
  • 尝试降低TCK频率(添加--clock 1000000参数)

问题3:寄存器读取错误

  • 确认CPU是否处于调试状态
  • 检查电源稳定性
  • 尝试复位目标板后重新连接

记得第一次成功通过EJTAG进入内核调试时,那种"一切尽在掌握"的感觉至今难忘。当你在凌晨三点终于捕捉到那个诡异的竞态条件,就会明白这些调试技巧的价值所在。

http://www.jsqmd.com/news/669315/

相关文章:

  • Production Rails扩展架构设计:如何从单体应用到分布式系统的平滑演进
  • Git实战:当.gitignore遇上submodule子仓库,如何避免文件忽略失效的坑?
  • 避坑指南:在Win10上用VS2019编译ITK 5.2和RTK 2.3,我踩过的那些坑都帮你填平了
  • Driver Store Explorer实战:5步实现Windows驱动管理自动化
  • Open UI5 源代码解析之1104:MenuItem.js
  • STM32 IAP升级必备:3分钟搞定Hex文件合并(附常见错误排查)
  • 保姆级教程:在RuoYi-AI里用Ollama跑通本地Llama3模型(附完整配置截图)
  • 题解:AcWing 423 采药
  • CSS开发大型项目如何管理_使用BEM命名规范避免样式冲突
  • AGI自主规划能力认证体系(ISO/IEC 23894-2:2024草案深度解读):含6类强制审计项与21个否决性缺陷清单
  • SSD硬盘对HTML工具速度有影响吗_存储介质与开发效率关系【详解】
  • Python多进程编程:从阻塞到异步,掌握apply与apply_async的核心差异与实践
  • Linux 了解硬件体系结构和操作系统内核的管理
  • IntelliJ IDEA集成CheckStyle:从插件配置到Maven集成的完整指南
  • Simulink代码生成实战:如何让参数结构体在C代码里也‘整整齐齐’
  • 题解:AcWing 1023 买书
  • LaTeX论文排版救星:用rotating宏包搞定超宽表格横置(附sidewaystable完整代码)
  • 如何快速上手FlashDB:5分钟学会嵌入式数据存储
  • AI编程从零起步:手把手教你开发自己的第一个Skill
  • 抓包工具Fiddler(http与fiddler)
  • 2026年3月国内机加工实力厂家,非标自动化设备设计/非标不锈钢钣金/工具柜,机加工实力厂家哪家好 - 品牌推荐师
  • 从Clover到OC:我的戴尔G7笔记本黑苹果升级踩坑全记录(附完整EFI)
  • C# .NET 与 SAP RFC 接口交互:从参数映射到实战封装
  • 题解:AcWing 1021 货币系统
  • uni-app怎么获取微信小程序的当前运行版本 uni-app判断开发版与线上版【技巧】
  • 如何快速上手PushNotifications:5分钟学会iOS和Android推送测试
  • 电子元件知识汇总4-采购与真伪识别
  • 如何防止SQL并发更新冲突_利用触发器实现悲观锁定机制
  • Skills到底怎么装?本地、ClawHub、命令行,三种方式全拆解
  • Faster RCNN 演进之路 01-基石篇:从RCNN到RoI Pooling的核心思想与代码实践