AliOS Things 電源管理框架使用說明
摘要: AliOS Things電源管理框架使用介紹,主要針對物聯網裝置低功耗需求。
一、電源管理框架簡介
電源管理框架的目的在於節約CPU的功耗。傳統上,當作業系統處於空閒狀態時,比如所有使用者任務和系統任務處於阻塞狀態,將執行idle task。idle task的通常做法是一個while(1)空迴圈,從彙編視角看是不斷執行跳轉指令,也就是說當作業系統空閒時,CPU將處於空轉狀態。使能電源管理框架後,當系統進入idle task後,將設定CPU進入低功耗狀態,從而節省CPU的功耗。
(1)應用配置電源管理框架並新增初始化程式碼後,整個框架的執行對應用透明,使用者無需為了支援電源管理框架而修改應用程式碼;
(2)支援多級低功耗狀態;
在某些MCU上,根據不同的節電程度和喚醒時間分為多級睡眠,電源管理框架提供了對該特性的支援,在進入低功耗狀態時將根據睡眠時間和節電程度選擇最佳睡眠等級。
(3)支援tickless機制
當MCU決定進入低功耗狀態時,將關閉系統tick中斷,並在醒來的時候恢復系統tick中斷並補償睡眠過程中丟失的tick數。這種策略通過減少系統時鐘中斷來最大程度降低系統空閒時的功耗。
(4)支援精簡的低功耗模式
當MCU進入低功耗後,不關閉系統tick中斷,系統tick也能喚醒系統。它的優點是實現簡單,但當系統長時間空閒時,由於系統時鐘頻繁喚醒系統,不利於節能。
在某基於nrf52832 MCU的開發板上測試電源管理框架的執行效果如下:
在普通執行模式下nrf52832 MCU的平均執行電流在4mA左右,在新增電源管理模組後MCU的電流測試如下表所示:
測試項 |
平均電流 |
說明 |
低功耗狀態 |
2.06uA |
|
BLE廣播態功耗(開啟低功耗模組,廣播intervel 100ms) |
120uA |
電壓3v,傳送負載21位元組,TX功率0dBm。 |
BLE廣播態功耗(開啟低功耗模組,廣播intervel 1000ms) |
14.7uA |
電壓3v,傳送負載21位元組,TX功率0dBm。 |
BLE廣播態功耗(開啟低功耗模組,廣播intervel 2000ms) |
8.1uA |
電壓3v,傳送負載21位元組,TX功率0dBm。 |
從測試結果可以看出,在對功耗敏感的系統上,比如依靠電池供電的系統,非常有必要使用電源管理框架,它可顯著降低系統功耗,增加系統待機時間。
二、應用配置(為應用新增低功耗支援)
應用若要使用電源管理框架,需進行如下配置:
(1)應用目錄的.mk檔案中新增對電源管理模組的依賴,示例:
GLOBAL_DEFINES += RHINO_CONFIG_CPU_PWR_MGMT=1
$(NAME)_COMPONENTS := rhino/pwrmgmt
(2)在應用初始化函式中(比如application_start(int argc, char *argv[]))呼叫電源管理模組初始化函式。
cpu_pwrmgmt_init();
目前AliOS Things 2.0版本在developerkit和PCA10040平臺上對電源管理框架進行了適配,可用如下命令編譯示例應用並下載到develoerkit上執行:
aos make [email protected]
aos upload [email protected]
示例應用建立了2個任務demo1和demo2。demo1的主要邏輯是一個while迴圈:count1增1,同時列印count1和g_idle_count[0]的值,然後睡眠1秒。demo2的主要邏輯也是一個while迴圈:count2增1,同時列印count2的值,然後睡眠2秒。
其中g_idle_count[0]是一個全域性變數,idle任務在執行時會累加該值。
若沒有開啟低功耗模組,那麼當demo1和demo2處於睡眠狀態時,idle任務持續執行,g_idle_count[0]不斷增加。輸出示例如下:
count1 = 0, idle = 0
count2 = 0
count1 = 1, idle = 2347298
count1 = 2, idle = 4693421
count2 = 1
count1 = 3, idle = 7036926
count1 = 4, idle = 9383049
count2 = 2
count1 = 5, idle = 11726554
count1 = 6, idle = 14072465
開啟低功耗時,當demo1和demo2處於睡眠狀態時,idle任務執行g_idle_count[0]增1後,呼叫cpu_pwr_down()進入低功耗狀態。因此係統每次進入空閒狀態,g_idle_count[0]只增加1。輸出示例如下:
count1 = 0, idle = 0
count2 = 0
count1 = 1, idle = 1
count2 = 1
count1 = 2, idle = 3
count1 = 3, idle = 4
count2 = 2
count1 = 4, idle = 6
count1 = 5, idle = 7
說明:如果條件允許,直接測試功耗,比如測試MCU的電流,效果更直觀。
四、電源管理框架的適配
由於電源管理框架的執行依賴於硬體能力,因此在適配時首先要分析目標硬體是否有能力支援,然後要基於硬體能力為電源管理框架提供相關驅動。
4.1 硬體要求
要想支援電源管理框架,目標MCU需要支援如下特性:
(1)至少支援一種低功耗模式。在該低功耗模式下,RAM和暫存器的值能夠被維持。
(2)在低功耗模式下,存在可用的定時器,且該定時器能喚醒系統。在tickless機制下,該定時器用於計算低功耗時間,以補償系統時鐘。
4.2 適配介面
為了支援電源管理模組需完成如下介面適配:
適配介面 |
功能說明 |
board_cpu_pwr_init |
初始化CPU的電源管理能力,比如註冊CPU電源狀態設定函式,註冊CPU電源管理能力,註冊喚醒延遲時間,註冊喚醒/計時定時器。 |
cpu_cstate_set_t |
設定CPU的低功耗狀態 |
systick_suspend |
掛起系統時鐘,系統時鐘在低功耗狀態下停止執行 |
systick_resume |
恢復系統時鐘 |
one_shot_timer_t |
低功耗下執行的喚醒/計時定時器。在低功耗下的計時,用於退出低功耗狀態時補償系統時鐘。 |
注:可參考developerkit和PCA10040平臺上的適配示例(pwrmgmt_hal目錄)。
在適配過程中使用者可以呼叫如下介面:
可用介面 |
功能概述 |
cpu_pwr_node_init_static |
初始化CPU節點 |
cpu_pwr_node_record |
註冊CPU節點 |
cpu_pwr_c_state_capability_set |
設定CPU支援的低功耗模式 |
cpu_pwr_c_state_latency_save |
設定某個指定低功耗狀態的喚醒延遲時間 |
tickless_one_shot_timer_save |
註冊支援tickless機制的定時器 |
cpu_pwr_c_method_set |
註冊CPU狀態設定函式 |