RT1170的ITM SWO配置,实现printf输出及PC指针的采样分析

        最近公司准备启动一个新的项目,使用NXP的MIMXRT1170芯片作为主控,在熟悉芯片的过程中发现RT1176具备ITM和SWO功能模块,于是针对之前项目中因工程庞大导致调试困难的问题,决定使用SWO输出调试信息,这样既可以节省硬件的一个串口,同时还可以通过PC指针信息对工程资源进行分析,经过与芯片厂家沟通,RT1170芯片目前不支持MDK配置SWO,又因为NXP的IDE因为某些个人原因不想用,所以该功能实现都是通过软件寄存器直接配置和开源解析工具实现。

        ITM(Instrumentation Trace Macrocell)和SWO(Serial Wire Output)是Arm Cortex-M处理器中用于调试和跟踪的两个重要功能模块。ITM是一种用于在微控制器上进行实时跟踪的调试技术,它允许程序在运行时输出调试信息,例如变量值、函数调用等。ITM通过SWO(Serial Wire Output)接口将这些信息输出到调试工具,例如调试器或者调试控制台。

1、初始化TRACE_SWO引脚

IOMUXC_SetPinMux(IOMUXC_GPIO_LPSR_11_ARM_TRACE_SWO, 0);
IOMUXC_SetPinConfig(IOMUXC_GPIO_LPSR_11_ARM_TRACE_SWO, 0x02U);

2、SWO的寄存器配置代码如下所示:

#define ITM_TER0 *(volatile unsigned int *)0xE0000E00
#define ITM_TPR  *(volatile unsigned int *)0xE0000E40
#define ITM_TCR  *(volatile unsigned int *)0xE0000E80#define ITM_TER_PORT0 (1<<0)
#define ITM_TCR_ENABLE_ITM (1<<0)
#define ITM_TCR_ENABLE_DWT (1<<3)
#define ITM_TCR_BUS_ID     (1<<16)#define DEBUG_DEMCR *(volatile unsigned int *)0xE000EDFC#define BASE_CSSYS_SWO        0xE0048000
#define BASE_CSSYS_TSGEN      0xE0047000
#define BASE_CSSYS_TPIU       0xE0046000
#define BASE_CSSYS_ATB_FUNNUL 0xE0045000
#define BASE_CSSYS_CTI        0xE0044000
#define BASE_ATB_FUNNUL       0xE0043000
#define BASE_CTI              0xE0042000
#define BASE_ETM              0xE0041000#define SWO_CODR *(volatile unsigned int *)(BASE_CSSYS_SWO+0x10)
#define SWO_SPPR *(volatile unsigned int *)(BASE_CSSYS_SWO+0xf0)
#define SWO_LOCK *(volatile unsigned int *)(BASE_CSSYS_SWO+0xfb0)#define CSSYS_ATB_FUNNUL_CTRL *(volatile unsigned int *)(BASE_CSSYS_ATB_FUNNUL+0)
#define CSSYS_ATB_FUNNUL_LOCK *(volatile unsigned int *)(BASE_CSSYS_ATB_FUNNUL+0xfb0)
#define ATB_FUNNUL_CTRL       *(volatile unsigned int *)(BASE_ATB_FUNNUL+0)
#define ATB_FUNNUL_LOCK       *(volatile unsigned int *)(BASE_ATB_FUNNUL+0xfb0)void BOARD_InitHardware(void)
{CLOCK_EnableClock(kCLOCK_Cstrace);DEBUG_DEMCR = 0x01000000; // Enable trace and debug blockCSSYS_ATB_FUNNUL_LOCK = 0xC5ACCE55;CSSYS_ATB_FUNNUL_CTRL = 0x000003FF; ATB_FUNNUL_LOCK = 0xC5ACCE55;ATB_FUNNUL_CTRL = 0x000003FF;SWO_LOCK = 0xC5ACCE55;SWO_SPPR = 0x00000002; // Select NRZ protocolSWO_CODR = 0x00000015;   // 5 MHzITM_TCR  = ITM_TCR_BUS_ID | ITM_TCR_ENABLE_DWT | ITM_TCR_ENABLE_ITM; //0x0001040AITM_TER0 = ITM_TER_PORT0; // Enable stimulus ports 0*(volatile unsigned int *)0xE0001000 = 0x40000001 // DWT_CTRL [Disable cycle counter and PC events]*(volatile unsigned int *)0xE0001004 = 0x00000000 // DWT_CYCCNT [Clear the cycle counter]*(volatile unsigned int *)0xE0001000 = 0x40001199 // DWT_CTRL [Program Counters]
}

      软件寄存器配置大致如上,其中SWO的寄存器配置参考数据手册《Armv7-M Architecture Reference Manual》、《i.MX RT1170 Processor Reference Manual》,详细配置可参考以上手册。

        3、如果需要使用SWO的printf输出功能,那么则需要重新定向printf,本工程中直接使用的NXP的《MCUXpressoIDE》安装自带的重定向文件“retarget_itm.c”,如果需要可自行安装下载或者使用其它重定向方法。

        4、在程序调用printf输出日志,将初始化的外部SWO引脚与jink的swo引脚相连接,如果你一切顺利都配置成功,通过Jlink SWO Viewer软件即可看到printf输出的日志(注意输入正确的CPU和SWO的频率)。

        5、 接下来进来PC值的采样及分析,本项目使用的Openocd对SWO输出的日志进行存储。OpenOCD(Open On-Chip Debugger)是一个开源的调试和编程工具,它用于与嵌入式系统中的调试接口(例如JTAG、SWD等)进行通信,从而实现对目标芯片的调试、烧录和编程等功能,类似于jlink软件。

        6、Openocd的文件配置。本项目使用的是openocd 0.12.0版本(据测试openocd的不同版本调用指令好像有些差异,使用时应该注意一下,避免后面造成不必要的使用问题),jlink.cfg文件配置如下:

