最近做无线网络在系统多次休眠唤醒后是否正常的测试,但每次休眠后都需要手动点击键盘来唤醒系统,显而易见的这种方法需要人来值守,很不放便。
此时便想是否有做自动唤醒的程序,毕竟这种需求也挺正常的,应该有人已经做过了。因此就开始查找自动唤醒的方法,果然就发现了 rtcwake
这个程序,这个程序是让系统进入休眠模式并在指定的时间后唤醒。立刻便觉得这个程序很神奇,然后就去看它的源码来找出它的实现方式,这边发现了本文的主题 RTC
子系统。
RTC
子系统
RTC
子系统在目录 /sys/class/rtc/
下,会根据设备创建对应的目录,需要在内核中开启支持,配置如下:
CONFIG_HPET_EMULATE_RTC=y
CONFIG_PM_TRACE_RTC=y
CONFIG_RTC_LIB=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_HCTOSYS=y
CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
# CONFIG_RTC_DEBUG is not set
# RTC interfaces
CONFIG_RTC_INTF_SYSFS=y
CONFIG_RTC_INTF_PROC=y
... (略)
debian/ubuntu
的系统可以在 /boot/config-$(uname -r)
查看内核的编译选项,archlinux
可以在 /proc/config.gz
查看。
RTC
目录下的文件含义可以在 sysfs-class-rtc 中查看。
wakealarm
RTC
目录中的 wakealarm
文件内容便是下次触发唤醒时间的时间,默认这个文件是没有值的。文件的内容需要设置是时间的秒数,可以向下面这样设置:
# echo $(date +%s --date 'now + 1 minutes') > /sys/class/rtc/rtc0/wakealarm
这就表示在 1 minute
后触发唤醒事件。
所以做休眠唤醒测试的流程如下:
- 设置下次唤醒的时间到
wakealarm
中 - 休眠系统
- 被
wakealarm
唤醒后,开始做一些期望的事情(如检查系统是否正常),然后继续执行步骤1
,就这样一直循环,直至满足条件后终止
FAQ
- 设置无效?
首先检查内涵是否开启了rtc
支持,如果支持就检查时间标准是否是UTC
,localtime
时间标准时设置wakealarm
是不生效的,内容一直是空的。通过timedatectl
命令可以查询和设置时间标准。