如何捕获和查看 Cortex-M4 MCU 上的 ITM 跟踪信息?

2024-01-17

我想捕获、解码和查看 Cortex-M4 MCU(在我的例子中是 Atmel SAM4S)的 ITM 跟踪信息。特别是,我想捕获与板上其他信号相关的异常和用户跟踪数据(即在同一时间线上显示所有信号和跟踪信息)。


这可以通过以下步骤完成:

  1. 将调试器置于 SWD 模式。如果在 Linux 上使用 J-Link Segger,可以使用以下命令完成JLinkGDBServer -if swd
  2. 将代码添加到 MCU 以启用跟踪。将比特率设置为适合您需要的值(我使用 8 MHz)。 Ada 代码示例如下。
  3. 使用逻辑分析仪从 SAM4S 处理器捕获 TRACESWO 线上的跟踪数据。我使用了具有 100 MHz 采样率的 Saleae Logic Pro 16。
  4. 将数据转换为 sigrok 可用的格式。使用Saleae捕获数据,包括以下步骤:

    • 仅使用前 8 个通道进行捕获(因此每个样本导出一个字节)。
    • 将数据导出为二进制trace.bin,为每个样本写入一个字节。
    • 使用以下命令转换为trace.sr 文件:

      sigrok-cli -i trace.bin -I binary:samplerate=100000000,numchannels=4 -o trace.sr

  5. 打开trace.srPulseView 中的文件。
  6. TRACESWO通道添加UART解码器,比特率8000000。
  7. 堆栈 ARM-ITM 解码器。

See http://www.sigrok.org/blog/new-protocol-decoders-arm-tpiu-itm-etmv3 http://www.sigrok.org/blog/new-protocol-decoders-arm-tpiu-itm-etmv3了解更多信息。

SAM4S Trace 的 Ada 代码示例:

sam4s-trace.ads:

with Interfaces;

package SAM4S.Trace is
   pragma Preelaborate;

   type Channel_Type is new Integer range 0 .. 31;
   type Value_Type is new Interfaces.Unsigned_32;

   procedure Initialize;

   procedure Put (Channel : Channel_Type;
                  Value   : Value_Type);

   procedure Put (Channel : Channel_Type;
                  Message : String);
end SAM4S.Trace;

sam4s-trace.adb:

with System;
with System.Storage_Elements; use System.Storage_Elements;

