当前位置: 首页 > article >正文

NRF_LOG时间戳配置全攻略:从sdk_config.h修改到RTT Viewer显示(附常见问题排查)

NRF_LOG时间戳配置全攻略从sdk_config.h修改到RTT Viewer显示附常见问题排查在嵌入式开发中日志系统是调试和问题排查的重要工具。对于使用Nordic Semiconductor芯片的开发者来说NRF_LOG结合RTT Viewer提供了高效的日志输出方案。然而许多开发者在实际项目中会遇到日志时间戳缺失或显示异常的问题导致难以准确分析事件发生的时序关系。本文将深入探讨如何完整配置NRF_LOG时间戳功能从底层硬件配置到上层显示工具的全流程实现。1. 时间戳功能的核心原理NRF_LOG模块的时间戳功能依赖于芯片内部的实时时钟(RTC)模块。当启用时间戳功能时系统会在每条日志消息前添加当前的时间信息格式通常为[时:分:秒.毫秒,微秒]。这种精细的时间记录对于分析多任务系统中的事件顺序、测量代码执行时间等场景至关重要。关键组件交互流程RTC硬件提供基础时钟计数get_rtc_counter函数将硬件计数转换为时间值NRF_LOG_INIT初始化时注册时间戳获取函数sdk_config.h中的宏定义控制功能开关RTT Viewer负责接收并格式化显示带时间戳的日志注意不同系列的nRF芯片可能使用不同的RTC模块(如RTC0/RTC1/RTC2)配置时需要参考具体芯片的参考手册。2. 基础配置步骤详解2.1 硬件时钟源选择nRF芯片通常提供多个RTC时钟源选项选择不当会导致时间戳不准确。常见的配置参数包括参数选项说明LFCLK源NRF_CLOCK_LF_SRC_RC内部RC振荡器(精度较低)NRF_CLOCK_LF_SRC_XTAL外部32.768kHz晶体(推荐)NRF_CLOCK_LF_SRC_SYNTH合成时钟源预分频值1-32768决定RTC计数频率推荐在main.c中添加以下初始化代码void clock_init(void) { nrf_drv_clock_config_t config NRF_DRV_CLOCK_DEAF_CONFIG; APP_ERROR_CHECK(nrf_drv_clock_init(config)); nrf_drv_clock_lfclk_request(NULL); while(!nrf_drv_clock_lfclk_is_running()) {} }2.2 实现时间戳获取函数时间戳获取函数需要返回当前RTC计数器的值。以下是典型实现uint32_t get_rtc_counter(void) { // 使用RTC1作为时间戳源(避免与SoftDevice冲突) uint32_t counter NRF_RTC1-COUNTER; // 如果RTC频率不是32768Hz需要在此处进行转换 // return counter * (DesiredFrequency / 32768); return counter; }2.3 修改NRF_LOG初始化在main()函数中修改日志初始化代码// 原始初始化方式 // uint32_t err_code NRF_LOG_INIT(); // 修改为带时间戳功能的初始化 uint32_t err_code NRF_LOG_INIT(get_rtc_counter);2.4 配置sdk_config.h关键参数在SDK配置文件中需要修改以下宏定义#define NRF_LOG_USES_TIMESTAMP 1 // 启用时间戳功能 #define NRF_LOG_TIMESTAMP_DEFAULT_FREQ 32768 // RTC时钟频率(Hz)3. 高级配置与优化3.1 时间戳格式自定义NRF_LOG允许自定义时间戳的显示格式。通过修改nrf_log_default_backends.c中的以下函数可以调整格式void timestamp_formatter(uint32_t timestamp, void * p_buffer, uint32_t size) { uint32_t hours (timestamp / 3600) % 24; uint32_t minutes (timestamp / 60) % 60; uint32_t seconds timestamp % 60; uint32_t msec (timestamp % 1000); snprintf(p_buffer, size, [%02d:%02d:%02d.%03d], hours, minutes, seconds, msec); }3.2 多时区处理技巧对于需要处理多时区的应用可以在时间戳获取函数中添加时区偏移uint32_t get_rtc_counter_with_timezone(void) { uint32_t base_count NRF_RTC1-COUNTER; uint32_t timezone_offset 8 * 3600; // 东八区偏移(秒) return base_count timezone_offset; }3.3 低功耗模式下的优化在低功耗应用中RTC可能会被暂停导致时间戳不连续。解决方案包括使用低功耗定时器(LPTIM)替代RTC在系统唤醒时同步RTC计数器记录睡眠时间并在唤醒后补偿4. 常见问题排查指南4.1 时间戳显示为全零可能原因RTC未正确初始化NRF_LOG_USES_TIMESTAMP未启用时间戳获取函数未正确注册排查步骤确认sdk_config.h中NRF_LOG_USES_TIMESTAMP设置为1检查RTC是否正常运行NRF_RTC1-TASKS_START 1; while(NRF_RTC1-COUNTER 0) {}验证get_rtc_counter函数是否被正确调用4.2 时间戳增长过快或过慢典型原因RTC预分频值配置错误时钟源选择不当(如使用了不稳定的RC振荡器)解决方法检查LFCLK源是否使用外部晶体if((NRF_CLOCK-LFCLKSRC CLOCK_LFCLKSRC_SRC_Msk) ! CLOCK_LFCLKSRC_SRC_Xtal) { // 重新配置为外部晶体 }确认RTC预分频值uint32_t prescaler NRF_RTC1-PRESCALER;4.3 RTT Viewer不显示时间戳常见问题RTT Viewer版本过旧日志缓冲区大小不足时间戳格式不兼容解决方案升级到最新版J-Link软件包增加日志缓冲区大小#define NRF_LOG_BUFSIZE 1024检查时间戳格式是否符合RTT Viewer预期5. 性能优化实践5.1 减少时间戳计算开销时间戳计算可能影响实时性能优化方法包括使用32位定时器替代RTC预计算时间单位转换仅在需要时启用时间戳// 优化的时间戳获取实现 static uint32_t last_counter 0; static uint32_t accumulated_ms 0; uint32_t optimized_timestamp(void) { uint32_t current NRF_RTC1-COUNTER; uint32_t elapsed current - last_counter; accumulated_ms (elapsed * 1000) / 32768; last_counter current; return accumulated_ms; }5.2 日志级别与时间戳的配合通过合理配置日志级别可以减少不必要的时间戳计算#if NRF_LOG_ENABLED NRF_LOG_LEVEL 3 #define LOG_WITH_TIMESTAMP(...) \ NRF_LOG_INST_DEBUG(__VA_ARGS__) #else #define LOG_WITH_TIMESTAMP(...) #endif5.3 多核系统的时间同步在多核系统中需要确保各核的时间戳同步使用共享内存区域存储基准时间定期同步各核的本地计时器添加核ID前缀到时间戳中[00:00:01.234,567][Core1] info app: Message from core 1 [00:00:01.235,000][Core0] info app: Message from core 0

相关文章:

NRF_LOG时间戳配置全攻略:从sdk_config.h修改到RTT Viewer显示(附常见问题排查)

NRF_LOG时间戳配置全攻略:从sdk_config.h修改到RTT Viewer显示(附常见问题排查) 在嵌入式开发中,日志系统是调试和问题排查的重要工具。对于使用Nordic Semiconductor芯片的开发者来说,NRF_LOG结合RTT Viewer提供了高效…...

零基础玩转OpenClaw:nanobot镜像可视化控制台入门

零基础玩转OpenClaw:nanobot镜像可视化控制台入门 1. 为什么选择nanobot镜像作为OpenClaw入门 第一次接触OpenClaw时,我被它强大的本地自动化能力所吸引,但很快就被复杂的命令行配置劝退了。直到发现了nanobot这个超轻量级OpenClaw镜像&…...

水墨江南模型Agent智能体开发:自主中式艺术创作助手

水墨江南模型Agent智能体开发:自主中式艺术创作助手 最近在捣鼓AI绘画,发现一个挺有意思的事儿。很多朋友想用AI画点有中国风味的作品,比如水墨画、山水画,但往往折腾半天,出来的效果总差那么点意思。要么是意境不对&…...

校园网免认证上网?手把手教你用UDP53端口搭建自己的“网络后门”(附服务器配置)

校园网络优化:UDP53端口的高效应用实践 校园网络作为师生日常学习生活的重要基础设施,其稳定性和访问效率直接影响着教学科研活动的开展。本文将深入探讨一种基于UDP53端口的网络优化方案,帮助技术爱好者理解并实现更流畅的网络体验。 1. 校园…...

League Akari:英雄联盟玩家的终极效率工具集,免费提升游戏体验

League Akari:英雄联盟玩家的终极效率工具集,免费提升游戏体验 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit …...

SolidWorks2021设计库隐藏技巧:如何自定义Toolbox标准件库满足企业需求

SolidWorks 2021企业级Toolbox深度定制:打造标准化设计引擎 在企业级机械设计环境中,标准化程度直接决定了团队协作效率和设计质量。SolidWorks 2021的Toolbox功能远不止是一个标准件库,当经过深度定制后,它能成为企业设计流程的中…...

Phi-3-mini-128k-instruct辅助Dev-C++初学者:C/C++编译错误智能解读

Phi-3-mini-128k-instruct:你的Dev-C编程“陪练” 刚学C/C那会儿,你是不是也经常被Dev-C弹出的那一大串编译错误信息搞得一头雾水?什么“undefined reference”,什么“expected ‘;’ before ‘}’ token”,每个单词都…...

