RTT打印时间戳

官方的RTT VIEWER没有打印接收时间戳的功能,经过查找后发现可以有以下三种打印时间戳的方法。

  • 第三方的RTT上位机
  • ExtraPutty
  • 自己打印

第三方的RTT上位机

码云上有一个RTT_T2的仓库,基于python qt包写的画面,通过pylink来jlink通信。

  • 优点:可以打印时间戳
  • 缺点:基于Python,RTT的实现性大打折扣,无法打印us级别的时间,有点”卡“,需要安装很多的py包,占用内存。

ExtraPutty

rtt的数据可以通过telnet传输到其他软件进行显示,RTT VIEWER启动连接好STM后,默认就已经启动telent服务,可以在ExtraPutty里面选择telnet,IP填localhost, Port填19021,进入后,再在设置里面开启时间戳显示就可以了在这里插入图片描述
不想打开RTT VIEWER的话,可以在终端里面使用命令行启动telnet服务,修改stm的对应型号就行

JLink.exe -Device STM32F407ZE -if SWD -Speed 9600 -autoconnect 1

优点:Putty可以修改风格
缺点:telnet中转后,有ms级别的延时,打印时间戳不准确

自定义打印

在RTT打印的时间,在前面加上时间就行,可以做到us级别准确显示
在这里插入图片描述
优点:准确!
缺点:需要RTT传输额外字符
附上RTT打印的宏定义

#ifndef LOG_H
#define LOG_H
#include "SEGGER_RTT.h"
#if defined(USE_HAL_DRIVER)
extern uint32_t HAL_GetTick(void);
extern uint32_t HAL_GetUs(void);#define SYS_MS HAL_GetTick()#define SYS_US HAL_GetUs()
#else#define SYS_MS 0  // 如果不是使用HAL库 则使用自定义的时间源#define SYS_US 0
#endif#define USE_LOG_DEBUG   1
#define PRINT_TIMESTAMP 1typedef enum {LOG_TERMINAL0,LOG_TERMINAL1,LOG_TERMINAL2,LOG_TERMINAL3,LOG_TERMINAL4,LOG_TERMINAL5,
} LogTerminal_e;typedef enum {LOG_ARR_BYTE1,LOG_ARR_BYTE2,LOG_ARR_BYTE4,LOG_ARR_FLOAT,LOG_ARR_INT,
} LogArrayType_e;#if USE_LOG_DEBUG#if PRINT_TIMESTAMP#define LOG_PROTO(type, color, format, ...)                                                                                        \SEGGER_RTT_printf(0, "[%02d:%03d:%03d] %s%s" format "%s\r\n", (SYS_MS / 1000) % 60, SYS_MS % 1000, SYS_US % 1000, color, type, \##__VA_ARGS__, RTT_CTRL_RESET);// #define LOG_PROTO(type, color, format, ...)                                                                                                \//     SEGGER_RTT_printf(0, "[%02d:%02d:%02d:%03d:%03d] %s%s" format "%s\r\n", (SYS_MS / (60 * 60 * 1000)) % 24, (SYS_MS / (60 * 1000)) % 60, \//                       (SYS_MS / 1000) % 60, SYS_MS % 1000, SYS_US % 1000, color, type, ##__VA_ARGS__, RTT_CTRL_RESET);#else#define LOG_PROTO(type, color, format, ...) SEGGER_RTT_printf(0, "%s%s" format "%s\r\n", color, type, ##__VA_ARGS__, RTT_CTRL_RESET);#endif#define LOG_INFO(format, ...)  LOG_PROTO("[INFO]:", "", format, ##__VA_ARGS__)                           // 无颜色日志输出#define LOG_DEBUG(format, ...) LOG_PROTO("[DEBUG]:", RTT_CTRL_TEXT_BRIGHT_GREEN, format, ##__VA_ARGS__)  // 绿色日志输出#define LOG_WARN(format, ...)  LOG_PROTO("[WARN]:", RTT_CTRL_TEXT_BRIGHT_YELLOW, format, ##__VA_ARGS__)  // 黄色日志输出#define LOG_ERROR(format, ...) LOG_PROTO("[ERROR]:", RTT_CTRL_TEXT_BRIGHT_RED, format, ##__VA_ARGS__)    // 红色日志输出#define LOG_CLEAR()            SEGGER_RTT_WriteString(0, "\r\n" RTT_CTRL_CLEAR)                          // 清屏// 打印数组#define LOG_ARRAY(pArr, len, logArrayType, terminal)                        \do {                                                                    \SEGGER_RTT_SetTerminal(terminal);                                   \for (int i = 0; i < len; i++) {                                     \switch (logArrayType) {                                         \case LOG_ARR_BYTE1:                                         \SEGGER_RTT_printf(0, "%02x ", *(uint8_t *)(pArr + i));  \break;                                                  \case LOG_ARR_BYTE2:                                         \SEGGER_RTT_printf(0, "%04x ", *(uint16_t *)(pArr + i)); \break;                                                  \case LOG_ARR_BYTE4:                                         \SEGGER_RTT_printf(0, "%08x ", *(uint32_t *)(pArr + i)); \break;                                                  \case LOG_ARR_FLOAT:                                         \SEGGER_RTT_printf(0, "%f ", *(float *)(pArr + i));      \break;                                                  \case LOG_ARR_INT:                                           \SEGGER_RTT_printf(0, "%d ", *(int *)(pArr + i));        \break;                                                  \default:                                                    \break;                                                  \}                                                               \}                                                                   \SEGGER_RTT_printf(0, "\r\n");                                       \SEGGER_RTT_SetTerminal(0);                                          \} while (0)// 初始化#define LOG_INIT()               \do {                         \SEGGER_RTT_Init();       \LOG_CLEAR();             \LOG_INFO("RTT Inited!"); \} while (0)#else#define LOG_INFO(format, ...)#define LOG_DEBUG(format, ...)#define LOG_WARN(format, ...)#define LOG_ERROR(format, ...)#define LOG_CLEAR()#define LOG_ARRAY(pArr, len, logArrayType, terminal)#define LOG_INIT()
#endif#endif

