前言
原创文章,转载引用务必注明链接。水平有限,欢迎指正。
2016年3月30日 Lemuntu(Base On Jessie) 3.10.37
原载于Lemaker论坛。汇总于此。
看ATC2603C手册的时候发现其内置硬件时钟(Real Time Clock,RTC),并且提供alarm功能,用于把设备从低功耗状态唤醒。
7.2.5章节提到,PMU提供4种省电模式,且支持多种唤醒方式,包括按键、GPIO、RTC ALARM、红外线IR等,其中RTC ALARM可在S4深度睡眠状态唤醒设备。
查看原理图可知RTC只能从锂电池和DC电源取电,所以实用性有所下降。后期考虑加一个供电模块。
以前用树莓派的时候有想过如何自动开机,比如无线智能开关、红外控制器等,但是一直没有很好的方案。现在在Guitar上可以非常方便地实现。
不知道大家有没有看过《行尸走肉》,第一季里面瑞克给摩根一个无线电对讲机,告诉他每日几时会打开无线电通讯,而其他时候都处于省电状态。类似的,我们在野外给Guitar使用供电时,为了降低功耗,不需要让Guitar随时都处于开机状态。
好的,我们回到RTC上来。
什么是RTC
系统用两个时钟保存时间:硬件时钟和系统时钟。
硬件时钟(即实时时钟 RTC 或 CMOS 时钟)
仅能保存年、月、日、时、分、秒这些时间数值,无法保存时间标准(UTC 或 localtime)和是否使用夏令时调节。大家还记得1秒的定义吗:1967年召开的国际计量大会上,一秒钟被定义为铯原子的9192631770次固有微波振荡次数所需的时间,这一标准沿用至今。而硬件时钟原理类似,也是通过石英晶体振荡器频率工作,详情可以去看实时时钟的百度百科。特性是系统关闭后,只要供电就会持续计时。
系统时钟(即软件时间)
与硬件时间分别维护,保存了时间、时区和夏令时设置。Linux 内核保存为自 UTC 时间 1970 年1月1日 00:00:00 经过的秒数。初始系统时钟是从硬件时间计算得来,计算时会考虑/etc/adjtime的设置。由于这个文件的存在,即使硬件时钟设置的为UTC时间,系统也能显示正确的本地时间。系统启动之后,系统时钟与硬件时钟独立运行。
系统时间管理流程
- 启动时根据硬件时钟设置系统时间
- 运行时通过 NTP 守护进程联网校正时间
- 关机时根据系统时间设置硬件时间。
通过dmesg |grep rtc和sudo systemctl stop ntp命令可以证实。
附注
如何访问板载RTC
通过hwclock软件:需要管理员(root)权限
常用命令:
sudo hwclock -r
读取当前硬件时钟sudo hwclock -s
以系统时钟为准写入硬件时钟sudo hwclock -w
以硬件时钟为准设置系统时钟sudo hwclock -u
设置硬件时钟为UTC标准
时间表示有两个标准:localtime 和 UTC(Coordinated Universal Time) 。UTC 是与时区无关的全球时间标准。尽管概念上有差别,UTC 和 GMT (格林威治时间) 是一样的。localtime 标准则依赖于当前时区。
这里建议将硬件时钟设置为UTC标准,以避免使用localtime时可能引起的麻烦和bug。前文已经讲过,系统读取硬件时钟后会根据/etc/adjtime调整(+8h)。
通过用户空间访问RTC
设备地址在/dev/rtcX X为编号
cat /proc/driver/rtc
可以看到RTC时钟信息,仅记录时间数值。如图所示
在/sys/class/rtc/rtcX
目录下,可以访问控制RTC参数:
详情访问这里
如何使用板载RTC自动从低功耗状态唤醒
linux提供了一个工具rtcwake,可以设置系统延时、定时从低功耗状态唤醒。
因为RTC的特点是即使系统不运行,也能继续计时。而需要在系统运行时计时的应用就没必要用RTC了。
低功耗状态
我们首先来看看Guitar支持哪几种低功耗状态:
TigerBoard的:
RPi2因为没有PMU,所以不支持低功耗状态:
- freeze:Suspend-To-Idle,纯软件实现,冻结进程+挂起设备+使处理器空闲,Kernel 3.9引入
- standby:Power-On Suspend,唤醒速度快,CPU在电
- mem:Suspend-to-RAM,仅内存在电,其他设备处于低功耗状态
- disk:Suspend-to-disk,也就是常说的休眠状态,将内存内容保存到磁盘。
耗电依次递减。详细解释可以看这里
我们可以直接使用参数使设备进入相应的状态,例如:
echo freeze > /sys/power/state
将会使系统进入freeze状态
如何唤醒请参考PMU手册,然而一般我都是直接插拔电源:-D
使用rtcwake唤醒设备
例1:延迟指定时间后唤醒
sudo rtcwake -m mem -s 20 -v
意思是进入mem状态并于20秒后唤醒,-v会获得更多信息
例2:在指定时间唤醒
sudo rtcwake -m mem -t `date -d 05:00 +%s`
意思是进入mem状态并于本地时间5:00唤醒(05:00和5:00效果一样,注意date命令的%s参数)。因为前文我们设置RTC使用UTC标准,而硬件时钟仅仅记录时间数值,所以系统通过-a参数来读取/etc/adjtime来调整时间,不过这是默认参数,可以不写。
上面讲了几种低功耗状态,此外rtcwake还支持以下参数:
- off:Poweroff,也就是关机
- no:Don't suspend,啥都不干,仅仅设置RTC Alarm时间
- on:Don't suspend,但是会读取RTC时间,等待RTC Alarm。主要用于调试。
- diable:禁用之前设置的RTC Alarm
- show:显示RTC Alarm信息
注意:在Guitar上,进入disk状态不正常,串口线带回家了,无法得知发生了什么,以后会补充。更多信息请通过man rtcwake命令查看
各种省电模式可通过dmesg命令查看具体发生了什么。
简单应用
此时我们就可以编写shell脚本,通过Cron计划任务让系统于指定时间添加rtcwake任务后自动关机。
拓展阅读
- freeze state:http://kernelnewbies.org/Linux_3.9#head-1e61261c0d231fce38d9c738540ac01e59648d80
- Automatically sleep and wake-up at specific times:http://askubuntu.com/questions/61708/automatically-sleep-and-wake-up-at-specific-times
- Linux 下利用rtcwake唤醒设备:http://blog.csdn.net/bulreed/article/details/19907691
后记
试用了这么长时间,对Guitar的印象非常好,做工优秀,资料够用,拓展潜力强:自定义底板可以增减模块,当然目前对个人来说有点难。虽然现在没有树莓派那么流行,但是希望以后发展可以越来越好。