最近在SEGGER的博客上看到Johannes Lask写的一篇关于在调试时使用printf函数从目标MCU输出信息到调试器的文章,自我感觉很有启发,特此翻译此文并推荐给各位同仁。当然限于个人水平,有不当之处恳请指正。原文网址:https://blog.segger.com/getting-printf-output-from-target-to-debugger/

Erich Styger最近发布了一篇《关于如何使用ARM Cortex-M目标上的单线输出(SWO)添加控制台功能》的伟大教程。

这激发了我写一篇在嵌入式目标(包括SWO和RTT)上的调试输出(“printf”)实现的更普遍的文章。

从目标调试输出

有不同的方法来从目标应用程序获取调试输出。

自从早期嵌入式系统以来,已经有了硬件依赖的解决方案,如使用UART或USB CDC。但是应用程序可能已经使用了UART,CDC需要目标硬件上的USB堆栈和USB连接器。

第一个软件解决方案是semihosting。使用semihosting,CPU停止打印输出,并由调试器重新启动“幕后”操作。打印一个消息可能需要几毫秒到几百毫秒的时间,因为这是一个昂贵的操作。调试器需要意识到目标已经停止执行,读取寄存器和内存,写入内存,然后重新启动CPU。这意味着目标CPU在这段时间内不运行。因此,semihosting可以简单地不用于需要实时行为的应用,例如通信栈。另外,semihosting实现是依赖于调试器的,而使用semihosting的应用程序可能在没有连接调试器的情况下运行。

然后还有ARM的SWO跟踪端口和SEGGER的实时传输(RTT)。

单线输出

SWO是由ARM为Cortex-M3,M4和M7设备设计的单引脚接口。引脚可以使用标准调试连接器连接到调试探头,并与SWD接口(而不是JTAG)一起使用。目标MCU可以在CPU引脚上传输数据包,类似于UART TX引脚,时钟速率来自CPU时钟。在调试器上设置SWO需要知道CPU时钟速度。如果应用程序的某些部分在启动前必须在初始化之前进行输出,或者在应用程序运行时时钟速度发生变化,那么这一点尤为重要。SWO不会如semihosting发送输出那样停止CPU。通过SWO的输出速度取决于组态的SWO速度。数据分组,即调试输出分组,以特殊格式编码。这允许发送多达32个数据包类型(刺激),但也会导致一些协议开销,这将以10 MHz SWO速度将事情减慢到〜1.5 us / char。这意味着输出80个字符大约需要120个微秒。要在RTOS或中断程序中使用来自多个任务的SWO,在SWO输出期间应禁用中断,这可能会影响系统的实时行为。

尽管SWO最常用于打印调试消息。它也可用于记录中断进入/退出和功能进入/退出,定期对PC值或内存中的变量进行采样,或者用于事件通知。

Erich全面介绍了如何在调试消息中使用SWO,如何在目标上进行设置,以及如何在主机上获取输出。

实时传输

RTT是SEGGER的调试终端解决方案。它将SWO的优点与其他方法的特点相结合。RTT是一种仅用于软件的解决方案,而不是标准调试连接以外的目标设备上不需要额外的硬件。它可以与任何J-Link一起使用,即使使用诸如J-Link OB,OpenSDA或转换的ST-LINK等小型板载机型。

RTT允许非常高的传输速度,而不会影响目标的实时行为。没有协议开销,打印消息可以在一微秒或更短的时间内完成,基本上只需要做一个单个memcpy()的时间。由于RTT的速度非常快,所以输出可以通过锁定中断来保证线程安全,而这种中断对系统的实时行为影响最小。当目标应用程序正在运行时,输出消息由J-Link读取并传输到主机。

与UART类似,RTT是双向的。您可以从主机向目标应用程序发送输入。双向通信允许您控制目标系统,而无需任何其他输入设备。使用RTT可以实现全功能终端。

RTT实现源代码可以自由地在任何系统中使用,提供功能和自由。

在主机上使用RTT是灵活并且容易的。J-Link软件包括可以与任何调试工具并行使用的RTT Viewer,一个GUI。您还可以使用Telnet客户端连接到调试会话(端口19031)并与目标进行通信。一些调试器甚至直接集成RTT。Embedded Studio和独立调试器Ozone可以在其终端窗口中通过RTT显示目标输出,并且不需要任何其他工具。

概要

printf调用与不同实现的速度比较

在从嵌入式目标执行SWO调试输出之前,只能使用低效或依赖硬件的方法。

