一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

時(shí)區(qū)陷阱!RT-Thread鬧鐘失效不響應(yīng)?

RT-Thread官方賬號(hào) ? 2025-06-18 12:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、前言

RT-Thread 的 alarm 是系統(tǒng)提供的鬧鐘設(shè)備接口,提供了一系列用于管理定時(shí)事件的 API。然而,在實(shí)際使用過程中,遇到了一些與時(shí)間處理相關(guān)的問題。本文將圍繞這些問題展開分析,并提出對(duì)應(yīng)的解決方案。

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

二、問題點(diǎn)

在使用先楫平臺(tái)的 drv_rtc 驅(qū)動(dòng)時(shí),發(fā)現(xiàn)兩個(gè)典型問題:

使用 local_time_r 設(shè)置鬧鐘時(shí)間時(shí)無法觸發(fā)回調(diào)函數(shù)

使用 gmtime_r 設(shè)置后雖然能觸發(fā)回調(diào),但通過 list_alarm 命令打印出的鬧鐘時(shí)間顯示不正確。

例如:設(shè)置為 1719 的本地時(shí)間,實(shí)際輸出卻為 919,存在 8 小時(shí)的時(shí)間差。

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

這不單單在先楫平臺(tái)有所體現(xiàn),在其他平臺(tái)比如STM32等都有類似現(xiàn)象。

三、原因分析

在解析原因之前,需要了解下rtthread對(duì)于ctime的實(shí)現(xiàn)。

(一)ctime相關(guān)接口的區(qū)別

在rtthread的rtc和alarm驅(qū)動(dòng)中,需要調(diào)用ctime的各類時(shí)間函數(shù),其中最主要的是時(shí)間接口區(qū)別是:

local_time和local_time_t是將時(shí)間戳(time_t)轉(zhuǎn)換本地時(shí)間函數(shù),比如設(shè)置時(shí)區(qū)為東八區(qū),那么相比UTC時(shí)間就會(huì)多8個(gè)小時(shí)。

gmtime和gmtime_r是將時(shí)間戳轉(zhuǎn)換為UTC時(shí)間。

(二)rtthread的時(shí)區(qū)支持

考慮到嵌入式的場(chǎng)景應(yīng)用,rtthread采用的是輕量級(jí)的時(shí)區(qū)支持,沒有支持完整的時(shí)區(qū)數(shù)據(jù)庫。

默認(rèn)的時(shí)區(qū)是東八區(qū)(北京時(shí)間)

代碼宏是RT_LIBC_USING_LIGHT_TZ_DST,對(duì)應(yīng)的kconfig對(duì)應(yīng)以下,如果需要支持其他時(shí)區(qū)時(shí)間,可以改變以下配置。

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

(三)rtthread的時(shí)間轉(zhuǎn)換支持

在rtthread的時(shí)區(qū)支持上,主要影響localtime和mktime的行為,localtime_r和localtime會(huì)根據(jù)時(shí)區(qū)時(shí)間做偏移轉(zhuǎn)換為本地時(shí)間。

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

mktime會(huì)根據(jù)時(shí)區(qū)時(shí)間偏移將本地時(shí)間轉(zhuǎn)換為UTC的時(shí)間戳。

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

在rtthread的alarm實(shí)現(xiàn)中,涉及到時(shí)間戳轉(zhuǎn)換日歷時(shí)間的接口都使用了UTC時(shí)間的函數(shù)接口gmtime_r,而當(dāng)觸發(fā)鬧鐘更新的時(shí)候,需要使用鬧鐘時(shí)間與當(dāng)前時(shí)間做判斷以便是否到達(dá)鬧鐘觸發(fā)事件,如果此時(shí)鬧鐘時(shí)間使用的是local_time,那么判斷將永遠(yuǎn)不成立,也就無法觸發(fā)鬧鐘回調(diào)。而如果同樣使用的是gmtime,那么時(shí)間單位是一致的,就會(huì)觸發(fā)鬧鐘回調(diào),但打印的鬧鐘列表是基于UTC時(shí)間。

由此可知:在 Alarm 模塊的實(shí)現(xiàn)中,時(shí)間戳轉(zhuǎn)日歷時(shí)間的操作均使用的是 UTC 時(shí)間函數(shù)(gmtime_r)。如果用戶傳入的是基于本地時(shí)間的結(jié)構(gòu)體,則因未統(tǒng)一轉(zhuǎn)換而造成比較失敗,導(dǎo)致無法觸發(fā)回調(diào)。

三、修復(fù)

