Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread
RT-Thread一般讨论
PM组件
RT-Thread PM框架使用答疑 -- 01
发布于 2021-12-05 11:43:37 浏览:1926
订阅该版
[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 PM框架主要用于PM(电源管理)、功耗调优(降低功耗),组件默认【关闭】,如果需要使用需要手动开启 - 部分用户对【功耗管理】并不专业,更不清楚如何使用RT-Thread PM框架管理产品的功耗 - 部分用户对【PM框架】使用存在【二义性】,理解片面,影响使用的体现,实际产品中很难应用起来 ## 问题主线 - RT-Thread PM 框架的开启 - RT-Thread PM 框架的调试运行 - RT-Thread PM 框架的管理思想 - RT-Thread PM 框架的持续优化 ## PM框架文件 - 首先查看PM框架的实现文件的存放位置 ![2021-12-05_100908.png](https://oss-club.rt-thread.org/uploads/20211205/9a27c8f7c89f02af232696bb44c382ae.png.webp) ![2021-12-05_101301.png](https://oss-club.rt-thread.org/uploads/20211205/fe8e3be3ec384fcc078efb2c9de684c6.png) ![2021-12-05_101343.png](https://oss-club.rt-thread.org/uploads/20211205/7edf187bd1f1320cd1d69ac22515f222.png.webp) - RT-Thread PM框架,目前在RT-Thread【标准版】中实现,Nano版中暂无法使用(后期会适配) - PM 框架目前在BSP中适配了STM32L4平台,这个平台支持lptimer(低功耗定时器),可以使用PM框架的完整管理功能, 但这不代表PM框架只适用于这个平台,其他的BSP平台稍做适配,依旧可以使用PM框架 - 本次【实例】在【NUCLEO-L476RG】开发板上实现PM框架的适配,开发板MCU:STM32L476RGT6 ![2021-12-05_101747.png](https://oss-club.rt-thread.org/uploads/20211205/1be07d773fa50168bdeab55c549301d7.png.webp) ## 最小系统搭建 - 为了不影响默认RT-Thread源码架构,我把这个 【stm32l476-st-nucleo】单独重新复制出来做成独立的工程,用于PM框架功能验证。 ![2021-12-05_102339.png](https://oss-club.rt-thread.org/uploads/20211205/030068f676eeacf03db847576ff8a1f0.png.webp) - 注意只有STM32 BSP的project工程,没有STM32的libraries 与 RT-Thread 内核代码,无法使用。 - 把RT-Thread 内核代码与STM32 libraries 复制到新建的工程目录 ![2021-12-05_102850.png](https://oss-club.rt-thread.org/uploads/20211205/f8a111913996ba468d637f536ed570a4.png.webp) ![2021-12-05_103233.png](https://oss-club.rt-thread.org/uploads/20211205/5add669091c2eef8654b40a8b26ccbd8.png.webp) - 工程目录已经就绪。 ![2021-12-05_103556.png](https://oss-club.rt-thread.org/uploads/20211205/5d1f468935008b5c477fe06cae2d93ac.png) - 接下来修改构建文件与Kconfig路径,用于工程的正确构建 ![2021-12-05_103853.png](https://oss-club.rt-thread.org/uploads/20211205/e0cc41486f1b880b772bed2c2d64fe78.png.webp) ![2021-12-05_104149.png](https://oss-club.rt-thread.org/uploads/20211205/f49fd7be4fbc64a81adcac29e4e02a0c.png.webp) - 自此基于【NUCLEO-L476RG】最小RT-Thread 标准版工程搭建完成 ![2021-12-05_104727.png](https://oss-club.rt-thread.org/uploads/20211205/2e68abd4aa6d8717ce5321396e0af9a2.png.webp) ![2021-12-05_105135.png](https://oss-club.rt-thread.org/uploads/20211205/2fd3d17ca5c80f23c0915a7230c04f4d.png.webp) ## 开启PM框架 - 通过RT-Thread ENV工具: menuconfig开启(如果不懂ENV、menuconfig操作,抓紧先去【磨刀】) ```c .config - RT-Thread Configuration → RT-Thread Components →Device Drivers → [*] Using Power Management device drivers ``` ![2021-12-05_105505.png](https://oss-club.rt-thread.org/uploads/20211205/c05f4790092ec47f69727f49f52d1eed.png) ![2021-12-05_105532.png](https://oss-club.rt-thread.org/uploads/20211205/1f5f453aed1457f9f1e23579a9b78e3b.png) ![2021-12-05_105641.png](https://oss-club.rt-thread.org/uploads/20211205/ce88461290c441486bbaa146aff182e9.png) - 配置menuconfig后,需要重新构建工程:`scons --target=mdk5` ![2021-12-05_110201.png](https://oss-club.rt-thread.org/uploads/20211205/6d7dfea883f5a1f62253b773b9f003cb.png.webp) - 构建完工程,需要重新编译,并下载到开发板 ## PM框架的调试 - PM框架并不是一个【纯软件】玩具,它的运行,离不开【平台MCU电源模式】【系统时钟配置】【外设开关】【引脚配置】等 - PM框架,通过适配后,可以真实的自动管理系统的【睡眠】【唤醒】【电源运行模式】 - PM框架的几个主要的msh 串口命令使用如下: ```c pm_release - release power management mode pm_release_all - release power management mode count pm_request - request power management mode pm_module_releas - release module power mode pm_module_releas - release power management mode count pm_module_reques - request power management mode pm_module_delay - module request delay sleep pm_run - switch power management run mode pm_dump - dump power management status ``` - 【答疑点一】开机后的【睡眠模式】,默认是 【PM_SLEEP_MODE_NONE】,如果开启PM框架后,发现系统无法【深睡眠】,注意这个问题。 - 通过pm_dump,可以明显的发现有个【模块】请求了【PM_SLEEP_MODE_NONE 0】这个模式。 ![2021-12-05_111236.png](https://oss-club.rt-thread.org/uploads/20211205/c4c4db7ad81d9011770429b162ecb0e2.png) - 为何PM框架,上来就请求一个【不睡眠】,还不自动释放?原因注意是开机后,此时用户没有请求,如果马上睡眠, 系统可能无法正常的初始化。所以,开机时不睡眠的。 - 如果移除开机的【不睡眠】:用户在初始化完成后,手动调用: ![2021-12-05_112036.png](https://oss-club.rt-thread.org/uploads/20211205/2a75c5064151f4452033e79647a36597.png.webp) `rt_pm_module_release(PM_POWER_ID, PM_SLEEP_MODE_NONE);` - 【好像进入深睡眠了】,系统卡死,串口不能使用?是的,进入深睡眠,默认平台MCU如STM32,进入了STOP模式,串口外设已经不能使用了, - 接下来讨论如何手动请求某个模式 - 开机后不请求模式,释放PM框架的【不睡眠】后,默认就进入了【DEEP模式】,还咋玩? ![2021-12-05_112620.png](https://oss-club.rt-thread.org/uploads/20211205/2da7b0624c56c2330ff823dbefa88ef7.png) - 注意:`pm_request 1` 请求了【IDLE】模式后,如果不释放,就会一直运行这个模式 - 【睡眠模式】有优先级的,有多个电源模式请求,运行【高功耗的】模式。 - 手动释放这个请求的模式: `pm_request 0`,系统发现没有其他的请求,就默认进入深睡眠了 - 注意【引用计数】:多次请求,需要多次释放,如下:Idle 模式请求了 2次,需要释放2次,才能真正释放这个模式 - 也就是说,pm请求与释放,最好【成对出现】 ```c msh >pm_dump | Power Management Mode | Counter | Timer | +-----------------------+---------+-------+ | None Mode | 0 | 0 | | Idle Mode | 2 | 0 | | LightSleep Mode | 0 | 0 | | DeepSleep Mode | 0 | 1 | | Standby Mode | 0 | 0 | | Shutdown Mode | 0 | 0 | +-----------------------+---------+-------+ pm current sleep mode: Idle Mode pm current run mode: Normal Speed | module | busy | start time | timeout | +--------+------+------------+-----------+ +--------+------+------------+-----------+ ``` - 代码中如何请求与释放电源模式: ```c /* 传统接口 */ rt_pm_request(PM_SLEEP_MODE_IDLE); rt_pm_release(PM_SLEEP_MODE_IDLE); rt_pm_release_all(PM_SLEEP_MODE_IDLE); /* 带电源模块ID的方式请求与释放 */ rt_pm_module_request(PM_I2C_ID, PM_SLEEP_MODE_IDLE); rt_pm_module_release(PM_I2C_ID, PM_SLEEP_MODE_IDLE); rt_pm_module_release_all(PM_I2C_ID, PM_SLEEP_MODE_IDLE); ``` - PM框架,默认没有请求,就会进入默认的 【PM_SLEEP_MODE_DEEP】深睡眠模式,所以用户无须手动请求 【PM_SLEEP_MODE_DEEP】, 只需要请求与释放【轻睡眠】模式,如NONE、IDLE、LIGHT。 - 延迟睡眠的接口,请求一段时间的不睡眠,超时自动释放掉,类似于请求+延时+释放的操作,只是这个延时不是【原地等待】 ```c /* 请求一个100ms的不睡眠 */ rt_pm_module_delay_sleep(PM_LCD_ID, 100); ``` ## 小结 - RT-Thread PM框架的使用,需要实际上手的操作 - 本篇注意注重PM框架的环境的搭建、基础睡眠的操作。 ## 测试工程 - `https://gitee.com/zhangsz0516/nucleo_l476rg_pm.git`
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
张世争
学以致用
文章
131
回答
813
被采纳
177
关注TA
发私信
相关文章
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
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总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
7
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
4
次点赞
Ghost_Girls
1
篇文章
6
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部