当前位置: 首页 > news >正文

AliOS Things 电源管理框架使用说明

一、电源管理框架简介

电源管理框架的目的在于节约CPU的功耗。传统上,当操作系统处于空闲状态时,比如所有用户任务和系统任务处于阻塞状态,将执行idle task。idle task的通常做法是一个while(1)空循环,从汇编视角看是不断执行跳转指令,也就是说当操作系统空闲时,CPU将处于空转状态。使能电源管理框架后,当系统进入idle task后,将设置CPU进入低功耗状态,从而节省CPU的功耗。

96a5ec7cc6a37077316a02632ad479e7cf228220

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。


从测试结果可以看出,在对功耗敏感的系统上,比如依靠电池供电的系统,非常有必要使用电源管理框架,它可显著降低系统功耗,增加系统待机时间。


二、应用配置(为应用添加低功耗支持)

2.1 AliOS Things2.0之前版本

应用若要使用电源管理框架,需进行如下配置:

(1)应用目录的.mk文件中添加对电源管理模块的依赖,示例:

     GLOBAL_DEFINES += RHINO_CONFIG_CPU_PWR_MGMT=1

$(NAME)_COMPONENTS := rhino/pwrmgmt

(2)在应用初始化函数中(比如application_start(int argc, char *argv[]))调用电源管理模块初始化函数。

    cpu_pwrmgmt_init();

2.2 AliOS Things 2.0之后版本

AliOS Things 2.0之后的版本将由系统自动调用初始化函数,只需在app中添加对电源管理模块的依赖即可,示例:

$(NAME)_COMPONENTS := pwrmgmt

 

注:系统自动调用初始化函数的位置为kernel/init/aos_init.c文件aos_components_init函数中,调用代码为:

#ifdef AOS_COMP_PWRMGMT

    cpu_pwrmgmt_init();

#endif

三、示例应用(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


注:如果前后两次打印g_idle_count[0]没有增加,说明系统中有任务一直在运行导致idle任务没有运行。通常是串口采用轮询输入引起的,可修改为中断输入或去掉对CLI模块的依赖(应用.mk文件中$(NAME)_COMPONENTS行去掉CLI)。

 

开启低功耗时,当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状态设置函数

        

详细说明参见附件

相关文章:

  • python三级菜单实例(傻瓜版和进阶版)
  • linux之HTTP服务
  • 【原】戏说Java
  • WPF 获取鼠标屏幕位置、窗口位置、控件位置
  • 使用ABAP正则表达式解析HTML标签
  • 计算机英语学习笔记(六)
  • java多线程和长连接,三方转换通信的实践(1)——转换端程序
  • 【呆鸟译Py】这位老师的70个问题,100个数据分析师都想不全
  • 用Gmail做QQ邮件群发的一种方式
  • 机器人操作系统来到Windows
  • sublime text3
  • Spring Cloud 之 Consul 与 Consul 服务剔除
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 在ABAP里取得一个数据库表记录数的两种方法
  • 【Unity Shader】Shader基础
  • [译]CSS 居中(Center)方法大合集
  • FastReport在线报表设计器工作原理
  • JavaScript 一些 DOM 的知识点
  • leetcode-27. Remove Element
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • php面试题 汇集2
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • 规范化安全开发 KOA 手脚架
  • 技术:超级实用的电脑小技巧
  • 学习笔记TF060:图像语音结合,看图说话
  • - 转 Ext2.0 form使用实例
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 你对linux中grep命令知道多少?
  • C# - 为值类型重定义相等性
  • k8s使用glusterfs实现动态持久化存储
  • 说说我为什么看好Spring Cloud Alibaba
  • ​iOS安全加固方法及实现
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)计算机毕业设计大学生兼职系统
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (转)mysql使用Navicat 导出和导入数据库
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .a文件和.so文件
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 常见的偏门问题
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .net流程开发平台的一些难点(1)
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .NET中winform传递参数至Url并获得返回值或文件
  • .net中应用SQL缓存(实例使用)
  • :如何用SQL脚本保存存储过程返回的结果集
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @Valid和@NotNull字段校验使用
  • []常用AT命令解释()
  • [<死锁专题>]