Java中正确比较数组最小值的两种方法

本文旨在解决Java Stream 当API使用min()方法获得数组最小值时,返回optionalint类型导致的直接比较错误。我们将深入探讨这个问题的根源,并提供两个有效的解决方案:一是比较Optionalint的getasint()方法,二是引入apache Commons N…...

LongCat-Image-Edit图片编辑神器:5分钟快速部署,一句话精准改图

LongCat-Image-Edit图片编辑神器:5分钟快速部署,一句话精准改图 1. 产品核心能力介绍 LongCat-Image-Edit是美团LongCat团队推出的开源图像编辑模型,它让复杂的图片编辑变得像说话一样简单。这个模型有三大杀手锏: 一句话精准编…...

FPGA实战:8点FFT运算的Verilog实现与误差优化技巧

FPGA实战:8点FFT运算的Verilog实现与误差优化技巧 在数字信号处理领域,快速傅里叶变换(FFT)算法是频谱分析的核心工具。对于FPGA开发者而言,掌握FFT的硬件实现不仅能提升系统性能,更能深入理解算法与硬件的…...

【问题处理】如何解决PSQLException中2-byte值超出范围导致的整数溢出错误

1. 什么是PSQLException中的2-byte值溢出错误 最近在调试一个Java应用时,遇到了一个让人头疼的错误:Tried to send an out-of-range integer as a 2-byte value: 110629。这个错误看起来有点晦涩,但其实理解起来并不复杂。简单来说&#xff0…...

