0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

时区陷阱!RT-Thread闹钟失效不响应?

RT-Thread官方账号 2025-06-18 12:02 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、前言

RT-Thread 的 alarm 是系统提供的闹钟设备接口,提供了一系列用于管理定时事件的 API。然而,在实际使用过程中,遇到了一些与时间处理相关的问题。本文将围绕这些问题展开分析,并提出对应的解决方案。

122c8104-4bf9-11f0-986f-92fbcf53809c.png

二、问题点

在使用先楫平台的 drv_rtc 驱动时,发现两个典型问题:

使用 local_time_r 设置闹钟时间时无法触发回调函数

使用 gmtime_r 设置后虽然能触发回调,但通过 list_alarm 命令打印出的闹钟时间显示不正确。

例如:设置为 1719 的本地时间,实际输出却为 919,存在 8 小时的时间差。

12363eb0-4bf9-11f0-986f-92fbcf53809c.png

这不单单在先楫平台有所体现,在其他平台比如STM32等都有类似现象。

三、原因分析

在解析原因之前,需要了解下rtthread对于ctime的实现。

(一)ctime相关接口的区别

在rtthread的rtc和alarm驱动中,需要调用ctime的各类时间函数,其中最主要的是时间接口区别是:

local_time和local_time_t是将时间戳(time_t)转换本地时间函数,比如设置时区为东八区,那么相比UTC时间就会多8个小时。

gmtime和gmtime_r是将时间戳转换为UTC时间。

(二)rtthread的时区支持

考虑到嵌入式的场景应用,rtthread采用的是轻量级的时区支持,没有支持完整的时区数据库。

默认的时区是东八区(北京时间)

代码宏是RT_LIBC_USING_LIGHT_TZ_DST,对应的kconfig对应以下,如果需要支持其他时区时间,可以改变以下配置。

12452b50-4bf9-11f0-986f-92fbcf53809c.png

(三)rtthread的时间转换支持

在rtthread的时区支持上,主要影响localtime和mktime的行为,localtime_r和localtime会根据时区时间做偏移转换为本地时间。

124db4b4-4bf9-11f0-986f-92fbcf53809c.png

mktime会根据时区时间偏移将本地时间转换为UTC的时间戳。

125f8450-4bf9-11f0-986f-92fbcf53809c.png

在rtthread的alarm实现中,涉及到时间戳转换日历时间的接口都使用了UTC时间的函数接口gmtime_r,而当触发闹钟更新的时候,需要使用闹钟时间与当前时间做判断以便是否到达闹钟触发事件,如果此时闹钟时间使用的是local_time,那么判断将永远不成立,也就无法触发闹钟回调。而如果同样使用的是gmtime,那么时间单位是一致的,就会触发闹钟回调,但打印的闹钟列表是基于UTC时间。

由此可知:在 Alarm 模块的实现中,时间戳转日历时间的操作均使用的是 UTC 时间函数(gmtime_r)。如果用户传入的是基于本地时间的结构体,则因未统一转换而造成比较失败,导致无法触发回调。

三、修复

根据上述原因,问题的根本在于Alarm 模块未正确支持本地时间的判断逻辑。针对这一问题,社区已在最新主线代码中进行了修复。

126d487e-4bf9-11f0-986f-92fbcf53809c.png

在对应的时间戳转换日历时间上加个宏定义来切换为本地时间计算还是UTC时间计算即可。

12791b2c-4bf9-11f0-986f-92fbcf53809c.png

Kconfig配置上加了RT_ALARM_USING_LOCAL_TIME配置宏,如果打开就是基于本地时间来计算。默认不使能。

RT-Thread Components -> Device Drivers -> Using RTC device drivers-> Using RTC alarm -> Using local time for the alarm calculation

128a3394-4bf9-11f0-986f-92fbcf53809c.png

如果使能该配置,那么闹钟就是以本地时间local_time为准

如果禁能该配置,那么闹钟就是以UTC时间gmtime为准。

在使用rt_alarm_create增加闹钟时,配置的闹钟时间需要区分来,即可正常工作

129ae572-4bf9-11f0-986f-92fbcf53809c.png

在list_alarm命令中加入了timezone,查找闹钟列表更加直观


1、使用UTC时间的alarm

12a8480c-4bf9-11f0-986f-92fbcf53809c.png

2、使用东八区的本地时间的alarm

12baebec-4bf9-11f0-986f-92fbcf53809c.png

四、BSP的drv_rtc驱动注意点

1. 实现 set_timestamp 时注意时间转换

当启用了 RT_ALARM_USING_LOCAL_TIME 宏定义时,必须使用 local_time 进行时间转换,否则可能导致时间偏差。

12c54f06-4bf9-11f0-986f-92fbcf53809c.png

2、设置闹钟时必须完整填写年月日字段

由于 RT_ALARM_ONESHOT 模式下,系统会将闹钟时间转换为时间戳进行比较,因此必须提供完整的日历时间结构(包括年、月、日)。否则可能因字段缺失导致匹配失败。

12d0ca84-4bf9-11f0-986f-92fbcf53809c.png

而先楫只需要从闹钟寄存器中获取即可。

12de36a6-4bf9-11f0-986f-92fbcf53809c.png

五、总结

本文围绕 RT-Thread 中的Alarm(闹钟)设备驱动展开讨论,结合先楫平台的实际开发经验,深入分析了在使用 rt_alarm_create 设置本地时间闹钟时遇到的问题,并从底层机制出发,解释了问题根源,最终提出了有效的解决方案。

