AliOS Things 电源管理框架使用说明
一、電源管理框架簡介
電源管理框架的目的在于節約CPU的功耗。傳統上,當操作系統處于空閑狀態時,比如所有用戶任務和系統任務處于阻塞狀態,將執行idle task。idle task的通常做法是一個while(1)空循環,從匯編視角看是不斷執行跳轉指令,也就是說當操作系統空閑時,CPU將處于空轉狀態。使能電源管理框架后,當系統進入idle task后,將設置CPU進入低功耗狀態,從而節省CPU的功耗。
?
AliOS Things電源管理框架具有如下特點:
(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();
?
三、示例應用(app/example/pwr_test)
目前AliOS Things 2.0版本在developerkit和PCA10040平臺上對電源管理框架進行了適配,可用如下命令編譯示例應用并下載到develoerkit上運行:
aos make pwr_test@developerkit
aos upload pwr_test@developerkit
示例應用創建了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狀態設置函數 |
? ? ? ??
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的AliOS Things 电源管理框架使用说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 奥运转播加速上云,北京冬奥组委测试阿里云
- 下一篇: 阿里高级技术专家:研发效能的追求永无止境