灭屏情况下,飞行模式+静音模式+插耳,播放音乐,电流异常
1. 功耗现象
灭屏情况下,飞行模式+静音模式+插耳,播放音乐,电流异常
1.1测试数据
飞行模式+静音模式+插耳机 | 原生音乐播放器 |
DriverOnly | 32.5mA |
User版本 | 45mA |
1.2 电流波形现象
上述看怀疑 CPU 未进入 Deep idle 导致?
2. Deep idle 分析
Deep idle是一种CPU进入空闲后的状态,也就是在idle进程执行的。简单地说,MTK会在CPU进入空闲的情况下,再去关闭一些不必要的power domain,以达到最省电的目的。通俗的理解就是CPU的空闲状态,即 CPU0 单核运行,其他CPUX不运行,即处于关核状态
2.1 是否能进 Deep idle
1.方法 :写入一个不释放的锁,查看待机电流和kernel日志
·adb shell "echo test > /sys/power/wake_lock"
2.测试现象 测试机的电流还是比参考机大,即无法进入 Deep idle 状态
2.2 分析 deep idle被block的情况
1.看CNT(dpidle,rgidle),如果dpidle一点没变,说明从没进过deep idle;有变化也不说明一定是正常的,要看变化的量。
2.再看 dpidle_block_cnt 这一组数值的增加值,一般可以看到每个blocker的计数都有所增加,关键要看哪个是主要的:
·如果主要是cpu,说明系统不只一颗cpu在运行,检查cpu loading;
·如果主要是tmr,说明有任务繁忙,调度比较频繁,检查cpu loading;
·如果主要是clk,那么看dpidle_block_mask,bit不为0的clk id就是嫌疑对象。
以下是 Kernel 日志 灭屏时间段为 13:39:57 ~ 14:17:31
<6>[ 187.391041] (0)[180:wdtk-0][thread:180][RT:187391030060] 2019-06-06 13:39:59.895301 UTC;android time 2019-06-06 13:39:59.895301
<4>[ 187.524049] -(0)[0:swapper/0][Power/swap]CNT(dpidle,rgidle): [0] = (0,252679), [1] = (0,43671), [2] = (0,36229), [3] = (0,30398),
<4>[ 187.524068] -(0)[0:swapper/0][Power/swap]dpidle_block_cnt: [by_cpu] = 43533, [by_clk] = 17433, [by_tmr] = 0, [by_oth] = 0, [by_vtg] = 0, [by_frm] = 0,
<4>[ 187.524089] -(0)[0:swapper/0][Power/swap]dpidle_block_mask: 0x00000000, 0x00000000, 0x00000000, 0x00000011, 0x00000000, 0x00000010, 0x00002c03, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
根据上述日志发现导致无法进入Deep idle原因是 dpidle_block_cnt: [by_cpu] 为主,CPU loading大导致,如何查cpu loading具体情况?这里的CPU loading信息我们需要抓Ftrace文件进行分析
3. Ftrace分析
抓取日志见其他博客的 Ftrace 抓取方法,可以使用本文的sh脚本
#!/system/bin/sh
rm -rf /sdcard/idle_log/*
mkdir /sdcard/idle_log;
i=0;
while [ i -le 3000 ];
do
## cat $i;
echo $i >> /sdcard/idle_log/dpidle_state.txt;
echo $i >> /sdcard/idle_log/soidle_state.txt;
echo $i >> /sdcard/idle_log/idle_state.txt;
echo $i >> /sdcard/idle_log/cpu.txt;
i=$(($i+1));
## print looping counts
cat /sys/kernel/debug/cpuidle/dpidle_state >>/sdcard/idle_log/dpidle_state.txt;
cat /sys/kernel/debug/cpuidle/soidle_state >>/sdcard/idle_log/soidle_state.txt;
cat /sys/kernel/debug/cpuidle/idle_state >> /sdcard/idle_log/idle_state.txt;
## cat /sys/devices/system/cpu/cpufreq/all_time_in_state >> /sdcard/idle_log/cpu.txt
echo cpu_online_info >> /sdcard/idle_log/cpu.txt;
cat /sys/devices/system/cpu/online >> /sdcard/idle_log/cpu.txt;
## cat /sys/devices/system/cpu/cpu0/online >> /sdcard/idle_log/cpu.txt;
cat /sys/devices/system/cpu/cpu1/online >> /sdcard/idle_log/cpu.txt;
cat /sys/devices/system/cpu/cpu2/online >> /sdcard/idle_log/cpu.txt;
cat /sys/devices/system/cpu/cpu3/online >> /sdcard/idle_log/cpu.txt;
##busybox usleep 2000000;
sleep 2;
done
查看 Ftrace 分析结果,在Google浏览器输入下述调试网址,即可加载Ftrace文件
·chrome://tracing/
综合上述不管是使用Ftrace 还是使用脚本工具,都检查到灭屏情况,功耗异常的机器无法进入Deep idle状态,且cpu loading 大,且2个CPU运行,由于这个问题是4.28号的修改导致,即内部改出来的问题,是否CPU策略变更?
4. CPU的实验测试
做一个 Disable CPU hotplug 实验
adb shell "echo 0 > /proc/hps/enabled"
关闭 CPU hotplug,机器电流恢复正常了
5. 查看CPU相关修改记录
·git diff e7a305d576a44042c8fa4f36c57b1a4e9ebdf515 961171a11857523e1296b6ba572cbbc55582d73e
发现确实存在 CPU_hotplug 相关的修改记录
user@chuanghangren-Lenovo-Product:/local/sda/local_sourcecode/xxx/kernel-4.9-lc$ git diff e7a305d576a44042c8fa4f36c57b1a4e9ebdf515 961171a11857523e1296b6ba572cbbc55582d73e
diff --git a/drivers/misc/mediatek/include/mt-plat/mt_hotplug_strategy_internal.h b/drivers/misc/mediatek/include/mt-plat/mt_hotplug_strategy_internal.h
index b250cca..bad7a20 100755
--- a/drivers/misc/mediatek/include/mt-plat/mt_hotplug_strategy_internal.h
+++ b/drivers/misc/mediatek/include/mt-plat/mt_hotplug_strategy_internal.h
@@ -22,7 +22,7 @@
/* CONFIG - compile time */
#define HPS_TASK_PRIORITY (MAX_RT_PRIO - 3)
-#define HPS_TIMER_INTERVAL_MS 100
+#define HPS_TIMER_INTERVAL_MS 20
#define HPS_PERIODICAL_BY_WAIT_QUEUE (1)
#define HPS_PERIODICAL_BY_TIMER (2)
@@ -35,17 +35,17 @@
#define CPU_DMIPS_BIG_LITTLE_DIFF 70
/* CONFIG - runtime (execute time interval : 100 ms */
-#define DEF_CPU_UP_THRESHOLD 95
-#define DEF_CPU_UP_TIMES 2
-#define DEF_CPU_DOWN_THRESHOLD 85
-#define DEF_CPU_DOWN_TIMES 8
+#define DEF_CPU_UP_THRESHOLD 75
+#define DEF_CPU_UP_TIMES 1
+#define DEF_CPU_DOWN_THRESHOLD 30
+#define DEF_CPU_DOWN_TIMES 50
#define DEF_TLP_TIMES 1
#define EN_CPU_INPUT_BOOST 1
#define DEF_CPU_INPUT_BOOST_CPU_NUM 2
#define EN_CPU_RUSH_BOOST 1
-#define DEF_CPU_RUSH_BOOST_THRESHOLD 98
+#define DEF_CPU_RUSH_BOOST_THRESHOLD 80
#define DEF_CPU_RUSH_BOOST_TIMES 1
#define EN_HPS_LOG 1
查看具体修改原因:产品需要dEQP-EGL CTS测试,就必须合入此patch,不然会导致CTS fail。这块芯片比较久了,性能不太好,需要尽量的去开核 确保perfect
CPU hotplug 的patch会导致dEQP-EGL
CTS fail。具体如下:
[Initial condition]
1. [gms]_alps-mp-p0.mp user
2. Select stay awake
3. Lock screen select none
4. connect WiFi AP
[Steps]
1. run cts in windows
2. input “run cts -m CtsDeqpTestCases -t dEQP-EGL.functional.get_frame_timestamps*"
[Actual Result]
dEQP-EGL.functional.get_frame_timestamps#rgb565_depth_no_stencil fail === with config {glformat=rgba8888d24s8ms0,rotation=unspecified,surfacetype=window,required=true} === Fail: Buffer displayed before rendering completed.!(1292160634076 < -2)
dEQP-EGL.functional.get_frame_timestamps#rgb565_depth_stencil fail === with config {glformat=rgba8888d24s8ms0,rotation=unspecified,surfacetype=window,required=true} === Fail: Composite to present latency is more than 3 vsyncs.!(57889844 < 49642383)
dEQP-EGL.functional.get_frame_timestamps#rgb888_depth_stencil fail === with config {glformat=rgba8888d24s8ms0,rotation=unspecified,surfacetype=window,required=true} === Fail: Composite to present latency is more than 3 vsyncs.!(57920384 < 49665288)
dEQP-EGL.functional.get_frame_timestamps#rgb888_no_depth_no_stencil fail === with config {glformat=rgba8888d24s8ms0,rotation=unspecified,surfacetype=window,required=true} === Fail: Buffer displayed before rendering completed.!(1305430597769 < -2)
dEQP-EGL.functional.get_frame_timestamps#rgba8888_depth_no_stencil fail === with config {glformat=rgba8888d24s8ms0,rotation=unspecified,surfacetype=window,required=true} === Fail: Composite to present latency is more than 3 vsyncs.!(57916176 < 49662132)
dEQP-EGL.functional.get_frame_timestamps#rgba8888_depth_stencil fail === with config {glformat=rgba8888d24s8ms0,rotation=unspecified,surfacetype=window,required=true} === Fail: Composite to present latency is more than 3 vsyncs.!(57910252 < 49657689)
dEQP-EGL.functional.get_frame_timestamps#rgba8888_no_depth_no_stencil fail === with config {glformat=rgba8888d24s8ms0,rotation=unspecified,surfacetype=window,required=true} === Fail: Composite to present latency is more than 3 vsyncs.!(57910944 < 49658208)
基于产品需求定义,需确保 CTS 测试通过,故维持该 CPU hotplug 修改策略。
相关文章:

