做过嵌入式开发的工程师肯定都知道有这么个玩意儿 —— J-Trace,与我们日常使用的普通调试器不同点在于,它在基本的下载/调试代码之上还具有非常强大的代码运行跟踪能力,从而实现代码覆盖率的分析、指令回溯、CPU 资源监控等一系列强大的功能。有了它,绝大多数的 BUG 可以说是无所遁形,其什么时候出现的,怎么出现的,在完整的 trace 记录下一目了然,大大提高了解决问题的速度及体验!

然而,功能强归强,但我相信绝大多数工程师和我一样,还从来没有体验过 J-Trace 带来的便利!因为其强大的功能背后是感人的价格,有多感人?我们来看下官方定价:

图片

1980 欧元,按照当前汇率,就是 1.6 个 W:

图片

我们再看看万能的淘宝有没有漏网之鱼:

图片

确实存在价格更低的,但不多,且毕竟不是官方,是不是全新正品咱也不敢保证。那对于我们这些经费有限的工程师来说,是不是就永远没法体验到这种高端且强大的调试功能了呢?

NO! NO! NO! 前段时间我们的国产 RTOS RT-Thread 开发团队为我们带来了其最新的硬件产品 RT-Trace,为我们打开了国产高端调试工具的大门!当然有了 J-Trace 给我们带来的遗憾,首要任务肯定是看其价格,它的官方店铺定价如下:

图片

不可否认,这个价格比市面上绝大多数的调试器都要贵好多,但相比与 J-Trace,那简直是接近一折的差距!再看其功能,官方介绍如下:

  1. Trace 功能:

    • 基于 SWO 的 RT-Thread OS 跟踪 (Trace) 功能,无需额外安装软件,捕获线程关系。

    • 免安装的 Web UI ,直接在浏览器中实时显示线程间的调用关系。

    • 以高速 SWO Trace 为基础, 后续升级固件支持持久化线程运行记录,统计各线程用量与 CPU 随时间的工作负载。

    • 后续升级支持 TPIU Trace 接口,可以观察到更多内部信息。

  2. Monitor 功能:

    • 多通道数据实时采集与监控。

    • Web UI 中通过波形图与油表图生动呈现数据。

    • 支持自定义监控界面布局。

  3. 传统调试功能:

    • 支持 SWD/JTAG 调试,速率可达到 20Mhz。

    • 支持 VCP 串口透传,最高透传速率可达 10Mbps。

    • 支持内置 GDB-Server,支持基本GDB调试功能。

    • 支持 Flash 烧录,UI 操作方便高效。

  4. 辅助功能:

    • 板载显示屏,支持离线交互操作,并显示当前状态。

    • 板载大空间存储,支持自动化扩展,支持持久化 Data Log 记录。

    • 显示屏可选调试端口供电,支持JTAG接口引脚功能复用。

    • 板载以太网接口,支持远程操作。

    • 远程OTA升级维护固件。

看起来功能也挺丰富,当然这里也要说明一下,这里面有部分功能是还在开发当中,其固件也在持续更新,并且根据我与官方开发人员的沟通,后续还会拓展更多功能!

我也是有幸拿到官方提供的样机,必须要来试用一下。当然由于功能比较多,且目前有部分还在开发中,因此本文先对其基本的下载/调试以及核心的 Trace 功能进行测试。后续这个测试也会持续进行,并将所有相关文章收录至 RT-Trace 合集中。

测试正式开始,首先给 RT-Trace 连上电源和网线,并将其 JTAG/SWD 调试接口与开发板相连:

图片

可以看到屏幕正常点亮,且识别到与开发板的调试口电源为 3.3V,下方显示了 RT-Trace 的 IP 地址,我们可以通过这个地址打开 RT-Trace 的网页,我们的大部分操作目前也会通过这个网页来进行:

图片

可以看到当前版本的页面显示,主页很简洁直接,把主要功能都列举出来了,并且还配备了操作手册。左侧是功能板块,既然叫 RT-Trace,那必然要测其 Trace 功能,所以会涉及到 Trace Config(跟踪配置)及 Trace Viewer(跟踪分析面板)。当然在此之前先得把程序下进板子里,顺便把最基本的程序下载与调试功能测了。

