OPENJTAG调试学习(一):嵌入式软件的交叉开发系统

简介: OPENJTAG调试学习(一):嵌入式软件的交叉开发系统

一、OpenJTAG 套件简介

在嵌入式开发中,有很多优秀的调试、仿真工具,比如 Keil、IAR、Rowley Associates 等。

它们的安装、使用都很便利,功能强大,但是价格昂贵(几百美元甚至更多);还要购买相应

的硬件,比如 J-Link、U-Link 等 USB 到 JTAG 的转换盒,这也是一笔不小的开支。

对于学生,或者是开发预算有限的工程师来说,完全可以使用免费的开发工具 Eclipse、

OpenOCD,然后通过一些便宜的 JTAG 转接器(比如并口 JTAG 等)就可以达到接近、甚至超

越上述商业软件的效果。

并 口 JTAG 速率太低,一般很少使用。本教程使用 OpenJTAG 转换器,配合

Eclipse,OpenOCD 等开源软件,就可以完成下载、烧写、调试等任务。

OpenJTAG 的外观及性能见图 1.1、表 1.1,它含有 3 大功能:USB 转串口,USB 转 JTAG,

在线调试。无论是台式机,还是缺乏串口、并口的笔记本,都可以使用

二、嵌入式软件的交叉开发系统

一套完整的交叉开发系统从上到下,可以分为 4 个部件:

  • 集成开发环境(IDE,IntegratedDevelopment Environment,比如 Eclipse)、
  • 交叉编译工具链、
  • 一个接收各种操作命令(复位、暂停、读/写等)的守护进程(Daemon program,如 OpenOCD)、
  • 用来连接 PC 与单板的 JTAG 接口板。

1-交叉编译工具链

交叉编译工具链是嵌入式开发中最核心的工具,它被用来编译、链接、调试程序。在集成开发环境出现之前,我们通常是先使用其他编辑工具(比如记事本、Source Insight 等)写好代码,然后通过命令行进行编译、链接。

2-集成开发环境

集成开发环境将各种命令“封装”起来,通过各种按钮就可以编译、调试程序;它还提供一个现代化的软件编辑器。Eclipse 的操作界面如图 1.3 所示

下面以一个例子来看看 Eclipse 是如何与交叉编译工具链协同,来编译、链接程序的。

在图 1.3 的“工程窗口”中有一个“Makefile”文件,Eclipse 根据它来调用交叉编译工具链。Makefile 内容如下:

  • 当在 Eclipse 里按下“Build All”、“Build Project”按钮时,就相当于在命令行里执行“make all”命令,它根据 Makefile 的指示编译出 head.o、init.o、leds.o,然后链接成 elf 格式的可执行文件 mmu_elf,最后制作二进制可执行文件 mmu.bin、制作反汇编文件 mmu.dis。
  • 当点击 Eclipse 的菜单“Project -> Clear…”时,就相当于在命令行里执行“make clean”命令,它根据 Makefile 的指示删除 mmu.bin、mmu_elf、mmu.dis、head.o、init.o、leds.o。
  • 当在 Eclipse 里按下“External Tools”按钮时,它将根据当前工程的配置信息启动OpenOCD,这将在后面说明。
  • 当在 Eclipse 里按下“Debug”按钮时,它将根据当前工程的配置信息启动 GNU 源码级别的调试器 arm-elf-gdb.exe(Windows 下)或 arm-linux-gdb(Linux)下,这将在后面说明。

可见,Eclipse 就是一个提供友好操作界面的图形程序,它最终还是根据 Makefile 来编译、链接、清除程序,根据配置信息启动守护进程 OpenOCD、调试器(arm-elf-gdb.exe 或arm-linux-gdb)来调试程序。

Eclipse 的作用并不仅仅是提供按钮来启动其他程序,它的更大用处在于使调试程序更加便利:直接在源码中双击即可设置断点、将鼠标放到某个变量上即可看到它的值、查看内存、查看 CPU 寄存器、点击按钮即可暂停/重新运行程序等等。其实这些功能也是调试器(arm-elf-gdb.exe 或 arm-linux-gdb)实现的,但是 Eclipse 再次把它们“封装”起来,使得“傻

瓜都会用”。

三、4 个部件的相互作用

