前言
原創文章,轉載引用務必注明鏈接。水平有限,歡迎指正。
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的印象非常好,做工優秀,資料夠用,拓展潛力強:自定義底板可以增減模塊,當然目前對個人來說有點難。雖然現在沒有樹莓派那么流行,但是希望以后發展可以越來越好。