这里测试代码使用的是 RT-Thread BSP 中的初始例程,芯片是 STM32F4,并且考虑到大家更多还是用 KEIL 进行开发,因此本次测试也会基于 KEIL 来进行。首先打开 KEIL 工程,配置其下载接口为 CMSIS-DAP Debugger:

图片

进入到 Settings 界面,可以看到下载器识别没有任何问题,并且由于官方称调试速率最高能达到 20M,我们就在这里设置为 KEIL 目前能支持的最高速率 10M:

图片

确认设置后发现 RT-Trace 的屏幕上也正确显示了我们刚才配置的调试参数:

图片

编译下载:

图片

没有任何问题,程序已经下载到开发板中并且 LED 也正常闪烁,我们设置断点看看调试功能:

图片

可以看到调试功能也是一切正常!最为一个下载器/调试器,RT-Trace 可以说初步过关了,但是,我们花这个钱可不仅仅是买一个普通的调试器,因此接下来的才是重头戏和核心功能 —— Trace !这里补充说明一下,Trace 功能需要额外接一个 SWO 引脚,否则只能进行正常的下载调试。

首先看下初始例程的运行逻辑:

int main(void)
{/* set LED0 pin mode to output */rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);while (1){rt_pin_write(LED0_PIN, PIN_HIGH);rt_thread_mdelay(500);rt_pin_write(LED0_PIN, PIN_LOW);rt_thread_mdelay(500);}
}

很简单,就是主函数中运行了一个 LED 闪烁,间隔 500ms,我们接下来就看看 RT-Trace 带给我们的跟踪体验到底是什么样的,我们能从中看到什么信息。

根据官方手册,使用 Trace 功能前先要配置一下。于是我们打开网页进入 Trace Config 页面先进行 Trace 功能的配置:

图片

依次按照图中的 1234 顺序进行点击,第二项和第三项无需我们自己填入,直接点自动探测即可。不过目前版本下我发现有概率会探测到的与实际不匹配,此时再点击一次即可,不行可以多点几次,相信官方后期会对其进行改善。最后点击提交配置后下方显示 OK 说明配置成功。此时我们点击左侧 Trace Viewer 进入跟踪页面:

图片

这里会打开一个新的页面,通过其左侧的 UI 可以看出,其能够通过开始录制进行实时分析,也能根据历史文件进行分析,我们由于第一次使用,就直接开始录制:

图片

此时会出现一个进度条,我推测应该是一次录制有时间上限,你可以等待其达到最大录制时间自己结束,也可以中途手动终止。我这边等其自行结束后发现左侧多了三个文件,并且文件名旁边有删除和下载按钮,也印证了 Trace 文件能够保存下来供后续再次分析:

图片

根据其命名可以看出,单个 Trace 文件的时长是 4 秒,这也不难理解,由于 Trace 功能会记录每一次中断、线程切换等信息,而我们的主频通常高达几十到上百兆,即便是 1 秒,其数据量也是非常庞大的,如果记录时间过长势必会造成浏览器的卡顿,因此通过这种时间片的切割来增强流畅度提高体验感是没毛病的。这里我们随意点一个文件进行查看:

图片

果然,RT-Trace 将每一次的中断以及这段时间内的线程切换情况都记录了下来,根据之前的代码,我们的初始例程就一个 main 线程以及默认都会存在的空闲线程 idle,线程的切换是基于 SysTick 以及 PendSV 中断,这里也都显示出来了!

通过拖拽时间轴最左侧与最右侧的定位块可以对跟踪周期进行缩放,从而看到短时间内的详细运行流程:

图片

当然这里要吐槽下目前版本这个很不明显,我找了好久才发现这里有两个竖条,一开始还以为暂时还没做缩放功能,推荐可以在鼠标滑倒时间轴区域的时候给个提示或者增强竖条的显示效果。缩放后如下:

图片

可以看到缩放到非常小区域的时候,我们就能看清 CPU 的全部运行流程了,试问如果你都能毫不遗漏地捕捉到 CPU 的全部运行轨迹,还怕定位不到 BUG ?这就是 Trace 的强大之处!

此外,通过鼠标在 Global Track Events 事件栏中的点击加拖动,还能测量指定区间的运行时间:

图片