根據(jù)上述原因,問題的根本在于Alarm 模塊未正確支持本地時(shí)間的判斷邏輯。針對(duì)這一問題,社區(qū)已在最新主線代碼中進(jìn)行了修復(fù)。

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

在對(duì)應(yīng)的時(shí)間戳轉(zhuǎn)換日歷時(shí)間上加個(gè)宏定義來切換為本地時(shí)間計(jì)算還是UTC時(shí)間計(jì)算即可。

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

Kconfig配置上加了RT_ALARM_USING_LOCAL_TIME配置宏,如果打開就是基于本地時(shí)間來計(jì)算。默認(rèn)不使能。

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

如果使能該配置,那么鬧鐘就是以本地時(shí)間local_time為準(zhǔn)

如果禁能該配置,那么鬧鐘就是以UTC時(shí)間gmtime為準(zhǔn)。

在使用rt_alarm_create增加鬧鐘時(shí),配置的鬧鐘時(shí)間需要區(qū)分來,即可正常工作

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

在list_alarm命令中加入了timezone,查找鬧鐘列表更加直觀


1、使用UTC時(shí)間的alarm

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

2、使用東八區(qū)的本地時(shí)間的alarm

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

四、BSP的drv_rtc驅(qū)動(dòng)注意點(diǎn)

1. 實(shí)現(xiàn) set_timestamp 時(shí)注意時(shí)間轉(zhuǎn)換

當(dāng)啟用了 RT_ALARM_USING_LOCAL_TIME 宏定義時(shí),必須使用 local_time 進(jìn)行時(shí)間轉(zhuǎn)換,否則可能導(dǎo)致時(shí)間偏差。

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

2、設(shè)置鬧鐘時(shí)必須完整填寫年月日字段

由于 RT_ALARM_ONESHOT 模式下,系統(tǒng)會(huì)將鬧鐘時(shí)間轉(zhuǎn)換為時(shí)間戳進(jìn)行比較,因此必須提供完整的日歷時(shí)間結(jié)構(gòu)(包括年、月、日)。否則可能因字段缺失導(dǎo)致匹配失敗。

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

而先楫只需要從鬧鐘寄存器中獲取即可。

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

五、總結(jié)

本文圍繞 RT-Thread 中的Alarm(鬧鐘)設(shè)備驅(qū)動(dòng)展開討論,結(jié)合先楫平臺(tái)的實(shí)際開發(fā)經(jīng)驗(yàn),深入分析了在使用 rt_alarm_create 設(shè)置本地時(shí)間鬧鐘時(shí)遇到的問題,并從底層機(jī)制出發(fā),解釋了問題根源,最終提出了有效的解決方案。

核心結(jié)論如下:

Alarm 子系統(tǒng)默認(rèn)使用 UTC 時(shí)間函數(shù)(如 gmtime_r)進(jìn)行時(shí)間戳與日歷時(shí)間的轉(zhuǎn)換;

若傳入本地時(shí)間結(jié)構(gòu)體但未統(tǒng)一轉(zhuǎn)換,會(huì)導(dǎo)致比較失敗,從而無法觸發(fā)鬧鐘回調(diào);

rtthread社區(qū)已在主線中引入 RT_ALARM_USING_LOCAL_TIME 宏定義,支持基于本地時(shí)間的鬧鐘行為;

在使用 Alarm 功能時(shí),開發(fā)者需關(guān)注系統(tǒng)時(shí)區(qū)設(shè)置以及是否啟用本地時(shí)間模式,以確保鬧鐘行為符合預(yù)期。

