低功耗休眠喚醒之三級環形架構
前言
無線通訊技術相關應用中,使用者體驗一直是使用者關係的重點。無線通訊距離近一點,通訊速度慢一點,這都不是致命的問題,在某些場合下是完全可以接受的,甚至 本身就是專案的技術需求;但是有一些設計缺陷卻會嚴重影響使用者體驗的,一旦大面積的出現,基本上可以判定為產品失敗了;總結起來,大家都無法忍受的問題主要是下述兩個 :
(1)通訊失敗或者資料傳輸錯誤
(2)電池消耗快,很快沒電
01
業內問題
在絕大部分使用者的心目中,無線通訊本身就不如有線通訊技術穩定,如果一款產品還經常傳輸失敗,試問使用者會對這款產品有信心嗎?
無線產品配合上電池供電,才能充分發揮無線技術可以隨意移動的優勢,因此很多的無線產品經常和低功耗或電池供電有非常緊密的聯絡;一旦這個產品電池消耗很快,那麼必然將是其便攜性,移動性大打折扣。
當然,在理論設計上產品的電池壽命肯定是非常長的,但是真正實現起來卻比較困難,很多的產品設計電池壽命有 5 年之久,但是現場執行不到一年,甚至幾個月就完全沒電了,這種問題的發作經常沒有任何規律,測試時間上又以年/月為單位,且呈現出偶發特性,定位起來極其困難,困擾了不少的無線通訊技術工程師,被認為是業界的重要難題之一。
02
技術難點
其實電池快速耗電和通訊不穩定說到底都是軟體設計,特別是軟體架構方面的設計問題;軟體架構上的不完整或混亂,導致射頻晶片的控制不準確甚至部分狀態失去控制才是問題的源頭。既然大家都認為功耗的管理是一個難題,那麼到底難在哪些環節呢?
(1) 產品的低功耗休眠喚醒設計,存在系統業務和應用層業務兩種:在系統層面講,主要有OTA無線升級、遠端診斷、遠端控制(無線I/O)等;在應用層中則是回撥機制、關閉埠上拉、檢測使用者按鍵、關閉工作指示燈等。系統層內容屬於整個產品的軀幹和骨架,通常需要交給經驗豐富的工程師負責,因為涉及精密的規則和龐大的演算法問題,需要較為強大的抽象能力和全面的視角。而應用層則是面向使用者的,體現在軟體部分則相對比較簡單。
(2) 系統存在多種喚醒源:如UART、GPIO、RTC、Timer等,這些喚醒源中斷方式和清除規則略有不同,但是進入和退出休眠需要遵循相同的路徑,因此其控制邏輯需要做一定的抽象化設計,具有一定的挑戰。
(3) 基於RTC定時器的後臺背景活動: 某些延遲操作,比如開啟一個 LED 指示燈,十秒之後關閉,此時如果處理器全速執行就為了執行這一功能,是不太經濟的;通常是設定一個狀態標誌,然後啟動RTC定時器,並將處理器切入休眠狀態,計時的時間到了之後會產生一個RTC中斷,處理器可以在這種中斷到達的時候關閉這個LED 指示燈。類似這些延遲操作,往往還會和其他的業務狀態交織在一起,控制邏輯需要精確設計,稍有不慎就會失去控制。
(4) 被未知的電磁波干擾,吵醒 , 誤喚醒等假喚醒行為:無線電波由於空間開放的特性,其喚醒動作往往伴隨著少量的模擬特性,偶爾會被一些未知的訊號給誤觸發,處理器被喚醒之後, 需要對喚醒後的實時引數做一些分析計算,對喚醒源進行甄別篩選,如果不是有效的喚醒,需要提前終止業務邏輯。
(5) 存在多種不同模式的睡眠深度的低功耗模式:處理器通常支援多種不同的睡眠 深度, 對應不同的功耗等級。不同睡眠模式下,處理器可以啟用的外設不一樣的,在喚醒之後,有些外設需要再次初始化之後才可以重新投入工作,只有深入瞭解處理器的工作特性,才能控制好處理器不同睡眠模式 的切換工作。
(6) 雙晶片模式(獨立的無線通訊模組)模式和單晶片模式(協議棧和應用層業務執行在一個晶片上),需要統一的程式設計介面。 如果維持兩套不同的程式設計介面,程式碼分支龐大不說,還很容易產生歧義,為後續的產品維護和架構升級帶來困難。
綜合以上難點,需要解決如此複雜的功耗控制要求,必須分而治之,採用分層的控制策略;行之有效的解決方案就是如下的內-中-外,三級環形架構。
03
WiMi-net 的三級環形架構
上圖是一個電子價籤的主程式框架。可以看出該程式主要分為三個主執行緒,分別是協議棧的主執行緒;低功耗休眠與喚醒的主執行緒與墨水屏應用業務的主執行緒。這三個主執行緒在同一個層級平行執行,具有相同的排程優先順序。
局放圖
我們將低功耗休眠與喚醒的主執行緒做區域性放大,如上所示。
圖中的三級環架構是休眠喚醒管理模組的核心,是整個休眠喚醒功能的區域性放大。如圖所示,由內環、中環、外環,三部分構成。因為考慮到在無線通訊中,各種事件的複雜程度及其處理方式,分為以上三環。最內部一環主管電磁波喚醒,中層環主管GPIO喚醒、RTC喚醒、UART喚醒,最外層環則啟動了整個協議棧以及業務層,面向使用者進行互動。
三級環的目的突出的是分層做事原則。在內環中只進行電磁波喚醒的工作,這裡主要有三部分,查詢中斷、分析中斷狀態、無線電波處理。當訊號到達這一環,會根據訊號型別分析是否進行無線電波的喚醒處理。
如果不是無線電波喚醒,則跳出該層,進入中環處理。這裡的訊號型別分析和處理是根據不同事件、不同時刻產生的耦合性而定的。
在中環,GPIO 喚醒是特定產品的喚醒模式;RTC 喚醒通常用於一些低優先順序的後臺任務,比如檢測是否漏電或者執行一些延遲 I/O 操作;UART 串列埠喚醒 則是針對使用者處理器。
外環則是面向使用者的層級,如需要啟動主程式韌體升級或者業務邏輯,比如墨水屏的重新整理螢幕顯示內容等,則程式會被全面喚醒,此時就在外環中進行。
環形架構的優勢
由外環、中環到內環,視覺效果方面是越來越小的,越來越縮放的。自然在功能性方面也是越來越小,越來越簡潔的過程。三級環從外到內,能做的 “ 事 ” 就越來越少,體現在軟體程式碼方面就是,程式碼更少,功能性更加單一,邏輯更加清晰,執行更穩定。從而更加節省功耗。
為什麼功耗更加節約?將電磁波喚醒獨立拆分,做成了獨立的單元結構,是出於這樣的考慮的。當訊號指令到達三級環,內環首先進行判定,是否需要電磁波喚醒,判定是,就進行電磁波喚醒;判定不是,則跳入中環選擇喚醒類別,內環進入休眠。
考慮到事件的複雜性、多樣性,需要從不同屬性、不同時間等多角度考量休眠喚醒的執行,通俗點說就是“跟我相關起來幹活,跟我無關繼續睡覺”,這樣的三級環設計針對性很強,在需要單一模式喚醒時,只需要調動少數軟體資源和內部耗能就可以完成,完成相關作業後繼續休眠,等待下一輪指令喚醒。從而這樣的三級環設計是一款更加節約功耗的方案。
回撥函式
// *****************************************************************************
// Design Notes:
// -----------------------------------------------------------------------------
char OnHostWakeup_Request( unsigned char iStatus, char iCause, char iReqAck )
{
unsigned char iRetVal;
// The callback status
switch ( iStatus )
{
case
WIMINET_SLEEP_CALL_INIT:
{
OnWakeupRequest_Init( iCause, iReqAck );
}
break
;
case
WIMINET_SLEEP_CALL_OPEN:
{
OnWakeupRequest_Open( iCause, iReqAck );
}
break
;
case
WIMINET_SLEEP_CALL_WORK:
{
OnWakeupRequest_Work( iCause, iReqAck );
}
break
;
case
WIMINET_SLEEP_CALL_STOP:
{
OnWakeupRequest_Stop( iCause, iReqAck );
}
break
;
default:
{
iRetVal = 0X00;
}
break
;
}
// The
return
status
return
iRetVal;
以上是一個 SoC 產品方案,回撥函式的標準樣本,通常需要實現“系統剛剛喚醒”,“已經完成初始化”,“執行使用者任務”,“即將進入休眠”等幾個重要的通知時刻:
系統剛剛喚醒 : 系統執行在三級環的內環,處理器剛剛被中斷喚醒,需要啟用系統層級別的外設,比如 SPI 匯流排等;
已經完成初始化: 系統已經切換至三級環的外環,控制權準備釋放給使用者程式,通常在此時初始化使用者任務;
執行使用者任務 : 系統執行在三級環的外環,此時協議棧程式也在同層級平行運作,使用者程式執行完了之後,需要釋放控制權給系統,通知系統進入睡眠模式
即將進入休眠 : 系統執行在三級環的中環,所有的資料都已經傳送完畢或者超時終止,即將重新進入睡眠模式,通知使用者關閉外設,執行任務的清理或者重置工作。
對於不太複雜的系統,通常僅僅需要實現上述四個通知的回撥函式即可,其餘的通知可以不做處理器;對於更加複雜的系統,可以根據需要實現其他更多的回撥通知。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70036155/viewspace-3005695/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- win10 休眠滑鼠喚醒怎麼設定_win10滑鼠休眠怎麼喚醒Win10
- win7休眠後不能喚醒怎麼辦_win7系統休眠後無法喚醒如何解決Win7
- win10怎麼禁止滑鼠喚醒 如何禁止滑鼠喚醒win10電腦休眠Win10
- 電腦休眠後無法喚醒怎麼辦?win10電腦休眠後無法喚醒的解決辦法Win10
- win10休眠模式怎麼喚醒 win10休眠怎麼開啟詳細教程Win10模式
- win10 恢復休眠方式滑鼠方法 win10 休眠滑鼠無法喚醒怎麼辦Win10
- win10計算機休眠後滑鼠不能喚醒瞭如何解決Win10計算機
- Qt監聽Windows鎖屏、解鎖、休眠、喚醒、登入、登出訊息QTWindows
- android保持服務不休眠(持續執行)以及喚醒螢幕的方法Android
- 虛假喚醒
- hp筆記本win10休眠後螢幕不能喚醒怎麼修復筆記Win10
- android 喚醒螢幕Android
- .NET 網路喚醒
- Arduino和低功耗微控制器機器學習 - 喚醒詞檢測模型訓練UI機器學習模型
- win10 滑鼠喚起開機怎麼設定 win10臺式電腦休眠後如何滑鼠鍵盤喚醒Win10
- 語音喚醒實現
- win10如何關閉滑鼠喚醒_win10關閉滑鼠喚醒方法Win10
- win10睡眠模式怎麼喚醒_win10睡眠按啥鍵喚醒Win10模式
- 六邊形架構架構
- HTML5如何喚醒APP?HTMLAPP
- 同步篇——事件等待與喚醒事件
- win10睡眠按什麼鍵喚醒_w10系統睡眠怎樣喚醒Win10
- win10如何關閉自動喚醒_win10關閉自動喚醒方法Win10
- win10怎麼禁用滑鼠喚醒_win10如何關閉滑鼠喚醒電腦Win10
- 單機是最好的架構之三鎖架構
- App相互喚醒的幾種方式APP
- 多執行緒——虛假喚醒執行緒
- h5喚醒APP小記H5APP
- USB裝置遠端喚醒RemoteWakeUpREM
- win10 關閉滑鼠喚醒睡眠方法 win10怎麼關閉滑鼠喚醒睡眠Win10
- 電腦休眠後黑屏無法喚醒怎麼辦 臺式電腦睡眠打不開了的解決方法
- 喚醒教育:轉機中把握先機
- 《天外世界》:跨過沒譜,喚醒希望
- Android 圖形架構簡介Android架構
- Win10網路喚醒功能如何開啟 win10網路喚醒功能怎麼開啟Win10
- 關於wake on lan遠端喚醒主機的問題,長時間關機無法遠端喚醒
- win10系統休眠喚醒後出現藍屏錯誤程式碼0x000001c7的解決方法Win10
- 如何在微信裡一鍵喚醒appAPP