吃我一記咸魚突刺——使用板載RTC定時開機


前言

原創文章,轉載引用務必注明鏈接。水平有限,歡迎指正。
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 rtcsudo systemctl stop ntp命令可以證實。

附注

  • date命令僅更改系統時鍾;
  • timedatectl set-time 命令會同時影響硬件時鍾和系統時鍾 Via
  • ArchWiki上有更詳細的講解

如何訪問板載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任務后自動關機。

拓展閱讀

后記

試用了這么長時間,對Guitar的印象非常好,做工優秀,資料夠用,拓展潛力強:自定義底板可以增減模塊,當然目前對個人來說有點難。雖然現在沒有樹莓派那么流行,但是希望以后發展可以越來越好。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM