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 block
		
    CSSYS_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 protocol

    SWO_CODR = 0x00000015;   // 5 MHz
		
    ITM_TCR  = ITM_TCR_BUS_ID | ITM_TCR_ENABLE_DWT | ITM_TCR_ENABLE_ITM; //0x0001040A
    ITM_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 jlink

transport 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 little

adapter speed 1000

swd newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x01 -irmask 0x0f -enable

dap 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 enable

itm 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python生成随机数插件Faker的用法

目录 引言 一、Faker库的安装 二、Faker库的基本用法 1、导入Faker类 2、创建Faker对象 3、使用Faker对象生成随机数据 三、Faker库的高级用法 1、自定义数据生成规则 2、使用子模块进行特定领域的数据生成 3、与其他库结合使用 四、Faker库的应用场景 1、单元测试…

虚拟化加密磁盘密钥设置方案浅析 — TKS1

虚拟化加密磁盘密钥设置方案浅析 前言密钥设置方案密钥管理服务-KMS密钥设置方案-TKS1 两级加密设计弱熵密码派生密钥切分存储 前言 虚拟化组件可以使用多种加密算法对虚拟机磁盘的原始内容进行加解密&#xff0c;比如AES、RSA、SM2/SM3/SM4等&#xff0c;用户写入的数据经过加…

医院安全(不良)事件管理系统源码 不良事件报告全套源码

不良事件管理系统是一种专为企业或组织设计的软件工具&#xff0c;用于跟踪、记录和管理不良事件。该系统可以有效地整合不良事件的收集、分类、分析和报告&#xff0c;帮助企业及时识别和处理不良事件&#xff0c;从而降低风险和损失。通过实时监控和自动化报告&#xff0c;该…

富文本组件vue-quill-editor使用

版本&#xff1a;"vue-quill-editor": "^3.0.6", 1.全局引入 import VueQuillEditor from vue-quill-editor import quill/dist/quill.core.css import quill/dist/quill.snow.css import quill/dist/quill.bubble.cssVue.use(VueQuillEditor) 2.使用&am…

轻量封装WebGPU渲染系统示例<30>- 绘制线段(源码)

原理说明&#xff1a; WebGPU提供了绘制基本线条非机制&#xff0c;只要render pipeline primitive对应的 topology属性指定为line-list或者line-strip即可绘制对应的线条。 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxg…

移远EC600U-CN开发板 11.14

控件探索-仪表&#xff08;lv.meter&#xff09; 1. 显示一个简单的仪表盘 def set_value(indic, v):meter.set_indicator_value(indic, v)# # A simple meter # meter lv.meter(scr) meter.center() meter.set_size(200, 200)# Add a scale first scale meter.add_scale()…

电机应用-编码器

目录 编码器 增量式编码器 绝对式编码器 混合式绝对式编码器 旋转编码器原理 增量式编码器原理 绝对式编码器原理 编码器基本参数 分辨率 精度 最大响应频率 信号输出形式 编码器 用来测量机械旋转或位移的传感器&#xff0c;能够测量机械部件在旋转或直线运动时的…

Ubuntu 24.04发布日期以定

导读Ubuntu 的下一个长期支持 (LTS) 版本 Ubuntu 24.04 的最终发布日期已确定&#xff0c;计划于 2024 年 4 月 25 日发布。 Ubuntu 的下一个长期支持 (LTS) 版本 Ubuntu 24.04 的最终发布日期已确定&#xff0c;计划于 2024 年 4 月 25 日发布。 除此之外&#xff0c;Ubuntu…

听我的,日志还是得好好打!

大家好&#xff0c;我是老三&#xff0c;不知道大家有没有经历过这样的场景&#xff0c;线上出了问题&#xff0c;着急火燎地去排查&#xff1a; 唉&#xff0c;问题可能出在这个地方&#xff0c;捞个日志看下&#xff0c;卧槽&#xff0c;怎么找不到……哪个**不打日志&#…

Mac M2/M3 芯片环境配置以及常用软件安装-前端

最近换了台新 Mac&#xff0c;所有的配置和软件就重新安装下&#xff0c;顺便写个文章。 一、环境配置 1. 安装 Homebrew 安装 Homebrew【Mac 安装 Homebrew】 通过国内镜像安装会比较快 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Ho…

如何定制开发软件 App?|小程序网站搭建

如何定制开发软件 App&#xff1f;|小程序网站搭建 随着移动互联网的快速发展&#xff0c;定制开发软件 App 成为了许多企业和个人的需求。无论是为了满足特定业务需求&#xff0c;还是为了提升用户体验&#xff0c;定制开发软件 App 都可以帮助我们实现目标。下面&#xff0c;…

管理类联考——数学——汇总篇——知识点突破——代数——函数、方程——记忆——一元二次函数

——一元二次函数——【图像→交点】 ——【 a x 2 b x c y ax^2bxcy ax2bxcy二次函数核心在于“图像”&#xff1a;整体可以由&#xff1a; 图像&#xff08;形状&#xff0c;上下&#xff0c;交点&#xff09; ⟹ \Longrightarrow ⟹ △ △ △ ⟹ \Longrightarrow ⟹ 抛…

知识蒸馏学习

这里写目录标题 1. 知识蒸馏学习2. 参考链接 1. 知识蒸馏学习 知识蒸馏把一个大的东西变成一个小的东西&#xff0c;纯的东西&#xff0c;一个大的教师神经网络交给了小的学生神经网络。 把大的模型压缩到小的模型上。 2. 参考链接 知识蒸馏算法和代码&a…

npm封装插件打包上传后图片资源错误

问题&#xff1a; npm封装插件&#xff1a;封装的组件页面涉及使用图片资源&#xff0c;在封装的项目里调用图片显示正常&#xff1b;但是打包上传后&#xff0c;其他项目引入使用报错找不到图片资源&#xff1b;图片路径也不对 获取图片的base64方法 解决方案&#xff1a; 将…

Java面试题(每天10题)-------连载(30)

目录 多线程篇 1、可以运行时kill掉一个线程吗&#xff1f; 2、关于synchronized 3、分布式锁&#xff0c;程序数据库中死锁机制及解决方案 4、spring单例为什么没有安全问题&#xff08;ThreadLocal&#xff09; 5、线程池原理 6、Java锁多个对象 7、Java线程如何启动 …

Jenkins中强制停止停不下来的job

# Script console 执行脚本 Jenkins 的提供了 script console 的功能&#xff0c;允许你写一些脚本&#xff0c;来调度 Jenkins 执行一些任务。 我们就可以利用 script console 来强制停止 job 执行。 首先进入 Jenkins 的 script console 页面&#xff1a; script console 路…

Python武器库开发-flask篇之flask框架的安装(二十一)

Flask介绍 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架&#xff0c;对于Werkzeug本质是Socket服务端&#xff0c;其用于接收http请求并对请求进行预处理&#xff0c;然后触发Flask框架&#xff0c;开发人员基于Flask框架提供的功能对请求进…

Pyecharts数据可视化综合应用PyEcharts概述在线闯关_头歌实践教学平台

PyEcharts概述 第1关 快速上手任务描述相关知识导入图表类型添加数据设置图表样式输出图表链式调用编程要求测试说明代码 第1关 快速上手 任务描述 本关任务&#xff1a;快速上手使用pyEcharts进行绘图。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1. p…

什么是稳定扩散中的采样步骤?

在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D数字孪生场景编辑器 本指南将深入探讨采样步骤的基础知识、它们对图像生成的影响&#xff0c;以及优化这些步骤以获得最佳结果的技巧。 了解稳定扩散中…