1. 程式人生 > >AliOS Things 電源管理框架使用說明

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狀態設定函式

原文連結