核心结论如下:

Alarm 子系统默认使用 UTC 时间函数(如 gmtime_r)进行时间戳与日历时间的转换;

若传入本地时间结构体但未统一转换,会导致比较失败,从而无法触发闹钟回调;

rtthread社区已在主线中引入 RT_ALARM_USING_LOCAL_TIME 宏定义,支持基于本地时间的闹钟行为;

在使用 Alarm 功能时,开发者需关注系统时区设置以及是否启用本地时间模式,以确保闹钟行为符合预期。

通过本文的分析与实践,希望可以帮助开发者更好地理解和使用 RT-Thread 的 Alarm 子系统,提升嵌入式设备中定时任务管理的灵活性与准确性。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • API
    API
    +关注

    关注

    2

    文章

    2507

    浏览量

    67141
  • 设备
    +关注

    关注

    2

    文章

    4899

    浏览量

    73937
  • RT-Thread
    +关注

    关注

    32

    文章

    1657

    浏览量

    45461
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RT-Thread记录(二、RT-Thread内核启动流程)

    在前面我们RT-Thread Studio工程基础之上讲一讲RT-Thread内核启动流程.
    的头像 发表于 06-20 00:30 7475次阅读
    <b class='flag-5'>RT-Thread</b>记录(二、<b class='flag-5'>RT-Thread</b>内核启动流程)

    RT-Thread系统上开启RTC驱动模块

    : 1654000441timezone: UTC+8小结STM32 平台RTC 的功能,因为RT-Thread 适配的很好,所以基本上配置好就可以正常使用了后面再开启RTC Alarm 闹钟框架,实现定时闹钟功能这里需要了解一
    发表于 06-01 15:31

    RT-Thread编程指南

    RT-Thread编程指南——RT-Thread开发组(2015-03-31)。RT-Thread做为国内有较大影响力的开源实时操作系统,本文是RT-Thread实时操作系统的编程指南
    发表于 11-26 16:06 0次下载

    RT-Thread用户手册

    RT-Thread用户手册——本书是RT-Thread的编程手册,用于指导在RT-Thread实时操作系统环境下如何进行编 程。
    发表于 11-26 16:16 0次下载

    RT-Thread软件包定义和使用

    RT-Thread软件包是运行于RT-Thread物联网操作系统平台上,面向不同应用领域的通用软件组件 。RT-Thread 同时提供了开放的软件包平台,为开发者提供了众多可重用软件包的选择,是
    的头像 发表于 05-21 11:29 1.2w次阅读
    <b class='flag-5'>RT-Thread</b>软件包定义和使用

    RT-Thread全球技术大会:萤石研发团队使用RT-Thread的技术挑战

    RT-Thread全球技术大会:研发团队使用RT-Thread的技术挑战         审核编辑:彭静
    的头像 发表于 05-27 11:36 2942次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:萤石研发团队使用<b class='flag-5'>RT-Thread</b>的技术挑战

    RT-Thread全球技术大会:Kconfig在RT-Thread中的工作机制

    RT-Thread全球技术大会:Kconfig在RT-Thread中的工作机制               审核编辑:彭静
    的头像 发表于 05-27 14:49 2592次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:Kconfig在<b class='flag-5'>RT-Thread</b>中的工作机制

    RT-Thread全球技术大会:在RT-Thread上编写测试用例

    RT-Thread全球技术大会:在RT-Thread上编写测试用例           审核编辑:彭静
    的头像 发表于 05-27 16:28 2383次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:在<b class='flag-5'>RT-Thread</b>上编写测试用例

    RT-Thread全球技术大会:RT-Thread测试用例集合案例

    RT-Thread全球技术大会:RT-Thread测试用例集合案例           审核编辑:彭静
    的头像 发表于 05-27 16:34 3065次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:<b class='flag-5'>RT-Thread</b>测试用例集合案例

    RT-Thread学习笔记 RT-Thread的架构概述

    RT-Thread 简介 作为一名 RTOS 的初学者,也许你对 RT-Thread 还比较陌生。然而,随着你的深入接触,你会逐渐发现 RT-Thread 的魅力和它相较于其他同类型 RTOS
    的头像 发表于 07-09 11:27 6379次阅读
    <b class='flag-5'>RT-Thread</b>学习笔记 <b class='flag-5'>RT-Thread</b>的架构概述

    RT-Thread文档_RT-Thread 简介

    RT-Thread文档_RT-Thread 简介
    发表于 02-22 18:22 5次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 简介

    RT-Thread文档_RT-Thread 潘多拉 STM32L475 上手指南

    RT-Thread文档_RT-Thread 潘多拉 STM32L475 上手指南
    发表于 02-22 18:23 10次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 潘多拉 STM32L475 上手指南

    RT-Thread文档_RT-Thread SMP 介绍与移植

    RT-Thread文档_RT-Thread SMP 介绍与移植
    发表于 02-22 18:31 9次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> SMP 介绍与移植

    基于RT-Thread Studio学习

    前期准备:从官网下载 RT-Thread Studio,弄个账号登陆,开启rt-thread学习之旅。
    的头像 发表于 05-15 11:00 6750次阅读
    基于<b class='flag-5'>RT-Thread</b> Studio学习

    RT-Thread v5.0.2 发布

    RT-Thread 代码仓库地址: ●  https://github.com/RT-Thread/rt-thread RT-Thread 5.0.2 版本发布日志详情: ●  htt
    的头像 发表于 10-10 18:45 3571次阅读
    <b class='flag-5'>RT-Thread</b> v5.0.2 发布