通過本文的分析與實(shí)踐,希望可以幫助開發(fā)者更好地理解和使用 RT-Thread 的 Alarm 子系統(tǒng),提升嵌入式設(shè)備中定時(shí)任務(wù)管理的靈活性與準(zhǔn)確性。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1567

    瀏覽量

    63720
  • 設(shè)備
    +關(guān)注

    關(guān)注

    2

    文章

    4655

    瀏覽量

    71592
  • RT-Thread
    +關(guān)注

    關(guān)注

    32

    文章

    1385

    瀏覽量

    41671
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    RT-Thread記錄(二、RT-Thread內(nèi)核啟動(dòng)流程)

    在前面我們RT-Thread Studio工程基礎(chǔ)之上講一講RT-Thread內(nèi)核啟動(dòng)流程.
    的頭像 發(fā)表于 06-20 00:30 ?5597次閱讀
    <b class='flag-5'>RT-Thread</b>記錄(二、<b class='flag-5'>RT-Thread</b>內(nèi)核啟動(dòng)流程)

    RT-Thread系統(tǒng)上開啟RTC驅(qū)動(dòng)模塊

    : 1654000441timezone: UTC+8小結(jié)STM32 平臺(tái)RTC 的功能,因?yàn)?b class='flag-5'>RT-Thread 適配的很好,所以基本上配置好就可以正常使用了后面再開啟RTC Alarm 鬧鐘框架,實(shí)現(xiàn)定時(shí)鬧鐘功能這里需要了解一
    發(fā)表于 06-01 15:31

    RT-Thread編程指南

    RT-Thread編程指南——RT-Thread開發(fā)組(2015-03-31)。RT-Thread做為國內(nèi)有較大影響力的開源實(shí)時(shí)操作系統(tǒng),本文是RT-Thread實(shí)時(shí)操作系統(tǒng)的編程指南
    發(fā)表于 11-26 16:06 ?0次下載

    RT-Thread用戶手冊(cè)

    RT-Thread用戶手冊(cè)——本書是RT-Thread的編程手冊(cè),用于指導(dǎo)在RT-Thread實(shí)時(shí)操作系統(tǒng)環(huán)境下如何進(jìn)行編 程。
    發(fā)表于 11-26 16:16 ?0次下載

    RT-Thread全球技術(shù)大會(huì):螢石研發(fā)團(tuán)隊(duì)使用RT-Thread的技術(shù)挑戰(zhàn)

    RT-Thread全球技術(shù)大會(huì):研發(fā)團(tuán)隊(duì)使用RT-Thread的技術(shù)挑戰(zhàn) ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 11:36 ?1535次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):螢石研發(fā)團(tuán)隊(duì)使用<b class='flag-5'>RT-Thread</b>的技術(shù)挑戰(zhàn)

    RT-Thread全球技術(shù)大會(huì):Kconfig在RT-Thread中的工作機(jī)制

    RT-Thread全球技術(shù)大會(huì):Kconfig在RT-Thread中的工作機(jī)制 ? ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 14:49 ?1814次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):Kconfig在<b class='flag-5'>RT-Thread</b>中的工作機(jī)制

    RT-Thread全球技術(shù)大會(huì):在RT-Thread上編寫測(cè)試用例

    RT-Thread全球技術(shù)大會(huì):在RT-Thread上編寫測(cè)試用例 ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 16:28 ?1728次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):在<b class='flag-5'>RT-Thread</b>上編寫測(cè)試用例

    RT-Thread全球技術(shù)大會(huì):RT-Thread測(cè)試用例集合案例

    RT-Thread全球技術(shù)大會(huì):RT-Thread測(cè)試用例集合案例 ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 16:34 ?2361次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):<b class='flag-5'>RT-Thread</b>測(cè)試用例集合案例

    RT-Thread學(xué)習(xí)筆記 RT-Thread的架構(gòu)概述

    RT-Thread 簡介 作為一名 RTOS 的初學(xué)者,也許你對(duì) RT-Thread 還比較陌生。然而,隨著你的深入接觸,你會(huì)逐漸發(fā)現(xiàn) RT-Thread 的魅力和它相較于其他同類型 RTOS
    的頭像 發(fā)表于 07-09 11:27 ?4969次閱讀
    <b class='flag-5'>RT-Thread</b>學(xué)習(xí)筆記 <b class='flag-5'>RT-Thread</b>的架構(gòu)概述

    RT-Thread文檔_RT-Thread 簡介

    RT-Thread文檔_RT-Thread 簡介
    發(fā)表于 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 上手指南
    發(fā)表于 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 介紹與移植
    發(fā)表于 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
    發(fā)表于 02-22 18:40 ?1次下載
    <b class='flag-5'>RT-Thread</b>文檔_workqueue

    基于RT-Thread Studio學(xué)習(xí)

    前期準(zhǔn)備:從官網(wǎng)下載 RT-Thread Studio,弄個(gè)賬號(hào)登陸,開啟rt-thread學(xué)習(xí)之旅。
    的頭像 發(fā)表于 05-15 11:00 ?5152次閱讀
    基于<b class='flag-5'>RT-Thread</b> Studio學(xué)習(xí)

    RT-Thread v5.0.2 發(fā)布

    RT-Thread 代碼倉庫地址: ●? https://github.com/RT-Thread/rt-thread RT-Thread 5.0.2 版本發(fā)布日志詳情: ●? htt
    的頭像 發(fā)表于 10-10 18:45 ?1898次閱讀
    <b class='flag-5'>RT-Thread</b> v5.0.2 發(fā)布