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.hqwc.cn/news/327342.html

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

相关文章

WEB 3D技术 three.js 顶点旋转

我们来说说几何体顶点的旋转 官网搜索 BufferGeometry 这里 我们有 x y z 三个轴的旋转 例如 我们这样的代码 import ./style.css import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"; i…

WPF 使用矢量字体图标

矢量字体图标 在WPF项目中经常需要显示图标&#xff0c;但是项目改动后&#xff0c;有时候需要替换和修改图标&#xff0c;这样非常麻烦且消耗开发和美工的时间。为了快速开发项目&#xff0c;节省项目时间&#xff0c;使用图标矢量字体图标是一个非常不错的选择。 矢量字体图标…

关于曲率、曲率半径和曲率圆,看这几篇文章就够啦

关于曲率、曲率半径和曲率圆的内容&#xff0c;是考研数学数学一和数学二大纲中明确要求掌握的内容&#xff0c;但这部分内容在很多教材教辅以及练习题中较少涉及。在本文中&#xff0c;荒原之梦考研数学网就为大家整理了曲率、曲率半径和曲率圆方程相关的概念、基础知识以及练…

每日一题——LeetCode1051.高度检查器

方法一 sort排序&#xff1a; 创建一个元素和heights一模一样的expect数组 &#xff0c;将expect数组从小到大进行排序&#xff0c;比较heights和expect相同位置不同的元素个数 var heightChecker function(heights) {var expect [],count0for(const n of heights){expect.…

es集群安装及优化

es主节点 192.168.23.100 es节点 192.168.23.101 192.168.23.102 1.安装主节点 1.去官网下载es的yum包 官网下载地址 https://www.elastic.co/cn/downloads/elasticsearch 根据自己的需要下载对应的包 2.下载好之后把所有的包都传到从节点上&#xff0c;安装 [rootlocalho…

locust 快速入门--异常(Exceptions)与失败(Failures)

背景&#xff1a; 使用locust进行压测的时候&#xff0c;服务器响应已经异常了&#xff0c;但是从UI页面上看到的还是正常的响应。直至服务完全挂掉&#xff0c;才会出现异常信息。 locust认为HTTP响应代码是OK&#xff08;<400&#xff09;是成功的。实际服务的响应代码是2…

JavaScript:关系数组、对象的复制

关系数组(关联数组)解字符串出现的次数: var str aaccddvvasdadqwd;// 统计每个字母出现的次数// 关系数组(关联数组) 长度永远为0// 使用字符串当做索引var arr [];arr[0] 20;// arr[a] 1;// arr[b] 3;// arr[c] 4;// console.log(arr)for (var i 0; i < str.lengt…

钡铼网关 只需一台,解锁智慧无人搅拌站系统,绿色又环保

行业需求 为了提高搅拌站的自动化&#xff0c;减少人工繁琐的操作&#xff0c;同时记录物料的增减记录&#xff0c;实现对于物料从进场到出场的全周期管理。 系统介绍 针对搅拌站各个环节的需求大致相同&#xff0c;市场中逐渐流行一整套基本的智慧搅拌站解决方案。各种搅拌站…

【计算机毕业设计】SSM网上外卖订餐管理系统

项目介绍 该项目为前后台项目&#xff0c;分为普通用户与管理员两种角色&#xff0c;前台普通用户登录&#xff0c;后台管理员登录&#xff1b; 普通用户主要功能包括&#xff1a; 登录注册&#xff0c;查看商品&#xff0c;提交订单&#xff0c;然后留言&#xff0c;查看购物…

CRM如何精确控制RT设备和与UMD通信笔记

1 CRM工作职责 监控link req是否得到schedule监控link上各个device的req是否ready监控SOF或EOF的trigger信号&#xff0c;决定各个设备配置哪个req 2 CRM如何精确控制RT设备 分两步&#xff0c;一是crm知道某帧req的link dev准备好了&#xff0c;可以做apply setting。 二是…

华为MDC610接口说明

1、MDC610对外功能接口 2、1、MDC610硬件技术规格

【大数据实验系列】一文轻松搞定云服务器Centos8.x下安装MySQL5.x版本,以阿里云服务器为例!(超详细安装流程)

1. 文章主要内容 本篇博客主要涉及云服务器(以阿里云服务器为例子)Centos8.x下安装MySQL软件。&#xff08;通读本篇博客需要10分钟左右的时间&#xff09;。 本篇博客内容参考于&#xff1a;centOS8安装MySql5.7 2. 详细安装教程 2.1 MySQL rpm源包下载 我们首先点击…