使用SWO ARM设计了一个快速的解决方案。它重量轻且快速,但具有一些缩写,因为它仅在某些Cortex-M器件上可用,需要额外的引脚连接到MCU,并且是单向的。

RTT结合了SWO的所有优点,并增加了更多功能。它比SWO更快,不仅限于Cortex-M,允许通过标准调试连接进行双向通信,并且在任何需要系统的实时情况下都是最不具有干扰性的。

当您可以使用RTT时,没有任何理由使用SWO。

欢迎关注:

通过printf从目标板到调试器的输出相关推荐

  1. [Win32]一个调试器的实现(二)调试事件的处理

    上一篇文章说到了调试循环的写法,这回讲一下调试器应该如何处理各种调试事件. RIP_EVENT 关于这种调试事件的文档资料非常少,即使提到也只是用"系统错误"或者"内部错 ...

  2. VC调试器高级应用(转)

    VC调试器高级应用----高级断点篇 一.位置断点修饰符  1.跳跃计数.        功能是执行断点但不在断点处停止,直到执行完了一个特定的次数为止.   使用中首先设置一个标准的位置断点,打开B ...

  3. VC调试器高级应用----系统函数,DLL段点

    一.高级断点语法 高级断点语法由两部分组成:1.上下文部分.2.位置,表达式,变量或Windows消息条件.   用函数,源文件和二进制模块来指定上下文,上下文的表示方法:   {[函数],[源文件] ...

  4. 与调试器共舞 - LLDB 的华尔兹

    转自:http://www.cocoachina.com/ios/20141219/10709.html 你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? 1 NSLog(@"%@& ...

  5. xcode 调试器 LLDB

    本文完全转载,转载地址:点击这里 你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThisThing); 或者跳过一个函 ...

  6. GDB调试器使用手册

    GDB调试器使用手册     使用GDB:     本文描述GDB,GNU的原代码调试器.(这是4.12版1994年一月,GDB版本4.16) * 目录: * 摘要:                  ...

  7. Linux 内核调试器 调试指南

    Linux 内核调试器内幕 KDB 入门指南 Hariprasad Nellitheertha (nharipra@in.ibm.com), 软件工程师, IBM 简介: 调试内核问题时,能够跟踪内核 ...

  8. arm9260 linux编译,关于linux9260烧写软件和gdb调试器的使用

    9260的烧写软件SAM-BA有自己的linux版本,大家可以到网站上去下载,这里作一个烧录笔记,由于9260的usb设备端口需要一个usbserial的linux驱动,所以我们每次使用之前都要加载一 ...

  9. 调试器GDB的基本使用方法

    GDB调试的三种方式: 1. 目标板直接使用GDB进行调试. 2. 目标板使用gdbserver,主机使用xxx-linux-gdb作为客户端. 3. 目标板使用ulimit -c unlimited ...

最新文章

  1. 探究被Win7保留的100MB活动分区
  2. C语言——四字节对齐(4对齐后是4, 5对齐后是8)
  3. python小实验(1):字符串处理
  4. 特别的520,送给特别的你们,还不来看看?
  5. .mvn 需要放git上吗_下巴反复长痘,饮食上需要忌口吗?
  6. 【WXS全局对象】Date
  7. MATLAB中exist函数的用法
  8. AOJ0121 Seven Puzzle【BFS】
  9. 将windbg设置为默认调试器命令
  10. C++ 默认构造函数的构建
  11. pptv图标出现在计算机磁盘,PPTV出现界面乱码如何解决
  12. 9、1.4.1 JDK下载与安装
  13. mysql ocp考试大纲_MySQL OCP考试大纲
  14. vyos安装anaconda3
  15. Astah Pro 快捷键
  16. centos中文、英文乱码
  17. hive练习题(二)计算用户的复购率和回购率
  18. 计算机应用专业职业价值观,计算机应用技术专业大学生职业生涯规划书.doc
  19. php图片处理更新,PHP图片处理的函数学习 | Soo Smart!
  20. Vivado System Generator for DSP - “Error evaluating ‘OpenFcn‘ callback of Xilinx Block“错误解决方法

热门文章

  1. zookeeper学习入门
  2. 洛谷 P1377 [TJOI2011]树的序 解题报告
  3. 二、python框架相关知识体系
  4. luoguP1463:反素数ant(打表心得☆)
  5. sleep(),wait(),yield(),notify()
  6. vb的VSFlexGrid控件
  7. vtk类之vtkImageReslice:基本算法,对体数据沿着轴进行切片
  8. JVM学习笔记-01-JVM的学习方式
  9. 牛客网--字符串合并处理(Java)
  10. Java--PATH环境变量