这里我测的是两次 SysTick 中间的间隔,在时间轴上的体现为 999us758ns,而我们都知道默认的 SysTick 就是 1ms 一次中断,其测量精度也是非常高!这里也给官方提个建议,就是时间轴的缩放目前是用鼠标进行拖动,而我们要想看清 CPU 的运行轨迹就必须要拖得很小,这个操作是比较难控制的,希望能加入鼠标滚轮缩放的功能,就完美了!

总体而言,第一次使用 Trace 的我还是被震惊到了,从前我们调试程序要么就是打断点,这无疑会打断程序的正常运行,在一些特殊场景如电机控制,这种调试方法不仅存在无法找到问题的可能,还有很大概率会炸机;还有一种就是 print 大法,但这种方式一旦你的输出频率过高,满屏的文字会让你很难抓到重点信息,而如果频率设置的太低又可能无法获取到足够的有效数据来分析。并且无论上面哪种方式,都是会对程序的运行造成影响,而 Trace 无需中断程序运行,也无需加入任何调试代码,通过芯片自身的硬件追踪单元实现指令级的运行数据捕捉与呈现。至此,相信无需再有更多的描述,一个嵌入式工程师也应该能体会到其对于日常调试的帮助有多大!

以上就是本次测试的全部内容,但这也仅仅是这个系列的开端,后续随着 RT-Trace 的不断优化与迭代,我也会跟进并分享更多的使用方法与技巧。诚然现在的 RT-Trace 还有很多功能需要完善,但这也意味着其未来具有无限的可能性。可能目前来看,标题的国产嵌入式调试器之光对于很多人来说有点夸大了,但说其是星星之火完全不足为过,也期望与 RT-Trace 共同成长,见证其燎原之光,能最终驱散每一个嵌入式工程师调试中的迷茫!

国产嵌入式调试器之光? RT-Trace 初体验!

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

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

相关文章

SLAM中的非线性优化-2D图优化之零空间实战(十六)

终于有时间更新实战篇了,本节实战几乎包含了SLAM后端的所有技巧,其中包括:舒尔补/先验Factor/鲁棒核函数/FEJ/BA优化等滑动窗口法的相关技巧,其中构建2D轮式里程计预积分以及绝对位姿观测的10帧滑动窗口,并边缘化最老帧…

知识随记-----Qt 实战教程:使用 QNetworkAccessManager 发送 HTTP POST