us计算为如下

__weak uint32_t HAL_GetUs() {uint32_t tms = SysTick->LOAD + 1;return (tms - SysTick->VAL) * 1000 / tms;
}

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

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

相关文章

Journal of King Saud University - Computer and Information Sciences投稿经验

期刊标签&#xff1a; 中科院二区 JCR Q1 影响因子&#xff1a;6.9 双盲审 个人认为还是很不错的期刊 开源期刊1350美元版面费 投稿经验 一共三个审稿人&#xff0c;一个建议小修后录取&#xff08;list文章的贡献&#xff0c;添加一篇文章的引用&#xff09;&#xff0c; 另…

conda创建、查看、删除虚拟环境

在现代的Python开发中&#xff0c;使用虚拟环境已经成为了一种标准的做法。它可以帮助我们隔离不同的项目&#xff0c;使得每个项目都有自己独立的Python环境和依赖&#xff0c;从而避免各种依赖冲突。Conda是一个流行的包管理器和环境管理器&#xff0c;它可以帮助我们轻松地创…

Java八股文面试全套真题【含答案】-SQL优化篇

以下是关于Java八股文面试全套真题-SQL优化篇 你SQL优化这块有哪些技巧和方法&#xff0c;谈一谈&#xff1f; 以下是一些常用的SQL优化技巧&#xff1a; 使用索引&#xff1a;索引是提高SQL查询性能的最常见和有效的方法之一。通过创建适当的索引&#xff0c;可以加快查询的…

Nginx 负载均衡集群 节点健康检查

前言 正常情况下&#xff0c;nginx 做反向代理负载均衡的话&#xff0c;如果后端节点服务器宕掉的话&#xff0c;nginx 默认是不能把这台服务器踢出 upstream 负载集群的&#xff0c;所以还会有请求转发到后端的这台服务器上面&#xff0c;这样势必造成网站访问故障 注&#x…

Linux GDB 调试

文章目录 一、Qemu二、Gdbvscode 调试 三、RootFs 一、Qemu qemu 虚拟机 Linux内核学习 Linux 内核调试 一&#xff1a;概述 Linux 内核调试 二&#xff1a;ubuntu20.04安装qemu Linux 内核调试 三&#xff1a;《QEMU ARM guest support》翻译 Linux 内核调试 四&#xff1a;…

基于SSM框架和Layui框架的管理系统

计算机毕业设计&#xff1a;打造安全、高效的信息管理系统在这个数字化时代&#xff0c;信息安全和高效管理是至关重要的。为了帮助学校或机构更好地管理和保护信息&#xff0c;我们为您设计了一套功能强大的信息管理系统。该系统利用先进的技术&#xff0c;结合MD5加密&#x…

使用Go语言的HTTP客户端进行并发请求

Go语言是一种高性能、简洁的编程语言&#xff0c;它非常适合用于构建并发密集型的网络应用。在Go中&#xff0c;标准库提供了强大的HTTP客户端和服务器功能&#xff0c;使得并发HTTP请求变得简单而高效。 首先&#xff0c;让我们了解为什么需要并发HTTP请求。在许多应用场景中…

【Nacos专题】Nacos如何建立与应用服务之间的通信渠道?