adapter driver jlinktransport select swd

        7、接下来配置芯片的配置文件,本项目使用rt1170芯片,所以在openocd的对应目录下创建相应的芯片配置文件名(如果有可以不创建)"mimxrt1170.cfg",配置如下:

source [find ../tcl/target/swj-dp.tcl]
source [find ../tcl/mem_helper.tcl]#定义MCU型号
if { [info exists CHIPNAME] } {set _CHIPNAME $CHIPNAME
} else {set _CHIPNAME MIMXRT1170
}
#内存小端
set _ENDIAN littleadapter speed 1000swd newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x01 -irmask 0x0f -enabledap create $_CHIPNAME.dap -chain-position $_CHIPNAME.cpu
target create $_CHIPNAME cortex_m -endian $_ENDIAN -dap $_CHIPNAME.dap#RT1170的SWO配置基地址 --- 0xE0048000
tpiu create $_CHIPNAME.tpiu -dap $_CHIPNAME.dap -ap-num 0 -baseaddr 0xE0048000#配置trace及swo引脚时钟、输出文件、使能
$_CHIPNAME.tpiu configure -protocol uart
$_CHIPNAME.tpiu configure -traceclk 132000000 -pin-freq 6000000
$_CHIPNAME.tpiu configure -output trace.fifo   
$_CHIPNAME.tpiu enableitm port 0 on

        8、修改USB串口驱动,因为openocd使用的winusb驱动,所以我们需要将jlink的驱动程序替换成USB驱动程序,以解决驱动问题,本项目使用的zadig软件进行的替换,替换步骤如下:

         9、启动openocd,进入openocd.exe文件目录下,输入指令分别调用上面配置的jlink.cfg和mimxrt1170.cfg文件,如下所示:

        10、 如果不出意外,在你的openocd.exe的根目录下会自动生成一个trace.fifo文件,里边便是SWO的日志文件。

        11、解析trace.fifo文件,本项目使用的是itm-tools,链接如下:https://github.com/japaric/itm-tools,下载后需要搭建rust环境进行编译,如下所示:

        12、itm-tools编译成功后, 进入debug目录下,将上面生成的trace.fifo和工程文件的.elf或.axf拷贝到这个目录下,输入指令:pcsampl trace.fifo -e 文件名.axf/elf,输入指令如下所示说明解析成功。

