Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
alarm
bug反馈
使用alarm模块的时候,设置时间之后没有更新新的alarm时间
发布于 2023-11-03 11:15:06 浏览:529
订阅该版
你好,我使用的是rt-thread studio 2.2.6,在STM32F407VG芯片上使用RT-THREAD的标准版本4.1.1。 在使用提供的alarm模块时,设置了一个每分钟触发的alarm。当我在msh命令行中,使用date命令设置时间之后,这个每分钟触发的alarm有可能出现没有更新的情况,通过实验是可以复现这个bug的。复现的方法是使用date命令设置时间是,秒的设置不是0秒,比如设置成12秒,就会出现每分钟触发的alarm不更新。 可以看如下截图  而使用date设置时间时,只有秒为0的时候,每分钟触发的alarm才能正确的更新  我创建的alarm的代码如下: ```c rt_alarm_t alarm_10min,alarm_timing,alarm_zerotime; void create_10_min_alarm() { struct rt_alarm_setup alarm_setup; alarm_setup.flag = RT_ALARM_MINUTE; alarm_setup.wktime.tm_sec = 0; alarm_10min = rt_alarm_create(alarm_10min_handle,&alarm_setup); } void create_alarm_app() { rt_err_t err1,err2,err3; create_10_min_alarm(); create_timing_alarm(); create_zerotime_alarm(); err1 = rt_alarm_start(alarm_10min); err2 = rt_alarm_start(alarm_timing); err3 = rt_alarm_start(alarm_zerotime); if((err1 != RT_EOK) || (err2 != RT_EOK)|| (err3 != RT_EOK)){ LOG_E("ALARM start failed,%d-%d-%d",err1,err2,err3); }else{ LOG_D("start Alarm"); } } ``` 希望程序员们能够提供如何修改的方法。
查看更多
3
个回答
默认排序
按发布时间排序
crystal266
2023-11-03
嵌入式
参考一下这篇文章 https://club.rt-thread.org/ask/article/79d84bfce8d71c4b.html
见微知著
2024-01-17
这家伙很懒,什么也没写!
我也遇到此类问题。我设定了两个alarm。一个是1min一次校正时间。一个是1天重启一次。其中当校正时间恒定是2023 12 18 15 18 时。每分钟alarm 发生多次。 希望修复。 
li1151894668
2025-03-19
这家伙很懒,什么也没写!
使用日时间戳判断周期性分钟及小时闹钟是否过时来更新设定时间,溢出计算放到switch之后减少冗余代码。 ```c static rt_int32_t get_delta(rt_int32_t a, rt_int32_t b, rt_int32_t limit) { if (!a) { a = limit; } if (!b) { b = limit; } if (a > b) { return a - b; } return b - a; } static void alarm_wakeup(struct rt_alarm *alarm, struct tm *now) { rt_uint32_t sec_alarm, sec_now; rt_bool_t wakeup = RT_FALSE; time_t timestamp; sec_alarm = alarm_mkdaysec(&alarm->wktime); sec_now = alarm_mkdaysec(now); if (alarm->flag & RT_ALARM_STATE_START) { switch (alarm->flag & 0xFF00) { case RT_ALARM_ONESHOT: { sec_alarm = timegm(&alarm->wktime); sec_now = timegm(now); if (((sec_now - sec_alarm) <= RT_ALARM_DELAY) && (sec_now >= sec_alarm)) { /* stop alarm */ alarm->flag &= ~RT_ALARM_STATE_START; alarm_set(alarm); wakeup = RT_TRUE; } } break; case RT_ALARM_SECOND: { alarm->wktime.tm_hour = now->tm_hour; alarm->wktime.tm_min = now->tm_min; alarm->wktime.tm_sec = now->tm_sec + 1; wakeup = RT_TRUE; } break; case RT_ALARM_MINUTE: { if (60 - 1 < get_delta(sec_alarm, sec_now, 24*60*60)) { alarm->wktime.tm_hour = now->tm_hour; alarm->wktime.tm_min = now->tm_min; } if (sec_alarm <= sec_now) { alarm->wktime.tm_min = now->tm_min + 1; } if (alarm->wktime.tm_sec == now->tm_sec) { wakeup = RT_TRUE; } } break; case RT_ALARM_HOUR: { if (60*60 - 1 < get_delta(sec_alarm, sec_now, 24*60*60)) { alarm->wktime.tm_hour = now->tm_hour; } if (sec_alarm <= sec_now) { alarm->wktime.tm_hour = now->tm_hour + 1; } if ((alarm->wktime.tm_min == now->tm_min) && (alarm->wktime.tm_sec == now->tm_sec)) { wakeup = RT_TRUE; } } break; case RT_ALARM_DAILY: { if (((sec_now - sec_alarm) <= RT_ALARM_DELAY) && (sec_now >= sec_alarm)) wakeup = RT_TRUE; } break; case RT_ALARM_WEEKLY: { /* alarm at wday */ if (alarm->wktime.tm_wday == now->tm_wday) { sec_alarm += alarm->wktime.tm_wday * 24 * 3600; sec_now += now->tm_wday * 24 * 3600; if (sec_now == sec_alarm) wakeup = RT_TRUE; } } break; case RT_ALARM_MONTHLY: { /* monthly someday generate alarm signals */ if (alarm->wktime.tm_mday == now->tm_mday) { if ((sec_now - sec_alarm) <= RT_ALARM_DELAY) wakeup = RT_TRUE; } } break; case RT_ALARM_YAERLY: { if ((alarm->wktime.tm_mday == now->tm_mday) && \ (alarm->wktime.tm_mon == now->tm_mon)) { if ((sec_now - sec_alarm) <= RT_ALARM_DELAY) wakeup = RT_TRUE; } } break; } if (alarm->wktime.tm_sec > 59) { alarm->wktime.tm_sec = 0; alarm->wktime.tm_min = alarm->wktime.tm_min + 1; } if (alarm->wktime.tm_min > 59) { alarm->wktime.tm_min = 0; alarm->wktime.tm_hour = alarm->wktime.tm_hour + 1; } if (alarm->wktime.tm_hour > 23) { alarm->wktime.tm_hour = 0; } if ((wakeup == RT_TRUE) && (alarm->callback != RT_NULL)) { timestamp = (time_t)0; get_timestamp(×tamp); alarm->callback(alarm, timestamp); } } } ```
撰写答案
登录
注册新账号
关注者
0
被浏览
529
关于作者
李宇鹏
这家伙很懒,什么也没写!
提问
1
回答
0
被采纳
0
关注TA
发私信
相关问题
1
带有alarm 的drv_rtc.c 如何下载
2
跪求RTC drv_rtc.c 最新带alarm文件
3
关于rtc_alarm的使用
4
请问有人知道rtc的alarm要如何调用吗
5
请问在stm32f103上如何使用rtt studio的alarm功能
6
rt thread studio 有关于stm32待机周期性唤醒的示例吗?
7
RTC ALARM中断,为什么没有执行闹钟中断回调函数?
8
如何实现RTC中的set_alarm 和 get_alarm 接口
9
开启Alarm设备 链接时出错
10
根据文档进行了alarm创建和启动,发现并没有跳到闹钟回调函数
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RTT串口查找函数使用过程中遇到的问题。
2
RT-Thread CI编译产物artifacts自动上传功能介绍
3
STM32G030移植RT-Thread
4
CubeMX & RT-Thread Studio 联合开发说明
5
RT-Thread项目助手v0.3 | Ubuntu与MacOS平台的RT-Thread Env
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
rt-smart
RTC
FAL
I2C_IIC
cubemx
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
GD32
定时器
ADC
flashDB
编译报错
socket
中断
rt_mq_消息队列_msg_queue
keil_MDK
Debug
SFUD
ulog
msh
C++_cpp
MicroPython
本月问答贡献
出出啊
1522
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
815
个答案
179
次被采纳
crystal266
555
个答案
162
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部