Windows下FFmpeg环境配置全攻略:从下载到视频剪辑实战

Windows下FFmpeg环境配置全攻略:从下载到视频剪辑实战 在数字内容创作爆发的时代,视频处理能力已成为开发者和创作者的必备技能。FFmpeg作为开源多媒体处理领域的"瑞士军刀",其强大功能与跨平台特性使其成为处理音视频文件的首选工…...

从电源到复位:深入拆解STM32最小系统每个电路模块的设计考量与选型避坑

从电源到复位:深入拆解STM32最小系统每个电路模块的设计考量与选型避坑 在嵌入式系统开发中,STM32系列微控制器因其出色的性能和丰富的外设资源而广受欢迎。然而,即使是看似简单的STM32最小系统设计,也蕴含着大量值得深入探讨的工…...

零基础玩转Llama-3.2-3B:Ollama部署+实战问答全流程

零基础玩转Llama-3.2-3B:Ollama部署实战问答全流程 1. 模型介绍与准备 1.1 Llama-3.2-3B模型概述 Llama-3.2-3B是Meta公司开发的多语言大型语言模型(LLM),属于Llama 3.2系列中的3B参数版本。这个纯文本模型经过指令微调优化&am…...

从数据包到DMA:图解GMAC传输描述符的完整生命周期(含TSO/VLAN案例)

从数据包到DMA:图解GMAC传输描述符的完整生命周期(含TSO/VLAN案例) 在网络硬件加速领域,GMAC(Gigabit Media Access Control)接口的传输描述符机制是提升数据吞吐效率的核心技术之一。本文将深入剖析一个网…...

springboot交通道路监测感知与车路协同系统可视化大屏

目录技术架构设计数据采集与处理可视化大屏功能模块系统集成与部署关键技术点测试与迭代项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术架构设计 采用SpringBoot作为后端框架,提供RESTful API接口;…...

基于Vue的沧交食堂食品监管系统[vue]-计算机毕业设计源码+LW文档

摘要:本文阐述了一个基于Vue框架开发的沧交食堂食品监管系统。该系统旨在借助现代Web技术,强化对沧交食堂食品安全的监管力度,提升监管效率与质量。系统涵盖了系统用户管理、新闻数据管理、食品相关业务管理以及评论管理等多方面功能。文章详…...

天翼网盘网页版绕过50M限制下载大文件?F12开发者工具实战教程

突破网页端下载限制的浏览器开发者工具实战指南 在云存储服务日益普及的今天,许多平台为了推广客户端应用,会在网页端设置各种功能限制。对于技术爱好者而言,这些限制往往可以通过浏览器内置的开发者工具进行突破。本文将详细介绍如何利用F12…...

CentOS7快速部署Golang 1.22.2开发环境全攻略