参考文章链接: https://interrupt.memfault.com/blog/profiling-firmware-on-cortex-m#enabling-pc-sampling-with-itm-and-openocd

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/141899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

04 jenkins中使用各种变量(Powershell、cmd)

批处理中使用jenkins内部和变量插件定义的环境变量&#xff1a;%WORKSPACE%Powershell插件中使用jenkins内部环境变量&#xff1a;${ENV:WORKSPRACE}Powershell函数内部使用函数入参&#xff1a;$($dllname)Powershell中定义变量&#xff1a;$DllNamePowershell中使用powershel…

掌握这11点外贸知识,能够给你外贸工作带来很大提升!

01.产品展示 关于产品展示&#xff0c;非常重要也一再提及&#xff0c;一个好的产品必须包括以下几部分&#xff1a; ● 产品标题准确概括产品&#xff1b; ● 产品图片清晰且包括细节图&#xff1b; ● 提供详尽的产品描述&#xff0c;比如型号、尺寸、材质、配件等等。最好…

Collectors.groupingBy方法的使用

Collectors.groupingBy方法的使用 简单使用 业务场景&#xff1a;现在有5个人&#xff0c;这些人都年龄分部在18-30岁之间。现要求把他们按照年龄进行分组 key&#xff1a;年龄 value&#xff1a;数据列表 package com.liudashuai;import java.util.Arrays; import java.uti…

Linux上C++通过LDAP协议使用kerberos认证AES加密连接到AD服务器

一.前言 记录自己在实现这个流程遇到的各种问题&#xff0c;因为我也是看了许多优质的文章以及组内大佬的帮助下才弄成的&#xff0c;这里推荐一个大佬的文章&#xff0c;写的非常优秀&#xff0c;比我这篇文章写得好得很多&#xff0c;最后我也是看这个大佬的代码最终才实现的…

经典文献阅读之--Fast and Robust Ground Surface Estimation...(均匀B样条采样快速估计地平面)

0. 简介 对于激光雷达的地面估计分割&#xff0c;目前其实有很多方法做了快速并鲁棒的分割&#xff0c;比如说我们之前写的一篇《经典文献阅读之–FEC》一文中就给出了快速分割的方案&#xff0c;当中第一步就是需要对地面进行分割。而我们这次看的是一篇使用均匀B样条的方法来…

H5三网魔幻手游【众神传奇】win服务端+GM授权后台+架设教程

搭建资源下载地址&#xff1a;H5三网魔幻手游【众神传奇】win服务端GM授权后台架设教程-海盗空间

C++ 类型转换static_cast、dynamic_cast、const_cast、reinterpret_cast用法以及区别