灭屏情况下,飞行模式+静音模式+插耳,播放音乐,电流异常
1. 功耗现象 灭屏情况下,飞行模式静音模式插耳,播放音乐,电流异常 1.1测试数据 飞行模式静音模式插耳机 原生音乐播放器 DriverOnly 32.5mA User版本 45mA 1.2 电流波形现象 上述看怀疑 CPU 未进入 Deep idle 导致? 2. …...

面向微服务的Spring Cloud Gateway的集成解决方案:用户登录认证与访问控制
🎯导读:本文档详细描述了一个基于Spring Cloud Gateway的微服务网关及Admin服务的实现。网关通过定义路由规则,利用负载均衡将请求转发至不同的后端服务,并集成了Token验证过滤器以确保API的安全访问,同时支持白名单路…...

Jmeter负载测试如何找到最大并发用户数?
在性能测试中,当我们接到项目任务时,很多时候我们是不知道待测接口能支持多少并发用户数的。此时,需要我们先做负载测试,通过逐步加压,来找到最大并发用户数。那么当我们找到一个区间,怎么找到具体的值呢&a…...

Spark-Streaming集成Kafka
Spark Streaming集成Kafka是生产上最多的方式,其中集成Kafka 0.10是较为简单的,即:Kafka分区和Spark分区之间是1:1的对应关系,以及对偏移量和元数据的访问。与高版本的Kafka Consumer API 集成时做了一些调整,下面我们…...

