Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
PM组件
RT-Thread
RT-Thread PM组件2.0更新版 - 使用指南
发布于 2022-01-15 23:26:06 浏览:2125
订阅该版
[tocm] [RT-Thread 电源管理与功耗调优系列 - 目录](https://club.rt-thread.org/ask/article/3419.html) [RT-Thread PM组件2.0更新版 -- 使用指南](https://club.rt-thread.org/ask/article/3323.html) [RT-Thread PM组件2.0更新版 -- 介绍](https://club.rt-thread.org/ask/article/3244.html) [RT-Thread PM框架使用答疑 -- 01](https://club.rt-thread.org/ask/article/3198.html) [RT-Thread PM框架使用答疑 -- 02](https://club.rt-thread.org/ask/article/3201.html) [RT-Thread PM2.0 应用 -- 平台适配篇](https://club.rt-thread.org/ask/article/2517.html) [RT-Thread IDLE线程栈过小引起的调试异常](https://club.rt-thread.org/ask/article/292.html) [RT-Thread 使能PM组件](https://club.rt-thread.org/ask/article/2287.html) [实践:RT-Thread PM管理实战 系列](https://club.rt-thread.org/ask/article/2282.html) [进阶:RT-Thread精通PM功耗调优 系列](https://club.rt-thread.org/ask/article/2296.html) [上手:产品功耗管理与调优经验分享 系列](https://club.rt-thread.org/ask/article/2707.html) ## 前言 - 本篇主要对RT-Thread PM2.0(2021更新版)做个使用指南,介绍PM管理的新API的使用 - PM管理(电源管理、功耗管理)是如今穿戴类产品比较关心的产品卖点 - 前面的几篇文章,或多或少提过电源管理其实管理的是硬件与业务 - 用户尽量不要在PM框架上消耗时间,把重心用于功耗调优上 ## 使用指南 - 开启PM框架,新的版本增加了几个API ![2022-01-15_224323.png](https://oss-club.rt-thread.org/uploads/20220115/15326f80f0151b2edfc87bdfa91f818e.png) - API 介绍如下,具体可以查看 `pm.h`文件 ```c /* sleep : request or release */ void rt_pm_sleep_request(rt_uint16_t module_id, rt_uint8_t mode); /* 请求某个电源模式 */ void rt_pm_sleep_release(rt_uint16_t module_id, rt_uint8_t mode); /* 释放请求的电源模式 */ void rt_pm_sleep_none_request(rt_uint16_t module_id); /* 请求不睡眠:none模式 */ void rt_pm_sleep_none_release(rt_uint16_t module_id); /* 释放:none模式 */ void rt_pm_sleep_idle_request(rt_uint16_t module_id); /* 请求不睡眠:idle模式 */ void rt_pm_sleep_idle_release(rt_uint16_t module_id); /* 释放:idle模式 */ void rt_pm_sleep_light_request(rt_uint16_t module_id); /* 请求不睡眠:light模式 */ void rt_pm_sleep_light_release(rt_uint16_t module_id); /* 释放:light模式 */ ``` - 新增的几个睡眠(sleep)相关的API,请求与释放(request、release)是模块独立的,不带引用计数,也就是可以多次请求,但是一次释放就可以释放掉请求的电源模式,可以重复释放。 - 这里推荐使用【用户自定义的PM模块】,也就是用户自己新建一个`pm_cfg.h`文件,放在自己的平台工程里 > pm_cfg.h 文件用于定义项目本身使用的模块ID,如按键、LCD、TP等等,可以与设备相关,可以与业务相关,也就是PM模块化,当然也可以使用pm.h中默认的(如果满足需求)。 ```c #ifndef __PM_CFG_H__ #define __PM_CFG_H__ enum pm_module_id { PM_NONE_ID = 0, PM_POWER_ID, PM_BOARD_ID, PM_MODULE_MAX_ID, /* enum must! */ }; #endif ``` - 平台适配,[【PM组件】RT-Thread PM2.0 应用 -- 平台适配篇](https://club.rt-thread.org/ask/article/2517.html) ## 使用示例 ```c void key0_irq_callback(void *parameter) { static uint8_t key0_status = 0x00; LOG_D("[key0_irq]\n"); key0_status ^= 0x01; if(key0_status == 0x00) rt_pm_sleep_idle_release(PM_BOARD_ID); else rt_pm_sleep_idle_request(PM_BOARD_ID); } ``` ## PM调试 - 原有的PM相关的shell命令不变 - 新增PM shell命令: `pm_sleep_dump` ```c msh >pm_sleep_dump +-------------+--------------+ | Sleep Mode | Request List | +-------------+--------------+ | Mode[0] : 0 | 0x00000000 | | Mode[1] : 0 | 0x00000004 | | Mode[2] : 0 | 0x00000000 | | Mode[3] : 0 | 0x00000000 | | Mode[4] : 0 | 0x00000000 | +-------------+--------------+ ``` - 每个模块占用一位,Mode[0] 为各个睡眠模式 ```c PM_SLEEP_MODE_NONE = 0, PM_SLEEP_MODE_IDLE, PM_SLEEP_MODE_LIGHT, PM_SLEEP_MODE_DEEP, PM_SLEEP_MODE_STANDBY, PM_SLEEP_MODE_SHUTDOWN, ``` - 如果请求了一个 `rt_pm_sleep_idle_request(PM_BOARD_ID)`,这里的 `PM_BOARD_ID`为 2,IDLE模式,所以 ` | Mode[1] : 0 | 0x00000004 |`,这里的4,其实是 `1<<2`,ID从0 开始 ## 低功耗定时器 - `rt-thread\components\drivers\pm\lptimer.c` - `rt-thread\components\drivers\include\drivers\lptimer.h` - 作用:默认深睡眠(DEEPSLEEP)时,只允许 lptimer.c 定义的定时器唤醒工作,其他普通的系统定时器深睡眠下不唤醒,用于优化深睡眠模式下的功耗(减少唤醒)。 - 定义lptimer的 API如下:详细查看 `lptimer.h` ```c struct rt_lptimer { struct rt_timer timer; rt_list_t list; void *parameter; /**< timeout function's parameter */ void (*timeout_func)(void *parameter); /**< timeout function */ }; typedef struct rt_lptimer *rt_lptimer_t; void rt_lptimer_init(rt_lptimer_t timer, const char *name, void (*timeout)(void *parameter), void *parameter, rt_tick_t time, rt_uint8_t flag); rt_err_t rt_lptimer_detach(rt_lptimer_t timer); #ifdef RT_USING_HEAP rt_lptimer_t rt_lptimer_create(const char *name, void (*timeout)(void *parameter), void *parameter, rt_tick_t time, rt_uint8_t flag); rt_err_t rt_lptimer_delete(rt_lptimer_t timer); #endif rt_err_t rt_lptimer_start(rt_lptimer_t timer); rt_err_t rt_lptimer_stop(rt_lptimer_t timer); rt_err_t rt_lptimer_control(rt_lptimer_t timer, int cmd, void *arg); rt_tick_t rt_lptimer_next_timeout_tick(void); ``` - 目前只支持定义静态的timer,后期会增加动态创建lptimer的API -【lptimer注意事项】 >如果是一次性的定时器,需要在定时器回调中,手动调用: `rt_lptimer_stop`,因为目前的实现机制是【套壳系统定时器rt_timer】,后期会修复此问题 >lptimer定义的timer,运行在:整个电源模式,包括深睡眠,为【全天候】定时器 ## 不使用lptimer - 如果用户想让所有的系统定时器timer,都可以在【深睡眠下】唤醒工作,方法如下 > 无须定义lptimer > 重写【weak】函数 `pm_timer_next_timeout_tick`,让系统的所以定时器都可以【全天候】工作 ```c rt_tick_t pm_timer_next_timeout_tick(rt_uint8_t mode) { return rt_timer_next_timeout_tick(); } ``` - 这个 `pm_timer_next_timeout_tick`为一个[weak]函数,默认定义如下: ```c RT_WEAK rt_tick_t pm_timer_next_timeout_tick(rt_uint8_t mode) { switch (mode) { case PM_SLEEP_MODE_LIGHT: return rt_timer_next_timeout_tick(); /* 系统定时器 */ case PM_SLEEP_MODE_DEEP: case PM_SLEEP_MODE_STANDBY: return rt_lptimer_next_timeout_tick(); /* 低功耗定时器 */ } return RT_TICK_MAX; } ``` - 也就是PM框架,是通过获取系统定时器或lptimer定义的定时器的超时时间,设置到【真实的】lptimer上的。 ## 小结 - PM管理牵涉的内容较多,需要不断的优化,积累相关的优化经验,PM框架起到方便管理的目的 - 新的PM框架的PM模块化的改进,lptimer的定义与使用,会让PM管理起来更方便,调试更有效率(容易定位问题) - PM框架后期会持续完善,包括完善【变频】【延时睡眠】等机制,让用户使用起来更简单、高效
5
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
张世争
学以致用
文章
131
回答
782
被采纳
168
关注TA
发私信
相关文章
1
RT-THREAD在STM32H747平台上移植lwip
2
正点原子miniSTM32开发板读写sdcard
3
反馈rtt串口驱动对低功耗串口lpuart1不兼容的问题
4
Keil MDK 移植 RT-Thread Nano
5
RT1061/1052 带 RTT + LWIP和LPSPI,有什么坑要注意吗?
6
RT thread HID 如何收发数据
7
求一份基于RTT系统封装好的STM32F1系列的FLASH操作程序
8
RT-Thread修改项目名称之后不能下载
9
rt-studio编译c++
10
有木有移植rt-thread(nano)到riscv 32位MCU上
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
国产MCU移植系列教程汇总,欢迎查看!
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
文件系统
DMA
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
ESP8266
I2C_IIC
ota在线升级
WIZnet_W5500
UART
flash
packages_软件包
cubemx
PWM
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
中断
flashDB
socket
Debug
GD32
编译报错
msh
keil_MDK
rt_mq_消息队列_msg_queue
C++_cpp
at_device
MicroPython
ulog
本月问答贡献
rv666
7
个答案
2
次被采纳
踩姑娘的小蘑菇
5
个答案
2
次被采纳
张世争
8
个答案
1
次被采纳
用户名由3_15位
7
个答案
1
次被采纳
zchong
6
个答案
1
次被采纳
本月文章贡献
Licy
3
篇文章
1
次点赞
rtt_dmx
1
篇文章
5
次点赞
jaffer
1
篇文章
5
次点赞
flytianya2010
1
篇文章
2
次点赞
BRICK PORTER
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部