在C++中,有四种主要的类型转换操作符:static_cast、dynamic_cast、const_cast、reinterpret_cast。它们各自用于不同的转换场景,并有不同的行为和限制。 static_cast: 用于进行静态类型转换,主要用于相关类型之间的转换,例如数值类型之间的转换、基类到派生类的转换(在安…

(八)Spring源码解析:Spring MVC

一、Servlet及上下文的初始化 1.1> DispatcherServlet的初始化 对于Spring MVC来说&#xff0c;最核心的一个类就是DispatcherServlet&#xff0c;它负责请求的行为流转。那么在Servlet的初始化阶段&#xff0c;会调用init()方法进行初始化操作&#xff0c;在DispatcherSe…

【Python3】【力扣题】268. 丢失的数字

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;哈希。元素去重&#xff0c;依次判断是否在0-n内&#xff0c;没有则返回。 知识点&#xff1a;set(...)&#xff1a;转为集合&#xff0c;集合中的元素不重复。 class Solution:def mis…

Angular 使用教程——基本语法和双向数据绑定

Angular 是一个应用设计框架与开发平台&#xff0c;旨在创建高效而精致的单页面应用 Angular 是一个基于 TypeScript 构建的开发平台。它包括&#xff1a;一个基于组件的框架&#xff0c;用于构建可伸缩的 Web 应用&#xff0c;一组完美集成的库&#xff0c;涵盖各种功能&…

OpenCV图像坐标系

绘制代码: X轴 # 选取两个点 point1 = (20, 0) point2 = (200, 0)# 在图像上绘制连接线 cv2.line(img, point1, point2, (

2023.11.12使用flask对图片进行黑白处理(base64编码方式传输)

2023.11.12使用flask对图片进行黑白处理&#xff08;base64编码方式传输&#xff09; 由前端输入图片并预览&#xff0c;在后端处理图片后返回前端显示&#xff0c;可以作为图片处理的模板。 关键点在于对图片进行base64编码的转化。 使用Base64编码可以更方便地将图片数据嵌入…

java8 : Collectors.groupingBy(分组)

Collectors.groupingBy配合Stream流使用&#xff0c;可以对集合中一个或多个属性进行分组&#xff0c;分组后还可以做聚合运算。 首先把数据放入集合&#xff1a; Product prod1 new Product(1L, 1, new BigDecimal("15.5"), "面包", "零食");…

低代码与传统开发:综合比较

近年来&#xff0c;低代码开发作为软件开发的趋势获得了显着的发展势头。根据 MarketsandMarkets 的数据&#xff0c;低代码开发市场预计将实现 28.1% 的大幅增长率&#xff0c;到 2025 年价值将达到 455 亿美元。这一显着增长表明了各行业和企业对低代码平台的需求和采用不断增…

2023前端流行的新技术

作为2023年之前的技术水平有限&#xff0c;以下是一些目前为止较为热门的前端开发技术和趋势&#xff0c;这些技术可能在2023年之前进一步发展和普及。 前端程序员可以考虑学习和掌握以下技术&#xff1a; 1.Vue 3和React Hooks&#xff1a;Vue.js和React是目前最受欢迎的JavaS…

人工智能基础_机器学习027_L2正则化_岭回归_非稀疏性_原理解读_公式推导---人工智能工作笔记0067

然后我们再来看一下岭回归,也就是第二范数对吧, 他的公式,平方以后,加和然后开平方.L2的公式是 可以看到L2公式,也是有个阿尔法,惩罚项对吧. 可以看到因为L2带有平方,所以他的图形是个圆形 我们可以把L2范数,进行画出来看看 这里我们先看L2的公式,这里我们让 这个公式写成1 …

2023-11-14 mysql-主从复制-重置主从连接-记录

摘要: mysql的主从复制, 当从库执行binlog出错后, 会中止主从复制. 此时需要重置主从连接, 以重建主从关系. 主库操作: 一. 清理同步的数据库 drop database test;二. 重置主库状态 reset master;reset slave all;三. 检测主库状态 show master status;mysql> show master…

【已解决】vscode 配置C51和MDK环境配置

使用命令 gcc -v -E -x c - 看自己gcc 有没有安装好 也可以在自己的vscode中新建一个终端 gcc -v g -v 首先把自己的C51 和MDK 路径 设置好 vscode 中设置 C51 和 MDK 的路径 这是你keil 中写 51单片机和 STM32 的 如果你出现什么include 的什么波浪线&#xff0c;那估计…

2023亚太杯数学建模B题思路解析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料5 最后 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 2023年第十三…

基于FPGA的图像RGB转HLS实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1计算最大值和最小值 4.2计算亮度L 4.3计算饱和度S 4.4计算色调H 5.算法完整程序工程 1.算法运行效果图预览 将FPGA结果导入到MATLAB显示效果&#xff1a; 2.算法运行软件版本 Vivado…