在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    1566

    瀏覽量

    63688
  • 設備
    +關注

    關注

    2

    文章

    4649

    瀏覽量

    71566
  • RT-Thread
    +關注

    關注

    32

    文章

    1380

    瀏覽量

    41630
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    RT-Thread記錄(二、RT-Thread內核啟動流程)

    在前面我們RT-Thread Studio工程基礎之上講一講RT-Thread內核啟動流程.
    的頭像 發表于 06-20 00:30 ?5575次閱讀
    <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-27 11:36 ?1517次閱讀
    <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 ?1798次閱讀
    <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 ?1718次閱讀
    <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 ?2347次閱讀
    <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 ?4951次閱讀
    <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文檔_workqueue

    RT-Thread文檔_workqueue
    發表于 02-22 18:40 ?1次下載
    <b class='flag-5'>RT-Thread</b>文檔_workqueue

    基于RT-Thread Studio學習

    前期準備:從官網下載 RT-Thread Studio,弄個賬號登陸,開啟rt-thread學習之旅。
    的頭像 發表于 05-15 11:00 ?5126次閱讀
    基于<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 ?1893次閱讀
    <b class='flag-5'>RT-Thread</b> v5.0.2 發布
    主站蜘蛛池模板: 在线观看成人网 | 亚洲第一页在线 | 91在线视频免费 | 男女性gif抽搐出入 男女性高爱潮免费的国产 男女性高爱麻豆 | 444kk免费 | 日本污全彩肉肉无遮挡彩色 | 天堂电影在线 | 免费又爽又黄的禁片1000部 | 在线天堂中文官网 | 欧美一级黄色影片 | 国产精品一级毛片不收费 | 狠狠色噜噜狠狠狠狠五月婷 | 华人黄网站大全 | 亚洲第一在线视频 | 久久好色 | 午夜嘿嘿嘿| 久久久久久久综合色一本 | 国产美女久久久久 | 免费看黄色录像 | 午夜小视频网站 | 波多野结衣福利 | 日本人的色道免费网站 | 天天干天天拍天天射天天添天天爱 | 中国一级特黄aa毛片大片 | 久久综合九色综合98一99久久99久 | 欧美一级特黄aaaaaa在线看首页 | 亚洲高清网站 | 免费爱爱视频网站 | 乱子伦xxxx厨房 | 免费看黄色小视频 | 国产成人精品三级 | 一区二区3区免费视频 | 日韩午夜免费 | 伊人亚洲 | 亚洲邪恶天堂影院在线观看 | 亚洲午夜久久 | 天天黄色| 妖精视频永久在线入口 | 亚洲色妞| 亚洲我射 | 乱人伦小说短篇 |