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

news2024/12/27 13:38:56

        最近公司准备启动一个新的项目,使用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

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

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

相关文章

Centos7.9用rancher来快速部署K8S

什么是 Rancher&#xff1f; Rancher 是一个 Kubernetes 管理工具&#xff0c;让你能在任何地方和任何提供商上部署和运行集群。 Rancher 可以创建来自 Kubernetes 托管服务提供商的集群&#xff0c;创建节点并安装 Kubernetes&#xff0c;或者导入在任何地方运行的现有 Kube…

微服务系列-使用 RestTemplate 的 Spring Boot 微服务通信示例

公众号「架构成长指南」&#xff0c;专注于生产实践、云原生、分布式系统、大数据技术分享。 概述 下面我们将学习如何创建多个 Spring boot 微服务以及如何使用 RestTemplate 类在多个微服务之间进行同步通信。 微服务通信有两种风格&#xff1a; 同步通讯异步通信 同步通…

CTFhub-RCE-远程包含

给咱一个phpinfo那么必然有他的道理 PHP的配置选项allow_url_include为ON的话&#xff0c;则include/require函数可以加载远程文件&#xff0c;这种漏洞被称为"远程文件包含漏洞(Remote File Inclusion RFI)"。 allow_url_fopen On 是否允许打开远程文件 allow_u…

基于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…

深入理解 Spring Boot 内置工具类:ReflectionUtils

文章目录 1. 什么是反射&#xff1f;2. 使用 ReflectionUtils2.1 获取类的所有字段2.2 调用方法2.3 访问字段 3. 源码分析3.1 doWithFields3.2 findMethod3.3 invokeMethod 4. 拓展与分析4.1 拓展4.2 性能考虑4.3 Java 9 模块化 5. 总结 &#x1f389;欢迎来到架构设计专栏~深入…

STM32 I2C详解

STM32 I2C详解 I2C简介 I2C&#xff08;Inter IC Bus&#xff09;是由Philips公司开发的一种通用数据总线 两根通信线&#xff1a; SCL&#xff08;Serial Clock&#xff09;串行时钟线&#xff0c;使用同步的时序&#xff0c;降低对硬件的依赖&#xff0c;同时同步的时序稳定…

振南技术干货集:深入浅出的Bootloader(3)

注解目录 1、烧录方式的更新迭代 1.1 古老的烧录方式 (怀旧一下&#xff0c;单片机高压烧录器。) 1.2 ISP 与ICP 烧录方式 (还记得当年我们玩过的 AT89S51?) 1.3 更方便的 ISP 烧录方式 1.3.1串口 ISP &#xff08;是 STC 单片机成就了我们&#xff0c;还是我们成就了…

迅软DSE答疑专业解析:内网遭受攻击的威胁到底有多大

当今数字化时代&#xff0c;企业数据安全已演变为企业生存和发展的至关重要因素。随着信息技术的迅猛发展&#xff0c;企业内网不仅是承载核心数据和信息的关键平台&#xff0c;也成为黑客和恶意软件攻击的主要目标。因此&#xff0c;确保企业数据安全和内网安全已成为企业管理…

2024上海国际智能驾驶技术展览会(自动驾驶展)

2024上海国际智能驾驶技术展览会 2024 Shanghai International Autonomous driving Expo 时间&#xff1a;2024年3月26-28日 地点&#xff1a;上海跨国采购会展中心 随着科技的飞速发展&#xff0c;智能驾驶已经成为了汽车行业的重要趋势。在这个时代背景下&#xff0c;汽车不…

element ui的日期选择器动态设定年份,并默认显示在该年份范围的日期时间

选中某个年份,让日期选择器只能选择该年份内的时间&#xff0c;并且默认显示该年份的时间&#xff08;由于日期选择器默认显示为当前时间&#xff0c;所以需要跳转到选择的年份&#xff09; 例&#xff1a;年份选择了2022年&#xff0c;那么日期选择也相应显示到2022年&#xf…

160. 相交链表-哈希表法O(n)时间复杂度

160. 相交链表-o&#xff08;n&#xff09;时间复杂度 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个…

CPU vs GPU:谁更适合进行图像处理?

CPU 和 GPU 到底谁更适合进行图像处理呢&#xff1f;相信很多人在日常生活中都会接触到图像处理&#xff0c;比如修图、视频编辑等。那么&#xff0c;让我们一起来看看&#xff0c;在这方面&#xff0c;CPU 和 GPU 到底有什么不同&#xff0c;哪个更胜一筹呢&#xff1f; 一、C…

揭密,这个微信群机器人的所有秘密在这里

技术长久不用就废了&#xff0c;我想把软件开发技术重新捡拾起来。 咱们“一起学英语”群已有三年时光&#xff0c;群里很多朋友互帮互助走到了今天。可是&#xff0c;即使再好玩的英语话题&#xff0c;也有谈腻的时候。 群里是不是应该引入一点好玩的东西&#xff1f; 人工智能…

【DP】背包问题全解

一.简介 DP&#xff08;动态规划&#xff09;背包问题是一个经典的组合优化问题&#xff0c;通常用来解决资源分配的问题&#xff0c;如货物装载、投资组合优化等。问题的核心思想是在有限的资源约束下&#xff0c;选择一组物品以最大化某种价值指标&#xff0c;通常是总价值或…

Ulimit -系统资源配额配置说明

Linux 对于每个用户&#xff0c;系统限制其最大进程数&#xff0c;为提高性能&#xff0c;可以根据设备资源情况&#xff0c; 设置个Linux用户的最大进程数&#xff0c;一些需要设置为无限制&#xff1b; ulimit 参数说明 选项 含义 例子 -H 设置硬资源限制&#xff0c;一旦…

【C++初阶(六)】类和对象(中)与日期类的实现

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…

【C++】——运算符重载

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

第二证券:今日投资前瞻:可控核聚变进展加速 光模块产业趋势加强

昨日&#xff0c;两市股指全线高开&#xff0c;盘中窄幅轰动&#xff0c;尾盘三大股指全线翻红。到收盘&#xff0c;沪指涨0.25%报3046.53点&#xff0c;深成指涨0.1%报9988.83点&#xff0c;创业板指涨0.2%报2009.21点&#xff0c;北证50指数涨近1%。两市估计成交8686亿元&…

个体诊所电子处方系统设计,诊所电子处方模板,药店电子处方系统,佳易王电子处方管理系统V16.0下载

个体诊所电子处方系统设计&#xff0c;诊所电子处方模板&#xff0c;药店电子处方系统&#xff0c;佳易王电子处方管理系统V16.0下载 软件支持配方模板&#xff0c;病人病历记录查询等&#xff0c;软件打印处方单所用的纸张为 A5纸。软件可以下载试用&#xff0c;点击最下方官网…

高效攻略各类BOSS,成为真正的剑侠!

逆水寒作为一款备受瞩目的国产武侠游戏&#xff0c;其精美的画面和真实的剑术体验吸引了众多玩家。在这篇实用干货分享中&#xff0c;我们将详细介绍一些攻略各类BOSS的技巧和策略&#xff0c;帮助你在游戏中轻松击败强大的对手&#xff0c;成为真正的剑侠大师。 首先&#xff…