移植 OLLVM 到 Android NDK,Android Studio 中使用 OLLVM
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ OLLVM、LLVM 与 Android NDK 在 Android NDK 中,LLVM/Clang 是默认的编译器。自 Android NDK r18 开始,Google 弃用了 GCC,…...

DAY36|动态规划Part04|LeetCode:1049. 最后一块石头的重量 II、494. 目标和、474.一和零
目录 LeetCode:1049. 最后一块石头的重量 II 基本思路 C代码 LeetCode:494. 目标和 基本思路 C代码 LeetCode:474.一和零 基本思路 C代码 LeetCode:1049. 最后一块石头的重量 II 力扣代码链接 文字讲解:LeetCode:1049. 最后一块石头的重量 II 视频讲解&…...

Linux 下SVN新手操作手册
下面来介绍Linux 下 SVN操作方法: 1、SVN的安装 Centos 7 安装Subversion sudo yum -y install subversion Ubuntu 安装Subversion sudo apt-get install subversion 自定义安装,官方地址:https://subversion.apache.org/ 2、SVN的使用…...

障碍感知 | 基于KD树的障碍物快速处理(附案例分析与ROS C++仿真)
目录 1 障碍处理与KD树2 KD树核心原理2.1 KD树的构造2.2 KD树的查找 3 仿真实现3.1 KD树基本算法3.2 ROS C仿真 1 障碍处理与KD树 在机器人感知系统中,传感器(如激光雷达、摄像头等)会采集周围的环境数据,例如代价地图、八叉树地…...

