完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
|
|
|
|
|
您的意思是溢出是有影响的,但是只要在溢出之前进行soft rtc 的更新就可以避免溢出带来的影响是吗(就像看门狗喂狗一样)?
|
|
|
|
|
|
对,溢出一次,不影响前后两次的计算结果,溢出两次计算结果就错了。
上面的时间好像说错了,应该是 49 天。 有符号数溢出的时间是 24.5 。无符号数溢出的时间是 49 天。 以上的时间是基于 tick per second 是1000 的时候,如果不是这个,按照比例算 |
|
|
|
|
|
嗯,实测了一下,确实有影响,那这样的话就意味着这个soft RTC没有办法完全独立工作了,还是需要定期从外部对其进行更新同步(无论是从网络端还是硬件RTC),soft rtc的本意是为了解决没有硬件RTC的困扰,这样看来,还是无法彻底解决这个困扰呀
|
|
|
|
|
|
|
|
|
|
|
|
没有睡眠,只是修改了RT_TICK_PER_SECOND 100000,扩大了100倍,理论计算0.49天就会溢出一次,所以昨天早上11点多设置的时间,一直运行到今天中午,我查了一下时间还是显示昨天的时间
应该是溢出过了,时间还是昨天的时间 |
|
|
|
|
|
|
|
|
|
|
|
这个是直接使用的soft RTC组件,我没有添加任何代码呀,从他的实现看基本上就没有考虑溢出机制
想着直接拿来用的 代码中init_tick 是在rtc设备注册时就固定了, 每次更新softrtc 时会修改init_time 而获取时间时就是根据这些信息计算出来的 |
|
|
|
|
|
这么说,init_time 的修改也不对,这里获取时间的公式也是错的
|
|
|
|
|
|
嗯,我也觉得怪怪的,估计是用这个组件的人比较少吧,之前我的做法是使用的软件定时器(1s)来作为时基,然后配合标准时间库函数来获取系统时间和设置系统时间,但是这样做就得占用一个定时器资源,而且其他的像ulog一样依赖soft rtc的组件就无法直接进行使用了。您知道有什么好的方法吗?
|
|
|
|
|
|
正常,使用任何第三方组件的时候都应该留个心。
可能用个定时器比较好,第一对内核修改少,第二耦合度低。昨天我想过在 systick 里加两句代码,单独计算这个 soft rtc 的 tick ,用 64 位整型值,不用担心溢出的问题。 用硬件定时器实现,和其它地方使用时间没冲突吧。也是一样的直接读取就行了 |
|
|
|
|
|
嗯,暂时还是用定时器时基+标准时间库来做吧
|
|
|
|
|
static rt_err_t soft_rtc_control(rt_device_t dev, int cmd, void *args) { time_t *t; struct tm time_temp; RT_ASSERT(dev != RT_NULL); memset(&time_temp, 0, sizeof(struct tm)); switch (cmd) { case RT_DEVICE_CTRL_RTC_GET_TIME: t = (time_t *) args; *t = init_time + (rt_tick_get() - init_tick) / RT_TICK_PER_SECOND; #if defined ( RT_USING_SOFT_RTC_USER ) if((rt_tick_get() - init_tick) > RT_TICK_PER_SECOND) { rt_uint32_t temp_time = (rt_tick_get() - init_tick); init_time += (rt_uint32_t)(temp_time / RT_TICK_PER_SECOND); init_tick += (rt_uint32_t)((temp_time / RT_TICK_PER_SECOND)*RT_TICK_PER_SECOND); } #endif break; case RT_DEVICE_CTRL_RTC_SET_TIME: { t = (time_t *) args; init_time = *t - (rt_tick_get() - init_tick) / RT_TICK_PER_SECOND; #ifdef RT_USING_ALARM soft_rtc_alarm_update(&wkalarm); #endif break; } #ifdef RT_USING_ALARM case RT_DEVICE_CTRL_RTC_GET_ALARM: *((struct rt_rtc_wkalarm *)args) = wkalarm; break; case RT_DEVICE_CTRL_RTC_SET_ALARM: wkalarm = *((struct rt_rtc_wkalarm *)args); soft_rtc_alarm_update(&wkalarm); break; #endif } return RT_EOK; } 这样可以在GET_TIME时候把累加时间移到init_time上,但是49天之内至少要GET_TIME一次。 |
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1033 浏览 0 评论
2877 浏览 0 评论
图腾柱PFC无法上升至400V,且电感电流为正弦波形,但是幅值极小
9386 浏览 0 评论
飞凌嵌入式ElfBoard-Vim编辑器之静态链接和动态链接
2898 浏览 0 评论
使用 LinkBoy 将程序导出为 C 语言代码并烧录至 Arduino ESP32 开发板
2302 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 07:01 , Processed in 2.124867 second(s), Total 98, Slave 79 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1123