Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
PM电源管理
功耗调优
基于RT-Thread功耗调优与PM管理实战经验分享-调试篇
发布于 2020-10-17 14:06:42 浏览:2544
订阅该版
[tocm] [RT-Thread 电源管理与功耗调优系列 - 目录](https://club.rt-thread.org/ask/article/3419.html) [基础篇 概念,基础,理解什么是功耗](https://club.rt-thread.org/ask/article/2282.html) [调试篇 开始搭环境,动手调起来](https://club.rt-thread.org/ask/article/2283.html) [驱动篇 想要调功耗,代码也要有](https://club.rt-thread.org/ask/article/2284.html) [系统篇 如何利用rtos或PM框架,配合PMS线程,管理功耗](https://club.rt-thread.org/ask/article/2285.html) [实战篇 具体问题的实战思考与解决思路](https://club.rt-thread.org/ask/article/2286.html) [日志篇 功耗日志文件输出与解析](https://club.rt-thread.org/ask/article/2288.html) [收尾篇 高调做好功耗,低调掌握知识的回顾](https://club.rt-thread.org/ask/article/2289.html) [进阶:RT-Thread精通PM功耗调优 系列](https://club.rt-thread.org/ask/article/2296.html) [上手:产品功耗管理与调优经验分享 系列](https://club.rt-thread.org/ask/article/2707.html) [应用:PM组件应用与经验分享 系列](https://club.rt-thread.org/ask/article/292.html) ## 背景 * 上篇讲了一点功耗管理的概念,理解了功耗管理与优化原来有这么多的东西在里面,分分钟搞定的事情,越来越难做了。 * 一顿操作猛如虎,发现功耗数据依旧不能降低,代码还没写一句。 * 这里使用的是RT-Thread 操作系统,如果换用freertos等,可能会稍有不同。 * 这篇开始进入功耗调试正题。 ## 前言 * 老板问我如何降低功耗,我说关闭外设,处理引脚,配置唤醒中断,让MCU进入睡眠模式即可。后来我发现,问题没有想象中那样的简单。 * 如LCD屏这样的外设,每次上电、初始化、正常显示,大概需要100ms以上的时间。你能频繁的开关? * 进入睡眠模式时,不关闭所有的中断、不等业务处理完,中断异常唤醒后,一塌糊涂,各种无脑的assert死机,代码能上库? * 处理那些引脚?你自己直接改掉?让驱动的改,他们问你改成什么样,为什么改,不该可以吗?要改找领导去。你会怎么沟通与处理。 ## 板级准备 * 简单的对照硬件原理图,哪怕是pdf文档,对照MCU 参考手册或数据手册。要到手硬件调试板子。 * USB线与下载器,配置好编译环境,开始调起来。 * 在调试的过程中,我发现,制造、寻找与使用先进的工具,同样是解决功耗问题的最有效的办法。 * USB转串口、J-Link等下载线,神器【杜邦线】。 * 调试板焊接电池供电线,方便接外部稳压直流电源,优秀的硬件API接口【排针】、【焊盘】。 * 高精度【万用表】,如果有几十块的,我想测到数据精度与准确度会降低,会影响你的功耗调优判断。 * 稳压电源,一般电压可以手动调。模拟电池供电,建议3.8V输出就够了。 ## 环境搭建与调试 把当前的工程编译环境搞好,代码编译完下进去,看看功耗情况,几十毫安是有的,然后开始调试代码的编写。 ### GPIO引脚配置清单 * 各个GPIO配置情况,上下拉情况,每个引脚或一组引脚写两个函数:xxx_gpio_init xxx_gpio_deinit。 * xxx_gpio_deinit用于睡眠前的引脚处理,如改为模拟态。 * xxx_gpio_init 用于唤醒后的处理(最好与开机初始化时或睡眠前一致) ### 为什么处理引脚 * 超低功耗优化,10uA也是电流,蚊子腿都是肉,有些gpio会有一点漏电,并且处理起来很快,配置个寄存器而已,处理引脚多了,就降低了上百微安电流。 ### MCU电源模式 ``` none(不睡) idle(wfi) deepsleep(stop1/stop2) standby(待机、shutdown,特殊引脚唤醒并重启) ``` * 通过熟悉MCU hal库,或手动操作MCU寄存器,把各个模式的实现做成一个个函数。 ### 测试环境: * RT-Thread 调试神器【MSH cmd】 * 把各个函数,都改成msh 串口命令,若能正常执行,查看电流与功耗的变化情况。 * 做好电流数据与测试情况的笔记,用于指引下次调优的方向。 * 耗电较高的模块,调用驱动工程师写好的接口,HAL库接口,进行开关控制 * 可以编写电源打开与关闭接口,做成msh cmd 命令,方便操作并查看记录功耗变化数据。 ### 注意点: * msh串口本身,也会有功耗,如果整机功耗降低到1mA一下时,usb串口可能也会有漏电。 * j-link等下载工具,也会有部分漏电。 * 拆解完整机电流,可以简单组合功耗数据,得出一点思路。 * 接下来,看一下MCU 深睡眠或关机standby模式下,根据电流数据,估算出其他外设漏电情况,还有哪些需要特别处理的。 ### 清楚多线程的功耗管理。 * 是否需要发各种消息,是否要关闭或冻结各个线程,睡眠时是否关闭所有外设。PM组件是否靠谱,能否解决实际问题? * 经过项目实战,使用rt-thread PM组件越多,发现基于PM组件的功耗管理,并不复杂。而且【靠谱】够用。 ### 不断积累大量的底层驱动接口 * 指引驱动工程师或自己,去更改增加睡眠相关的处理接口了,有些想LCD、EMMC、PSRAM等外设,开关频繁会出问题,这些可以在睡眠前处理好。 * 一般深睡眠唤醒后,根据不同的唤醒中断源与业务场景,可能不需要把外设全部复原。 ### 了解业务 * 性能的提升,会对功耗产生较大的影响,因此,都与相关的项目管理人员沟通,找到折中的解决方案,毕竟功耗不是你想改,就能马上改。 ### 使用PM组件 * RT-Thread PM组件核心代码:rt_pm_request rt_pm_release。 * 变频的、pm_device notify的,可以忽略。 * 有了这两个接口,加上 pm_drv.c 电源模式的适配,在把自己积累的gpio 处理的引脚,放在deepsleep模式前后, PM就可以正常工作起来了。 ### 模式切换环境 * PM 组件,模式切换在idle线程执行。 * 部分刚接触PM组件的同学,可能发现这样不够主动。 * 万一其他业务一直工作,不能睡眠咋办? 为何不能另起线程,直接关闭? * 另起线程,直接关闭,说明,你能控制所有的业务或外设,如果你控制了所有的业务与外设,业务与外设就不会一直执行,模式在哪切换就没有区别!! * 这里的最大疑点就是线程设计有问题,无法退出,无法进入睡眠!!如果关闭了其他的业务与外设,进入idle只是几个tick的时间。 * 有了msh与pm接口,基本上,可以完成功耗管理了?我想,后面工作才是主线,这只是个愉快的开端。 ### 功耗LOG日志 * 日志打印本身也占用大量的功耗,其他业务也会打印周期性很多的LOG,如滑下TP,发现一堆调试LOG打印,GUI切换页面,也会有一堆的LOG,异步的LOG虽然不会严重影响业务操作流畅度,但干活了,总是会耗电的。 * 产品发布前,LOG的分级、无关LOG的屏蔽,需要考虑。 * 电池相关的功耗日志的分析,不分析日志,怎么知道半天下来、一天下来,功耗的变化情况。 * 直流电源再精确,数据都是实时的,如果配合周期性的日志,我想,很快就定位到问题的所在。 * PM 功耗日志处理完的样子 ``` 【软件版本】:None 【起始时间】:07-02 19:55:30.624 【结束时间】:07-02 20:45:51.479 【测试时长】:60分钟/1小时 【亮屏时长】:0分钟/0小时 【睡眠时长】:40.25分钟/0.67小时 【BT 时长】:0.0分钟/0.0小时 【BLE 时长】:50.35分钟/0.84小时 【GPS 时长】:0.0分钟/0.0小时 【运动时长】:0.0分钟/0.0小时 【唤醒次数】:0 【电量消耗】:3mAh 【平均功耗】:3.571mAh 【预估续航】:5.03天 ``` 有助于进一步补充、分析、优化。 ### 请求释放流程 * rt_pm_request,作用,请求不睡眠。 * 业务或线程的操作。 * 操作完成 * rt_pm_release,作用,允许睡眠。 * 因为电源模式在idle执行,所有不用担心业务因为睡眠被打断。 ### Tickless 是啥? * 可以这样认为,系统工作在轻睡眠模式,随时都可以被唤醒干活,干完活就马上睡下去。 * 如果一分钟睡眠唤醒切换1000次!!!这样能睡眠吗?对功耗有益处吗? * 如果睡眠前与唤醒后,做大量的处理,肯定切换时间很长。这样益处很小。 * 时间细分,如1ms,如果工作100us,睡眠900us,那么tickless下只有1/10 MCU正常的功耗, 收益较大。 * 运行,睡眠,类似于间歇性,PWM(脉宽调制,睡眠占空比大,越有收益!)控制。切换频繁,你也可以认为就是Tickless模式。 ### 额外知识点: * 知道3.8V 1mA与 1.8V 1mA的区别 * 知道了自己电路板功耗的组成 * 知道:功耗大头在哪里,方向在哪里 * 动手写了点不上库的测试代码。 * 后面再讲讲实际遇到的问题与解决思路。
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
张世争
学以致用
文章
131
回答
801
被采纳
173
关注TA
发私信
相关文章
1
STM32F103的低功耗
2
最近用rtthread系统下AD采样并低功耗,中断响应不及时
3
rt-thread低功耗休眠应用问题请教
4
关于RTT对低功耗的支持
5
RT-Thread怎么休眠实现低功耗。
6
RT-Thread V3.0支持的低功耗,OS会自行进入吗?
7
关于RTThread3.0低功耗休眠模式
8
RTT3.0的bsp包中哪些MCU自带低功耗定时器?
9
关于低功耗上次说针对L4出个BSP的,怎么迟迟不见呀
10
低功耗问题。
推荐文章
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
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部