1. 为什么选择CentOS7部署Golang 1.22.2 最近在帮团队搭建新的开发环境时,我发现很多同事还在用老旧的Golang版本。作为目前最稳定的Linux发行版之一,CentOS7依然是企业级开发环境的首选。而Golang 1.22.2作为2024年发布的最新稳定版,带来了不…...

PyTorch 2.8镜像多场景落地:智慧农业病虫害识别模型田间部署方案

PyTorch 2.8镜像多场景落地:智慧农业病虫害识别模型田间部署方案 1. 田间AI的迫切需求 现代农业正面临病虫害防治的严峻挑战。传统人工巡查方式效率低下,一个熟练的技术员每天最多能检查3-5亩作物,而大型农场往往需要数十人同时作业。更棘手…...

DeepFaceLab 512分辨率遮罩模型实战:如何精准处理头发和手部细节(附下载)

DeepFaceLab 512分辨率遮罩模型实战:如何精准处理头发和手部细节 在数字内容创作领域,视频换脸技术已经从简单的娱乐工具逐渐演变为影视特效、虚拟偶像制作等专业场景的核心技术。对于DeepFaceLab的中高级用户来说,如何突破基础换脸的局限&am…...

C1——优化3Dtiles透明度设置以实现管线可视化

1. 为什么需要调整3Dtiles透明度? 在地理信息系统(GIS)和三维可视化项目中,我们经常会遇到多层数据叠加显示的需求。比如在城市地下管线可视化场景中,地表建筑模型(3Dtiles)和地下管线网络需要同…...

图像分割损失函数调参指南:如何用Focal Loss拯救你的小目标检测模型

图像分割损失函数调参指南:如何用Focal Loss拯救你的小目标检测模型 当你在处理卫星图像中的微小建筑物或显微图像里的稀有细胞时,是否经常遇到模型对前景目标"视而不见"的情况?传统交叉熵损失在面对这种极端类别不平衡时往往力不从…...

RetinaFace效果展示:高精度人脸检测与关键点定位案例

RetinaFace效果展示:高精度人脸检测与关键点定位案例 1. RetinaFace模型核心能力解析 RetinaFace作为当前最先进的人脸检测算法之一,在精度和效率方面都达到了业界领先水平。这个基于ResNet50构建的模型能够同时完成三项关键任务: 人脸检测…...

双模型协作:OpenClaw同时调用GLM-4.7-Flash与Coder模型实战

双模型协作:OpenClaw同时调用GLM-4.7-Flash与Coder模型实战 1. 为什么需要双模型协作? 在我的日常开发工作中,经常遇到这样的场景:需要先理解一个复杂需求(比如"帮我写个爬虫抓取知乎热榜并分析关键词"&am…...

小白友好!Gemma-3-12B-IT WebUI部署常见错误及修复方法

小白友好!Gemma-3-12B-IT WebUI部署常见错误及修复方法 1. 为什么你的WebUI总是打不开? 你是不是也遇到过这种情况:跟着教程一步步部署Gemma-3-12B-IT的WebUI,最后一步打开浏览器,输入地址,结果页面一直转…...

Node.js 环境避坑指南:从零搞定 Fetch MCP 依赖安装与构建 (Windows/macOS)

Node.js 环境避坑指南:从零搞定 Fetch MCP 依赖安装与构建 在开发者的日常工作中,遇到环境配置问题就像程序员遇到bug一样常见。特别是对于刚接触Node.js生态的前端新手,或是需要在不同操作系统间切换的开发者来说,一个看似简单的…...

告别手动建模!用Blender GIS插件5分钟搞定CARLA地图(附OSM数据源)

告别手动建模!用Blender GIS插件5分钟搞定CARLA地图(附OSM数据源) 在自动驾驶仿真领域,快速构建高精度地图一直是开发者的痛点。传统手动建模方式不仅耗时费力,还难以保证道路网络的拓扑准确性。现在,通过…...

SDMatte惊艳抠图效果展示:10组高难度玻璃/纱布/叶片实测对比图

SDMatte惊艳抠图效果展示:10组高难度玻璃/纱布/叶片实测对比图 1. 开篇:当AI遇见高难度抠图 在图像处理领域,抠图一直是个技术活。特别是遇到玻璃杯、薄纱窗帘、树叶这些半透明或边缘复杂的物体时,传统工具往往力不从心。今天我…...

保姆级教程:用seqtk、bwa和bedtools从零绘制GC-depth图,诊断测序污染

从零构建GC-depth分析全流程:手把手教你诊断测序数据污染 刚拿到测序数据的生物信息学新手,常常会面临一个灵魂拷问:我的数据干净吗?GC-depth分析就像给测序数据做"体检",通过一张图就能快速发现细菌污染、样…...