作为Spring Cloud Alibaba微服务架构实战派上下册和RocketMQ消息中间件实战派上下册的作者胡弦。 Nacos是一款面向云原生服务的注册中心和配置中心技术解决方案&#xff0c;既然要与服务打交道&#xff0c;那么通信渠道是必不可少的组件&#xff0c;那么Nacos是如何建立与应用…

【后端已完成,前端更新ing】uniapp+springboot实现个人备忘录系统【前后端分离】

目录 &#xff08;1&#xff09;项目可行性分析 &#xff08;一&#xff09;技术可行性&#xff1a; &#xff08;二&#xff09;经济可行性&#xff1a; &#xff08;三&#xff09;社会可行性&#xff1a; &#xff08;2&#xff09;需求描述 功能模块图 用例图&#…

Xcode15在iOS12系统上崩溃的原因

1.1.崩溃在_dyld_start&#xff0c;如图&#xff1a; 崩溃截图 解决办法&#xff1a;在other link flags添加-ld64 注意&#xff1a;该办法只能解决运行真机&#xff0c;archive出来的包依然报错闪退...... 1.2 SwiftUI导致iOS12及以下系统闪退问题 SwiftUI是iOS13开始使用&…

(NeRF学习)NeRF复现 win11

目录 一、获取源码二、环境三、准备数据集1.下载数据集方法一&#xff1a;官方命令方法二&#xff1a;官网下载数据集 2.修改配置 四、开始训练1.更改迭代次数2.开始训练方法一&#xff1a;方法二&#xff1a; 3.使用预训练模型 五、NeRF源码学习 一、获取源码 git clone http…

Blazor 问题记录

1&#xff09;使用Ant 样式。结果弹窗提示怎么都出不来。 只要在App.razor 加最后一句即可 <Router AppAssembly"typeof(App).Assembly"><Found Context"routeData"><RouteView RouteData"routeData" DefaultLayout"typeof…

C#之反编译之路(一)

本文将介绍微软反编译神器dnSpy的使用方法 c#反编译之路(一) dnSpy.exe区分64位和32位,所以32位的程序,就用32位的反编译工具打开,64位的程序,就用64位的反编译工具打开(个人觉得32位的程序偏多,如果不知道是32位还是64位,就先用32位的打开试试) 目前只接触到wpf和winform的桌…

什么是负载均衡?什么情况下又会用到负载均衡

什么是负载均衡 在大型的网络应用中&#xff0c;使用多台服务器提供同一个服务是常有的事。平均分配每台服务器上的压力、将压力分散的方法就叫做负载均衡。 [利用 DNS来实现服务器流量的负载均衡&#xff0c;原理是“给网站访问者随机分配不同ip”] 什么情况下会用到负载均…

芯课堂 | LVGL基础知识(三)

概述 LVGL进度条对象上有一个背景和一个指示器。指示器的宽度根据进度条的当前值进行设置。 如果对象的宽度小于其高度&#xff0c;则可以创建垂直进度条。 不仅可以设置进度条的结束值&#xff0c;还可以设置进度条的起始值&#xff0c;从而改变指示器的起始位置。 LVGL进度…

使用EasyExcel导出百万条数据

使用EasyExcel导出百万条数据 应用是基于100W条数据进行的测试 首先&#xff1a;导入相关需要的依赖&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.16</version></depend…

jquery获取子元素的一些方法

jquery获取子元素的一些方法 1.通过id,class等选择器 2.通过父元素进行find查找 3.通过父元素的children进行查找 注意:find和children的区别,代码已给出详细解释,想要真正理解,还是得靠代码.光看不练那都是纸上谈兵 <!DOCTYPE html> <html><head><m…

springboot系列——IDEA创建项目并运行

springboot Spring Boot是为了简化Spring应用程序的开发和部署而产生的。 Spring Boot提供了一种基于约定优于配置的开发模式。它自动配置了Spring应用程序所需的各种组件和依赖&#xff0c;并提供了简单易用的命令行工具来构建和运行应用程序。 Spring Boot还提供了一套开箱…

Existing installation is up to date

这个报错是之前安装的docker没有删除干净 解决方法&#xff1a; 打开注册表编辑器 然后再搜索栏&#xff1a;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Docker Desktop 回车 找到Docker Desktop文件夹后&#xff0c;右键删除 重新安装Docker…

Security的入门和流程分析

Security的入门和流程分析 问题&#xff1a;访问一个controller方法之前进行一个权限验证&#xff1f; 在controller里面的每一个handler无论什么访问都要进行一个校验&#xff0c;但是对于login logout 验证码这种Handler处理器是放行的 1.使用过滤器拦截器 注意两者区别 过滤…