Electron -- Electron Fiddle(一)
Electron Fiddle 是一个由 Electron 团队开发的开源工具,它允许开发者快速创建、运行和调试 Electron 应用。这个工具提供了一个简洁的界面,使用户无需配置复杂的开发环境,就能快速体验和学习 Electron。强烈建议将其安装为学习工具。 学习它…...

详解Redis的常用命令
目录 KEYS 语法 EXISTS 语法 DEL 语法 EXPIRE 语法 TTL 语法 TYPE 语法 Redis数据结构和内部编码 KEYS 返回所有满⾜样式(pattern)的 key。 返回值:匹配 pattern 的所有 key。 语法 ⽀持如下统配样式: h?llo matches hello, ha…...

elasticache备份
Elasticsearch 本地快照操作流程 配置快照存储路径 在 elasticsearch.yml 文件中配置以下字段以指定数据、日志和快照存储路径:path:data: /data/data # 数据存储路径logs: /data/log # 日志存储路径repo: /data/snapshot # 快照存储路径确保路径 /dat…...

Tomcat负载均衡全解析
一、Java项目概述 (一)Java语言特点 Java是一种计算机应用语言,在开发王者和管理系统等方面有着广泛的应用。它具有开源免费的特性,不过需要注意的是,虽然语言本身开源,但是后期开发工具可能会收取费用。 (二)、JDK和Tomcat 1,JDK:作为Java语言的开发工具,在Linu…...

[LeetCode-Python版] 定长滑动窗口8——2461. 长度为 K 子数组中的最大和
题目 给你一个整数数组 nums 和一个整数 k 。请你从 nums 中满足下述条件的全部子数组中找出最大子数组和: 子数组的长度是 k,且 子数组中的所有元素 各不相同 。 返回满足题面要求的最大子数组和。如果不存在子数组满足这些条件,返回 0 。…...

springboot476基于vue篮球联盟管理系统(论文+源码)_kaic
摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统篮球联盟管理系统信息管理难度大,容错率低&am…...

预约参观华为基地,见证行业巅峰
✨ 大家好呀!今天要跟大家分享一个超酷的体验,关于华为的参观学习之旅!🚀 华为成立于1987年,位于深圳,是全球领先的信息与通信技术(ICT)解决方案供应商哦!他们专注于科技…...

【Flink-scala】DataSet编程模型介绍及数据源
DataStream 学习 1.DataStream编程模型总结 文章目录 DataStream 学习介绍一、DataSet编程模型二、数据源1.文件类数据源2.集合类数据源3.通用类数据源4第三方文件系统 介绍 Flink把批处理看成是一个流处理的特例,因此可以在底层统一的流处理引擎上,同…...

Odrive源码分析(四) 位置爬坡算法
Odrive中自带一个简单的梯形速度爬坡算法,本文分析下这部分代码。 代码如下: #include <cmath> #include "odrive_main.h" #include "utils.hpp"// A sign function where input 0 has positive sign (not 0) float sign_ha…...

[Unity Shader][图形渲染] Shader数学基础11 - 复合变换详解
在图形学与Shader编程中,复合变换是将平移、旋转和缩放等基本几何变换组合在一起,从而实现更复杂的物体变换效果。复合变换的本质是通过矩阵的串联操作,依次应用多个变换。 本文将介绍复合变换的数学原理、矩阵计算方法及注意事项,并结合实际编程中的实现细节帮助你掌握其…...

使用Python实现智能家居控制系统:开启智慧生活的钥匙
友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…...