下面介绍调试程序时,这 4 个部件的相互作用。

使用 Eclipse 进行调试时,它会自动启动调试器(arm-elf-gdb.exe 或 arm-linux-gdb)。请参考图 1.2,Eclipse 使用 GDB/MI 协议与调试器进行通信。

举个例子,当你把鼠标放在 i 上时,Eclipse 就会发出“print i”的命令给 GDB,如图 1.4所示。

调试器根据前面编译出来的 mmu_elf 文件(里面包含指令和符号信息)得知变量 i 的类型是“unsigned long”,地址是 0xb2ffffec。

于是它向守护进程 OpenOCD 发出一个“读内存”的命令“$m0xb2ffffec,4#cs”,这个命令遵循 RSP 协议(Remote Serial Protocol),表示从内存地址0xb2ffffec 处读出 4 字节,如图 1.5 所示。

调试器 OpenOCD 接收到 GDB 的命令后,将它通过 USB 协议发送给 JTAG 接口板,如图1.6 所示。

最后一步就是 JTAG 接口板与 CPU 的交互了ARM7、ARM9 等 CPU 核里有一个被称为“嵌入式 ICE 宏单元”(Embedded ICE macrocell)的部件,借助它可以对系统进行实时仿真和跟踪调试,要通过 JTAG 接口来访问它JTAG 接口板完成 USB 协议到 JTAG 协议的转换,如图 1.7 所示。

参考资料:

《Eclipse,OpenOCD,OpenJTAG教程》

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
存储 算法 开发工具
文档管理软件版本控制算法的代码例子
提供一个基本的示例,展示如何使用Python中的字典数据结构来模拟一个简单的版本控制系统。
531 0
|
13天前
|
敏捷开发 数据可视化 算法
瀑布模型大揭秘:如何用分段式开发轻松搞定软件项目?
瀑布模型是软件开发中最早的线性开发方法,由Winston W. Royce于1970年提出。该模型将项目分为需求分析、系统设计、实现、集成与测试、部署和维护六个阶段,每个阶段自上而下依次进行。尽管近年来敏捷开发备受推崇,但瀑布模型在需求明确、流程复杂的项目中仍具重要价值。本文将详细介绍瀑布模型的概念、主要阶段及步骤,并探讨如何使用项目管理工具如板栗看板,帮助团队高效协作。
21 0
|
6月前
构建安全可靠的系统:第十一章到第十五章
构建安全可靠的系统:第十一章到第十五章
208 0
|
4月前
|
监控 网络协议 算法
我将根据系统工程的角度,给出一个基于Python的楼宇设备自控系统工程的代码示例或详解。
我将根据系统工程的角度,给出一个基于Python的楼宇设备自控系统工程的代码示例或详解。
|
4月前
|
监控 网络协议 安全
由于楼层自动化系统的复杂性和多样性,很难给出一个通用的Python代码示例,因为每个系统可能使用不同的硬件、通信协议和软件接口。
由于楼层自动化系统的复杂性和多样性,很难给出一个通用的Python代码示例,因为每个系统可能使用不同的硬件、通信协议和软件接口。
|
6月前
|
程序员 Python
揭秘单步调试:掌握这一技能让你代码无懈可击
揭秘单步调试:掌握这一技能让你代码无懈可击
47 0
|
运维 算法 调度
(文章复现)建筑集成光储系统规划运行综合优化方法matlab代码
参考文献: [1]陈柯蒙,肖曦,田培根等.一种建筑集成光储系统规划运行综合优化方法[J].中国电机工程学报,2023,43(13):5001-5012.
|
监控 安全 测试技术
嵌入式软件测试笔记10 | 嵌入式软件测试中如何进行安全性分析?
嵌入式软件测试笔记10 | 嵌入式软件测试中如何进行安全性分析?
168 0
|
传感器 测试技术
嵌入式软件测试笔记1 | 简单说明 & 嵌入式系统认识和测试目标
嵌入式软件测试笔记1 | 简单说明 & 嵌入式系统认识和测试目标
9499 0
|
机器学习/深度学习 Oracle 关系型数据库
华为团队开发组合贝叶斯优化框架,进行抗体计算机设计
华为团队开发组合贝叶斯优化框架,进行抗体计算机设计
159 0