文章目录Qt 网络编程:使用 QNetworkAccessManager 实现 HTTP POST 请求概要整体架构流程技术名词解释技术细节注意事项:Qt 网络编程:使用 QNetworkAccessManager 实现 HTTP POST 请求 概要 本文介绍如何使用 Qt 框架的网络模块(…

wordpress批量新建产品分类

1、下载安装插件:bulk-category-import-export2、激活插件后,左侧点击插件下的导入,选择product categories,点击下一步3、这里可以选择导入的分类列表文件,可以选择分隔符,CSV文件默认为‘,’要…

CentOS 镜像源配置与 EOL 后的应对策略

引言 本文将详细介绍如何使用 阿里云开源镜像站 配置 CentOS 的各类软件源,包括基础源、历史归档源(vault)、ARM 架构源、Stream 版本以及调试信息源(debuginfo),并重点讲解在 CentOS 8 停止维护后&#x…

CTF实战:用Sqlmap破解表单输入型SQL注入题(输入账号密码/usernamepassword)

目录 引言 步骤1:用Burp Suite捕获表单请求 步骤2:用Sqlmap获取数据库名称 参数解释: 输出示例(根据题目环境调整): 步骤3:获取目标数据库中的表名 参数解释: 输出示例&#…

质数时间(二分查找)

题目描述如果把一年之中的某个时间写作 a 月 b 日 c 时 d 分 e 秒的形式,当这五个数都为质数时,我们把这样的时间叫做质数时间,现已知起始时刻是 2022 年的 a 月 b 日 c 时 d 分 e 秒,终止时刻是 2022 年的 u 月 v 日 w 时 x 分 y…

Python训练Day29

浙大疏锦行 类的装饰器装饰器思想的进一步理解:外部修改、动态类方法的定义:内部定义和外部定义

新手DBA实战指南:如何使用gh-ost实现MySQL无锁表结构变更

新手DBA实战指南:如何使用gh-ost实现MySQL无锁表结构变更 作为DBA,大表结构变更(DDL)一直是令人头疼的问题。传统的ALTER TABLE操作会锁表,严重影响业务连续性;而常见的pt-online-schema-change工具虽然能实现在线变更,但依赖触发器机制,在高并发场景下性能表现不佳。本…

OSPF综合

一、实验拓扑二、实验需求1、R4为ISP,其上只配置IP地址;R4与其他所直连设备间均使用公有IP; 2、R3-R5、R6、R7为MGRE环境,R3为中心站点; 3、整个OSPF环境IP基于172.16.0.0/16划分;除了R12有两个环回&#x…

技术面试知识点详解 - 从电路到编程的全栈面经

技术面试知识点详解 - 从电路到编程的全栈面经 目录 模拟电路基础数字电路原理电源设计相关编程语言基础数据库与并发网络协议基础算法与数据结构 模拟电路基础 1. 放大电路类型判断 这是模拟电路面试的经典题目,通过电压放大倍数判断放大电路类型: …

LangGraph认知篇-Command函数

Command简述 在 LangGraph 中,Command 是一个极具实用性的功能,它能够将控制流(边)和状态更新(节点)巧妙地结合起来。这意味着开发者可以在同一个节点中,既执行状态更新操作,又决定下…

【目标检测】小样本度量学习

小样本度量学习(Few-Shot Metric Learning)通常用于分类任务​(如图像分类),但它也可以与目标检测(Object Detection)结合,解决小样本目标检测(Few-Shot Object Detectio…

cmd怎么取消关机命令

在 Windows 的命令提示符(CMD)中取消已计划的关机操作,可以通过 shutdown 命令的 ​**-a**​ 参数实现。以下是具体步骤:​操作方法​​打开 CMD​按下 Win R 组合键,输入 cmd 并回车,打开命令提示符窗口。…

网易云音乐硬刚腾讯系!起诉SM娱乐滥用市场支配地位

企查查APP显示,近日,法院公开杭州乐读科技有限公司、杭州网易云音乐科技有限公司起诉SM ENTERTAINMENT CO. 、卡斯梦(上海)文化传播有限公司等开庭信息,案由涉及滥用市场支配地位纠纷。公告显示,该案件计划…

[css]切角

使用css实现一个切角的功能&#xff0c;有以下几种方案&#xff1a; <div class"box"></div>方案一&#xff1a;linear-gradient linear-gradient配合backgroud-image可以实现背景渐变的效果。linear-gradient的渐变过渡区的占比是总的空间&#xff08;高…

分享一个可以测试离线服务器性能的脚本

在日常运维工作中&#xff0c;经常会遇到系统性能莫名跟不上业务需求的情况&#xff1a;服务器响应变慢、应用加载卡顿、资源占用异常飙升等问题频繁出现&#xff0c;却难以快速问题根源究竟在CPU过载、内存泄漏、磁盘I/O阻塞还是网络带宽瓶颈。这种时候&#xff0c;特别需要一…

Python Pandas.unique函数解析与实战教程

Python Pandas.unique 函数解析与实战教程 摘要 本文章旨在全面地解析 pandas 库中的 unique 函数。pandas.unique 是一个用于从一维数组型(array-like)对象中提取唯一值的高效工具。我们将从其核心功能、函数签名、参数详解、返回值类型,到关键行为特性(如顺序保留、缺失…

排序算法入门:直接插入排序详解

这里写目录标题介绍原理代码实现分析介绍 直接插入排序是一种简单直观的排序算法&#xff0c;适用于小规模数据或基本有序的数据集。其核心思想是构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。 原理 我们…

ClickHouse MergeTree引擎:从核心架构到三级索引实战

摘要 MergeTree是ClickHouse最核心的存储引擎&#xff0c;采用列式存储LSM-Tree架构设计&#xff0c;支持高效的数据写入、合并和查询。本文将全面解析MergeTree引擎的基础概念、数据流、核心架构、索引系统以及常见问题。 基础篇&#xff1a; 一、MergeTree引擎基础概念 1. 定…

电脑手机热点方式通信(上)

电脑连接手机热点时的无线链路情况&#xff1a; 电脑上网时&#xff08;从服务器下载数据&#xff0c;或者上传指令、数据&#xff09;&#xff0c;首先电脑与手机之间基于WiFi协议在2.4G频段或者5G频段通信&#xff0c;然后手机与基站之间再基于4G LTE或者5G NR协议在2412MHz…