使用 HTML5 Canvas 实现动态蜈蚣动画
使用 HTML5 Canvas 实现动态蜈蚣动画 1. 项目概述 我们将通过 HTML 和 JavaScript 创建一个动态蜈蚣。蜈蚣由多个节段组成,每个节段看起来像一个小圆形,并且每个节段上都附带有“脚”。蜈蚣的头部会在画布上随机移动。 完整代码在底部!&…...

计算机视觉目标检测——DETR(End-to-End Object Detection with Transformers)
计算机视觉目标检测——DETR(End-to-End Object Detection with Transformers) 文章目录 计算机视觉目标检测——DETR(End-to-End Object Detection with Transformers)摘要Abstract一、DETR算法1. 摘要(Abstract)2. 引言(Introduction&#…...

uniapp .gitignore
打开HBuilderX,在项目根目录下新建文件 .gitignore复制下面内容 #忽略unpackge目录下除了res目录的所有目录 unpackage/* !unpackage/res/#忽略.hbuilderx目录 .hbuilderx# 忽略node_modules目录下的所有文件 node_modules/# 忽略锁文件 package-lock.json yarn.l…...

JavaWeb Servlet的反射优化、Dispatcher优化、视图(重定向)优化、方法参数值获取优化
目录 1. 背景2. 实现2.1 pom.xml2.2 FruitController.java2.3 DispatcherServlet.java2.4 applicationContext.xml 3. 测试 1. 背景 前面我们做了Servlet的一个案例。但是存在很多问题,现在我们要做优化,优化的步骤如下: 每个Fruit请求都需…...

备忘一个FDBatchMove数据转存的问题
使用FDBatchMove的SQL导入excel表到sql表,设置条件时一头雾水,函数不遵守sql的规则。 比如替换字段的TAB键值为空,replace(字段名,char(9),)竟然提示错误,百思不得其解。 试遍了几乎所有的函数,竟然是chr(9)。 这个…...

CEF127 编译指南 MacOS 篇 - 编译 CEF(六)
1. 引言 经过前面的准备工作,我们已经完成了所有必要的环境配置。本文将详细介绍如何在 macOS 系统上编译 CEF127。通过正确的编译命令和参数配置,我们将完成 CEF 的构建工作,最终生成可用的二进制文件。 2. 编译前准备 2.1 确认环境变量 …...

【更新】LLM Interview
课程链接:BV1o217YeELo 文章目录 LLM基础相关1. LLMs概述2. 大语言模型尺寸3. LLMs的优势与劣势4. 常见的大模型分类5. 目前主流的LLMs开源模型体系有哪些(Prefix Decoder,Causal Decoder,Encoder-Decoder的区别是什么)…...

Django 视图中使用 Redis 缓存优化查询性能
在 Web 应用程序开发中,查询数据库是一个常见的操作,但如果查询过于频繁或耗时,就会影响应用程序的性能。为了解决这个问题,我们可以使用缓存技术,将查询结果暂时存储在内存中,从而减少对数据库的访问。本文将介绍如何在 Django 视图中使用 Redis 缓存来优化查询性能。 © …...

正则表达式解析与功能说明
正则表达式解析与功能说明 表达式说明 String regex "\\#\\{TOASRTRINNG\\((.*?)((.*?))\\)(\\})";该正则表达式的作用是匹配形如 #{TOASRTRINNG(...)} 的字符串格式。以下是正则表达式的详细解析: 拆解与解析 1. \\# 匹配:# 字符。说明…...

STUN服务器实现NAT穿透
NAT穿透的问题 在现代网络环境中,大多数设备都位于NAT(网络地址转换)设备后面。这给点对点(P2P)通信带来了挑战,因为NAT会阻止外部网络直接访问内部设备。STUN(Session Traversal Utilities for NAT)服务器就是为了解决这个问题而设计的。 STUN是什么?…...

音视频入门基础:MPEG2-TS专题(19)——FFmpeg源码中,解析TS流中的PES流的实现
一、引言 FFmpeg源码在解析完PMT表后,会得到该节目包含的视频和音频信息,从而找到音视频流。TS流的音视频流包含在PES流中。FFmpeg源码通过调用函数指针tss->u.pes_filter.pes_cb指向的回调函数解析PES流的PES packet: /* handle one TS…...