直接操作硬件是很困难的。每个项目都会带来一些琐碎的问题,例如使用哪个编译器、使用什么通信协议以及如何加载代码。开发人员还需要弄清楚如何在不影响正在执行的程序的情况下调试实时系统。
过去,这需要昂贵且专有的软件,但得益于商用硬件和 OpenOCD 等项目,开发直接在嵌入式硬件上运行的程序比以往任何时候都更容易。
当处理非常小的系统时,程序员已经习惯依赖的优秀功能可能不可用。在这样的系统中,当出现问题时,系统可能会进入未知状态,唯一的解决方法是重置硬件。这样做可以使系统再次工作,但会丢弃任何可能导致问题诊断的信息。硬件调试器可以深入了解 CPU 正在做什么,即使它看起来像是冻结了。
与软件调试器(如 gdb)(它们要么利用操作系统钩子,要么修补正在运行的程序以用特殊指令替换有效代码,从而使操作系统通知调试器事件)相比,硬件调试器利用芯片上的特殊引脚直接与内核通信。通过使用专门设计的连接,硬件调试器为开发人员提供了他们在操作系统下开发时通常依赖的相同工具。一个好的硬件调试器环境允许开发人员中断并检查当前程序状态、查看(有时更改)变量、设置观察点或断点,并全面深入了解实时系统。
高端芯片制造商通常会有一个推荐的开发环境,其中包括操作系统、编译器工具链和特定的调试器盒。有时这将是内部解决方案,而且这些工具通常非常昂贵且使用起来非常繁琐。每个芯片供应商都有自己的环境,这往往导致货架上堆满了奇异的调试硬件。访问文档和硬件/软件工具通常受到保密协议和昂贵合同的限制,这意味着只有大型公司才能获得实时调试的好处。
照片由 Sean Cross 拍摄,CC BY-SA 2.0
OpenOCD 是一个开源的片上调试器 (On-Chip Debugger)。只有少数几种常见的调试协议,而迄今为止最常见的是 JTAG。OpenOCD 支持 JTAG,并且可以利用各种常见的 JTAG 盒来调试各种硬件。OpenOCD 有自己的基于 TCL 的脚本语言和自己的 shell,但它也提供了一个 gdbserver 连接,允许任何支持 gdb 的工具与真实硬件通信。这意味着可以使用从 gdb 本身到 DDD、Eclipse 和 IDA Pro 的任何工具来调试软件。JTAG 需要四根线,但一些较新的 ARM 芯片使用两线变体。协议是相同的,一些芯片同时支持两者。如果电路板具有标准的 0.1 英寸排针并且在 3.3V 下运行,则可能只需使用飞线而无需焊接任何东西。
照片由 Sean Cross 拍摄,CC BY-SA 2.0
如果你有一块 Raspberry Pi,你就拥有了网络连接 JTAG 盒的组件。Raspbian 有一个最新的 openocd 版本可用,所以只需 “apt-get install openocd” 即可安装。该软件包支持各种硬件,包括通用的 FTDI 电缆、Buspirate、通用 GPIO 和特定于平台的 Raspberry Pi GPIO 排针。接线主要是在被调查的设备和进行调查的硬件(例如 GPIO 排针)之间连接导线。
一旦一切都接线并配置好,OpenOCD 就可以深入了解硬件究竟在做什么。该程序在端口 4444 上提供了一个 “telnet” 服务器,可以通过该服务器控制一切。可以停止被调查的设备,并且可以读取或修改内存的任何区域。硬件外围设备通常是内存映射的,这意味着可以通过将值写入内存来直接与硬件通信。对于受支持的芯片,OpenOCD 利用这一点通过将程序写入内存然后运行它们(例如在 Kinetis 系列芯片上)或直接操作闪存寄存器(例如在 STM32 系列上)来重新刷新芯片。
当为 STM32 等嵌入式平台开发代码时,OpenOCD 的 gdb 集成更加方便。除了端口 4444 上的 telnet 服务器外,还在端口 3333 上打开了一个 gdbserver 兼容端口,允许 gdb 与硬件通信。如果为 gdb 提供了通用的嵌入式 ELF 文件,它可以创建函数断点、逐行步进,并捕获目标硬件抛出的某些类型的信号。通过使用标准的 “load” 命令,gdb 也能够重新刷新电路板,这可以加快代码/编译/测试周期。
如果配置正确,OpenOCD 甚至可以提供一定程度的 RTOS 集成。gdb 支持调试多线程程序,OpenOCD 可以通过将目标硬件上运行的各种进程映射为线程来通知 gdb。如果目标启用了调试符号并且正在运行 ChibiOS、ThreadX、FreeRTOS、eCos 或 Linux,gdb 将在其 “info threads” 表下列出进程,用户可以通过选择线程编号在任务之间切换。
OpenOCD 软件包是开源硬件工具箱的一个非常强大的补充。它的多功能性意味着几乎任何可以摆动引脚的东西都有能力成为硬件调试器,而商用硬件的广泛可用性意味着那些没有数百万美元研发预算的人也可以使用这些强大的工具。当与开源硬件和开源嵌入式操作系统结合使用时,神秘崩溃和死锁的根本原因变得显而易见。通过减少追踪这些琐碎问题的时间,为受限平台进行开发变得更加愉快,使开发人员可以更多地思考酷炫的新功能或想法,并通常获得更多乐趣。
硬件
1 条评论