如何快速调试RTC? 原创 精华
1、RTC介绍
RTC是Real Time Clock的简称,它在硬件电路上单独供电,当系统关机时,CPU和其他外部硬件设备全部掉电,但是RTC仍然继续工作。这样就可以继续给设备提供精准的时钟,并提供报警功能和计时器功能。
2、如何查询系统时间和硬件时间
1)查询系统时间
2)查看RTC硬件时间:hwclock -r 显示RTC时间(读取RTC时间显示)
3) 设置系统时间,硬件时间hwclock -r 显示RTC时间(读取RTC时间显示)hwclock -w 设置RTC时间(将系统时间传递给RTC驱动,设置RTC的驱动时间)hwclock -s 设置系统时间(将RTC时间读取出来设置给系统时间)
3、如何查看RTC设备节点及文件
1)RTC设备节点
2)proc/driver/rtc:获取RTC的相关信息
4、内核中如何开启RTC,并设置时间同步
在linux系统上,从用户空间正确管理RTC需要关注两个内核选项:CONFIG_RTC_HCTOSYSCONFIG_RTC_HCTOSYS_DEVICE要使用CONFIG_RTC_HCTOSYS应在内核构建过程中包含代码文件drivers/rtc/hctosys.c,它在启动和恢复时从RTC设置系统时间。一旦启用此选项,就将使用从指定RTC设备读取的值设置系统时间。RTC设备应该在CONFIG_RTC_HCTOSYS_DEVICE中指定:
5、RTC关键结构体说明
6、RTC框图
7、RTC适配问题总结
问题1:/dev/rtc未生成,无法获取硬件时间
问题分析:启动日志报错no valid clock/calendar values available
[ 1.179936] rk808-rtc rk808-rtc: registered as rtc0[ 1.186459] rtc-hym8563 5-0051: no valid clock/calendar values available[ 1.186675] rtc-hym8563 5-0051: registered as rtc1[ 1.187698] rtc-hym8563 5-0051: no valid clock/calendar values available[ 1.187723] rtc-hym8563 5-0051: hctosys: unable to read the hardware clock
从log分析,rtc1时钟值无效,可能为人为写入了无效值,或者初始化时写入了无效值;解决方案:
1)在dts中添加init_date项,当hym8563_probe的时候,检测到系统如果未设置时间,则给时钟芯片一个默认值(init_date 设置的值);
2)通过命令设置硬件时钟;
hwclock -w
验证结果:通过日志查看显示
问题2:将rtc1设置为硬件时钟后,连接网络进行NTP时间同步,查看rtc1时钟未同步,实际同步的是rtc0硬件时钟
问题分析:怀疑连接网络后,网络时间同步模块在将同步后的系统时间写入硬件时钟时,写入到了/dev/rtc0,而非实际使用的/dev/rtc1;经排查网络时间同步后设置硬件时钟代码所在位置为:/base/miscservices/time/services/time_manager/src/time_service.cpp加入LOG打印信息如下,证实问题所在就是写入到了/dev/rtc0,而非实际使用的/dev/rtc1;
解决方案:修改代码set_rtc_time函数中,设备节点由/dev/rtc0修改为/dev/rtc,此时/dev/rtc软连接的是实际使用的硬件时钟/dev/rtc1,而非固定为/dev/rtc0。
修改后发现NTP时钟同步仍然失败,加log打印后发现,set_rtc_time中open设备节点失败
查看设备节点发现,新增的rtc1用户组为root,因此用户程序无权限打开,需将用户组修改为system
在设备初始化代码中增加修改rtc1用户组:
修改后查看rtc1用户组:
用户程序可正常打开:
验证结果:结果符合预期,连接网络后系统时间,硬件时钟均自动同步为网络时间
//设置系统和硬件时间为非当前时间
连接网络后,同步网络时间,系统时间和硬件时钟均自动同步
总结:
本文介绍了OpenHarmony中外置RTC调试和使用方法,以及RTC在操作系统中的作用,为后续NTP时间同步提供支持。
很实用的RTC教程,前排学习
精准的时钟对很多应用都必不可少
操作方法和问题已经解决方法都讲到了,点赞
一般板子都会有RTC专用的后备电池吗
感谢整理,先收藏了