package body SAM4S.Trace is
   procedure Initialize is
      ITM_LAR : Interfaces.Unsigned_32
        with Address => System'To_Address (16#E000_0FB0#), Volatile;

      ITM_TCR : Interfaces.Unsigned_32
        with Address => System'To_Address (16#E000_0E80#), Volatile;

      ITM_TER : Interfaces.Unsigned_32
        with Address => System'To_Address (16#E000_0E00#), Volatile;

      ITM_TPR : Interfaces.Unsigned_32
        with Address => System'To_Address (16#E000_0E40#), Volatile;

      DEMR : Interfaces.Unsigned_32
        with Address => System'To_Address (16#E000_EDFC#), Volatile;

      TPIU_SPP : Interfaces.Unsigned_32
        with Address => System'To_Address (16#E004_00F0#), Volatile;

      TPIU_FFCR : Interfaces.Unsigned_32
        with Address => System'To_Address (16#E004_0304#), Volatile;

      TPIU_ACPR : Interfaces.Unsigned_32
        with Address => System'To_Address (16#E004_0010#), Volatile;

      DWT_CTRL : Interfaces.Unsigned_32
        with Address => System'To_Address (16#E000_1000#), Volatile;

      use Interfaces;

   begin
      --  Enable write access via the Lock Access Register.
      ITM_LAR := 16#C5AC_CE55#;
      --  Enable the ITM, enable SWO mode behavior, enable synchronization
      --  packets, enable DWT event submission, enable timestamps.
      ITM_TCR := 16#0001_001F#;
      --  Enable access in user mode to all 32 channels.
      ITM_TPR := 16#0000_0000#;
      --  Enable all 32 trace channels.
      ITM_TER := 16#FFFF_FFFF#;

      --  Set TRCENA bit to 1 in Debug Exception and Monitor Register.
      DEMR := DEMR or 16#0100_0000#;

      --  Select NRZ serial wire output.
      TPIU_SPP := 16#0000_0002#;

      --  Deactivate formatter.
      TPIU_FFCR := 16#0000_0100#;

      --  Set prescalar (/10).
      --  TPIU_ACPR := 16#0000_0009#;

      --  Set prescalar (/15).
      TPIU_ACPR := 14;

      --  Enable exception trace and exception overhead.
      DWT_CTRL := DWT_CTRL or 16#0005_0000#;

   end Initialize;

   procedure Put (Channel : Channel_Type;
                  Value   : Value_Type) is
      Port_Reg : Value_Type with Address => System'To_Address (16#E000_0000#) +
        4 * Channel_Type'Pos (Channel), Volatile;
   begin
      --  Port register lsb is set when the the FIFO can accept at least one
      --  word.
      while Port_Reg = 0 loop
         null;
      end loop;
      Port_Reg := Value;
   end Put;

   procedure Put (Channel : Channel_Type;
                  Message : String) is
      Port_Reg : Value_Type with Address => System'To_Address (16#E000_0000#) +
        4 * Channel_Type'Pos (Channel), Volatile;
   begin
      --  Port register lsb is set when the the FIFO can accept at least one
      --  word.
      for Index in Message'Range loop
         while Port_Reg = 0 loop
            null;
         end loop;
         Port_Reg := Value_Type (Character'Pos (Message (Index)));
      end loop;
   end Put;

end SAM4S.Trace;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何捕获和查看 Cortex-M4 MCU 上的 ITM 跟踪信息? 的相关文章

  • 在位数组中有效查找“1”的位置

    我正在连接一个程序来测试一组电线的开路或短路情况 该程序在 AVR 上运行 将测试向量 步行 1 驱动到电线上并接收返回结果 它将所得向量与已存储在 SD 卡或外部 EEPROM 上的预期数据进行比较 这里有一个例子 假设我们有一组 8 根
  • GCC 中 -O0 和 -O1 的区别

    在编译一些代码时 我注意到 O0 和 O1 之间创建的汇编器存在很大差异 我想运行启用 禁用优化 直到找出导致汇编器发生某种变化的原因 如果我使用 fverbose asm 准确找出 O1 与 O0 相比启用了哪些标志 然后手动禁用它们 为
  • 如何通过链接描述文件将符号放置在特定地址处?

    这是关于 GNU Linker 的 我有一个 可以说 名为的变量myVar 现在我希望我的变量被放置在内存中的某个地址 我使用的编译器有一个 attribute blablabla 这样就可以了 不过我决定使用链接描述文件 从现在开始 我设
  • 有可用的 FreeRTOS 解释语言库吗?

    我在一家公司工作 该公司使用 FreeRTOS 为多个设备创建固件 最近 我们对新功能的要求已经超出了我们固件工程师的工作能力 但我们现在也无力雇用任何新人 即使进行微小的更改 也需要固件人员在非常低的级别上进行修改 我一直在为 FreeR
  • 将 ASM 转换为 C(不是逆向工程)

    我用谷歌搜索 发现数量惊人的轻率回复 基本上都是在嘲笑提出这样问题的提问者 Microchip 免费提供一些源代码 我不想将其发布在这里 以防万一 基本上 谷歌 AN937 单击第一个链接 其中有一个 源代码 链接及其压缩文件 它在 ASM
  • 如何静态识别动态堆分配?

    我即将在我的应用程序中删除 尽可能多的 动态堆分配 我想知道如何确保我没有错过任何内容 目前 我正在寻找一种方法来轻松甚至自动判断代码的任何 或哪些 部分可能会调用以下标准实现new delete or malloc free无需动态跟踪分
  • Python Shell:写入一个字节并从串口读取十进制数据

    问题描述 我正在尝试使用 rs232 检索存储在设备上的所有数据 How 对于这个特定设备 我需要 Step 1 发送一个字节 0x80 uInt8 8 位无符号整数 通过串行端口 COM5 并期望收到 0x81 作为响应 Step 2 发
  • GNU Arm Cortex m4 上的 C++ 异常处理程序与 freertos

    2016 年 12 月更新现在还有一个关于此行为的最小示例 https community nxp com message 862676 https community nxp com message 862676 我正在使用带有 free
  • Linux 中的直接内存访问

    我正在尝试直接访问嵌入式 Linux 项目的物理内存 但我不确定如何最好地指定内存供我使用 如果我定期启动设备并访问 dev mem 我就可以轻松地读写任何我想要的位置 然而 在这里 我访问的是可以轻松分配给任何进程的内存 我不想做 我的
  • 如何使用文件实现循环缓冲区?

    我的应用程序 C 程序 打开同一文件的两个文件句柄 一个处于写入模式 一个处于读取模式 应用程序中的两个单独的线程读取和写入文件 这很好用 由于我的应用程序在 RAM 磁盘大小有限的嵌入式设备上运行 我想写FileHandle在达到最大大小
  • 浮点线性插值

    在两个变量之间进行线性插值a and b给定一个分数f 我目前正在使用这段代码 float lerp float a float b float f return a 1 0 f b f 我认为可能有一种更有效的方法 我使用的是没有 FPU
  • 轻量级加密密钥交换协议

    我有一个嵌入式系统通过 HTTP 将数据发布到 JSON REST 服务 我目前正在使用 HMAC SHA1 进行身份验证 方式与亚马逊AWS http docs amazonwebservices com AWSSimpleQueueSe
  • 在 Visual Studio 中进行嵌入式代码开发(尤其是使用 C18 的 PIC)

    我使用 Visual Studio 编写桌面应用程序 我发现它非常用户友好且易于使用 如果可能的话 我还想在Visual Studio中编写嵌入式代码 例如 是否可以使用 C18 或任何其他类似的基于 C 的语言为 PIC18Fxxx 系列
  • 有人有关于 C 语言设计和错误跟踪/控制系统的好指南吗?

    我是 C 开发的软件工程方面的新手 有没有人有关于如何为 C 项目 尤其是嵌入式 设计错误跟踪或错误控制系统的良好指南 谈论 C 库的错误跟踪也会有帮助 根据我的经验 这里的策略分为几个阵营 全局变量ala的使用errno http www
  • 创建 32 位计数器时出现全局变量问题

    我正在尝试做正交解码 using 爱特梅尔 Xmega AVR微控制器 Xmega只有16 bit柜台 另外 我已经用完了所有可用的计时器 现在要做32 bit柜台我用过一个16 bit柜台并在其over under flow interr
  • 产生并处理软件中断

    有人可以告诉我如何在Linux下生成软件中断然后用request irq处理它吗 或者也许这是不可能的 您可以使用软中断来代替 您可以通过编辑 include linux interrupt h 来定义您的 sofirq 然后使用函数 ra
  • 工作站和嵌入式程序员之间的心态差异[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • MISRA C++(规则 18-4-1)和动态内存分配 - 是否允许 std::string?

    MISRA C 规则 18 4 1 说 不得使用动态堆内存分配 See http dist sonarsource com reports coverage misra c 2008 html http dist sonarsource c
  • 构建 makefile 依赖/继承树

    如果我解释得不好或者问了一些明显的问题 我很抱歉 但我是 Linux 内核的新手 而且有点深入 我们有一个嵌入式 Linux 系统 它附带一个 文档非常糟糕的 SDK 其中包含数百个文件夹stuff 大多数文件夹包含rules make m
  • 在嵌入式 Jetty 上使用 DefaultServlet 提供静态 html 文件

    我正在开发一个需要独立的项目 因此我决定将 Jetty 嵌入到我的应用程序中 我将提供静态 HTML 页面 一些 JSP 页面 并且还将使用一些自定义 servlet 我找到了一个完美的示例 说明如何设置嵌入式 Jetty 来完成所有这一切

随机推荐

  • 如何使用 HEAD 和任何合并工具解决所有冲突

    因此 由于某种原因 我与新的合并修补程序发生了很多冲突 实际 手动 更改的文件没有冲突 所有冲突都在修复过程中未触及的文件中 显然是空格问题 稍后我会尝试解决该问题 但现在我需要合并修补程序并进行部署 如何解决所有冲突以使用 HEAD 版本
  • 在 64 位操作系统中使用 glMultiDrawElements

    我最近从32位环境迁移到64位环境 除了一个问题之外 一切都很顺利 glMultiDrawElements使用一些在 64 位操作系统下不进行一些调整就无法工作的数组 glMultiDrawElements GL LINE LOOP fCo
  • Vavr 对象的序列化器/反序列化器

    您好 我正在尝试将 vavr 添加到我的项目中 现在我正在努力解决 Vavr List 对象的正确序列化问题 下面是我的控制器 import io vavr collection List GetMapping value xxx publ
  • 具有 varchar id 的 Doctrine2 实体不会将 id 插入数据库

    我正在尝试在 ZF2 应用程序中为 Doctrine2 创建实体 我的实体应该有 id varchar 15 但是当我尝试创建新行时 doctrine2 不会将此 ID 推送到数据库中 在实体生成的类中我有这个 Checkpoints OR
  • React - 模块解析失败

    从命令行运行 webpack 时 我一整天都遇到此错误 ERROR in index js Module parse failed home kuro Workspace ExpressJS corate src index js Line
  • Angular.JS:为什么无法编辑输入?

    这是一个奇怪的问题 代码很简单 HTML 代码 ul ul
  • 如果内容超过一定限制,PHP 电子邮件会中断

    我正在使用 PHPmail 发送每日通知电子邮件 但我注意到 如果存储邮件内容的字符串太长 则电子邮件会被中断 即收到的电子邮件中只会显示部分内容 当内容字符串很短时 电子邮件将是完整的 看来 PHP 对字符串的长度有一些限制 我尝试使用e
  • 如何在单击时将按钮图像从打开切换到关闭,反之亦然?

    我一直在尝试通过添加打开状态的图像和添加关闭状态的图像来将按钮的状态从打开切换到关闭 反之亦然 我尝试通过 xml 但是我只能在单击时临时切换它 通过使用按下 焦点等 这是相同的代码 片段 贾斯汀
  • Emacs:仅在迷你缓冲区中禁用行截断

    我在用IDO模式 http www emacswiki org emacs InteractivelyDoThings用于 Emacs 23 中的文件和缓冲区切换 如果目录中有超过一行的文件 以下选项允许调整迷你缓冲区的大小 setq re
  • Windows 中的自签名证书无需 makecert?

    我们有一个收缩包装类型的 Windows 服务器应用程序 我们需要在服务器上创建一个自签名证书以供某些 WCF Web 服务使用 从我们在网络上的搜索来看 Microsoft PlatformSDK 中的 makecert 实用程序似乎无法
  • Python 类中的公共变量?

    我现在正在自学 Python 课程 并发现了这个页面 http www tutorialspoint com python python classes objects htm http www tutorialspoint com pyt
  • Flutter:如何获取 Firestore 中集合的所有文档名称

    我使用 Firestore 在 Flutter 中制作了一个应用程序 现在我将浏览集合中的所有文档 我想获取文档名称 id 和文档字段 并对其执行某些操作 我已经制作了一个显示数据的列表视图 但我无法用它做一些事情 例如 将其添加到列表或其
  • 多线程应用程序执行 onclickBtn 后挂起

    我正在 javaFx 中编写一个天气应用程序 从 openweather org 获取数据 从 openweather 获取 JSON 的整个代码工作正常 也将 JSON 数据转换为对象 我使用lambda表达式来实现Runnable in
  • Python 习语与多次调用 os.path.dirname 获得相同的结果?

    我发现自己需要在源树中获取 python 文件的父目录 该源树是具有一定规律性的多个目录 必须多次调用 dirname 很笨拙 我环顾四周 很惊讶没有找到关于此的帖子 一般场景是 import os path as op third deg
  • 如何在 MSVC 下检测 C++11 的 noexcept 功能?

    我正在使用 C 库 该库的最低要求是 C 03 我在 Visual Studio 2015 下收到一些关于抛出析构函数的警告 algparam h 271 warning C4297 AlgorithmParametersBase Algo
  • 前端和后端可以共享同一个package.json吗?

    我有一个小型个人项目 正在一个存储库中开发 后端是 Node js 服务器 前端是 Vue js 应用程序 我希望它们共享相同的 package json 我想这样做的唯一原因是因为我想使用 scripts 一个通用的 package js
  • 如何解决松散耦合/依赖注入和富域模型之间的冲突?

    Edit 这不是理论层面的冲突 而是实施层面的冲突 另一个编辑 问题在于域模型不作为纯数据 DTO 而不是更丰富 更复杂的对象映射 其中 Order 具有 OrderItems 和一些calculateTotal 逻辑 具体问题是 例如 该
  • 在下次调用之前中断 spring 调度程序任务

    我有一个 Spring Boot 应用程序 它将成为我们想要触发的其他几个进程的编排服务 我目前使用 Spring Scheduling 从数据库动态提取 cron 来设置它 我引入了一个休息方法来触发从数据库中提取新的 cron 信息的过
  • 在 c++11 中全局修复种子

    我正在尝试使用新的c
  • 如何捕获和查看 Cortex-M4 MCU 上的 ITM 跟踪信息?

    我想捕获 解码和查看 Cortex M4 MCU 在我的例子中是 Atmel SAM4S 的 ITM 跟踪信息 特别是 我想捕获与板上其他信号相关的异常和用户跟踪数据 即在同一时间线上显示所有信号和跟踪信息 这可以通过以下步骤完成 将调试器