在MTK芯片上如何控制CPU的核数和频率-MTK PerfService

一句话:PerfService就是用来调整CPU/GPU资源的。对于老的API,可以更简单地讲就是调CPU核数和CPU频率的。

简介

kernel中实现了两个driver,一个负责控制开关CPU的核数,叫做hot-plug驱动,另一个负责调整CPU的频率,叫做DVFS驱动。 
kernel中的driver会根据系统的负载情况下,自动调整使用几个CPU和调整CPU频率。如果负载高了,提高频率,或者多开几个核,或者开大核。如果负载降下去了,就可以关大核,关核,降频。

虽然现在的自动调频和调核的策略已经定义了很多,也在不断地完善,但是有两个问题:一是总有覆盖不到的情况,或者干脆就是互相矛盾的需求导致策略冲突。二是自动调度都是后知后觉的,只有发现负载上来了或者降下去了,才来做负载调节,需要一定的时间。这样,要么是效率不够,要么是功耗无谓地消耗掉。

PerfService就是一个在用户空间来主动调节系统能力的服务。

调用PerfService

步骤

  • 动态加载libperfservicenative.so
  • 注册用户场景PerfServiceNative_userReg/PerfServiceNative_userRegBigLittle/PerfServiceNative_userRegScn
  • 激活用户场景PerfServiceNative_userEnable
  • 执行用户场景
  • 反激活用户场景PerfServiceNative_userDisable
  • 退出进程之前反注册PerfServiceNative_userUnreg/PerfServiceNative_userUnregScn

API的步骤

API也可以调节GPU,但是采用的方式要复杂一些,就不再像老API一样直接指定核和频率了,需要定义配置

  • PerfServiceNative_userRegScn:没有参数,直接注册就好
  • PerfServiceNative_userRegScnConfig:用这个函数去真正指定配置
  • PerfServiceNative_userEnable/PerfServiceNative_userEnableTimeout:跟老API没有区别
  • PerfServiceNative_userDisable:还是老的API
  • PerfServiceNative_userUnregScn:反注册

API开发指南

获取系统能力

int  PerfServiceNative_userGetCapability(int cmd);

参数: 
* cmd: 请参见下面的枚举值:

enum {
    CMD_GET_CPU_FREQ_LEVEL_COUNT        = 0,
    CMD_GET_CPU_FREQ_LITTLE_LEVEL_COUNT = 1,
    CMD_GET_CPU_FREQ_BIG_LEVEL_COUNT    =2,
    CMD_GET_GPU_FREQ_LEVEL_COUNT        =3,
    CMD_GET_MEM_FREQ_LEVEL_COUNT        =4,
};
  • CMD_GET_CPU_FREQ_LEVEL_COUNT:获取CPU频率级别
  • CMD_GET_CPU_FREQ_LITTLE_LEVEL_COUNT:获取小核CPU频率级别
  • CMD_GET_CPU_FREQ_BIG_LEVEL_COUNT:获取大核CPU频率级别
  • CMD_GET_GPU_FREQ_LEVEL_COUNT:获取GPU频率级别
  • CMD_GET_MEM_FREQ_LEVEL_COUNT:获取内存频率级别

注册

因为新的API还需要指定配置,所以注册获取handle就不需要参数了。

原型:

int  PerfServiceNative_userRegScn();

反注册

反注册PerfServiceNative_userRegScn注册的handle。注意,跟PerfServiceNative_userUnreg不一样啊。

void PerfServiceNative_userUnregScn(int handle);

配置

原型:

void PerfServiceNative_userRegScnConfig(int handle,
int cmd,
int param_1,
int param_2,
int param_3,
int param_4);

参数: 
* handle:PerfServiceNative_userRegScn注册的handle。 
* cmd:命令 
* param_1, param_2, param_3, param_4:根据命令不同的参数

命令请参见下面的枚举:

enum {
    CMD_SET_CPU_CORE_MIN            = 0,
    CMD_SET_CPU_CORE_MAX            = 1,
    CMD_SET_CPU_CORE_BIG_LITTLE_MIN = 2,
    CMD_SET_CPU_CORE_BIG_LITTLE_MAX = 3,
    CMD_SET_CPU_FREQ_MIN            = 4,
    CMD_SET_CPU_FREQ_MAX            = 5,
    CMD_SET_CPU_FREQ_BIG_LITTLE_MIN = 6,
    CMD_SET_CPU_FREQ_BIG_LITTLE_MAX = 7,
    CMD_SET_GPU_FREQ_MIN            =8,
    CMD_SET_GPU_FREQ_MAX            = 9,
    CMD_SET_MEM_FREQ_MIN            = 10,
    CMD_SET_MEM_FREQ_MAX            = 11,
    CMD_SET_VCORE                   = 12,
    CMD_SET_SCREEN_OFF_STATE        = 13,
    CMD_SET_CPUFREQ_HISPEED_FREQ    = 14,
    CMD_SET_CPUFREQ_MIN_SAMPLE_TIME = 15,
    CMD_SET_CPUFREQ_ABOVE_HISPEED_DELAY = 16,
};
  • CMD_SET_CPU_CORE_MIN:设置最少核数.参数1个 - param_1:核数
  • CMD_SET_CPU_CORE_MAX:设置最大核数.参数1个 - param_1:核数
  • CMD_SET_CPU_CORE_BIG_LITTLE_MIN:设置最少大小核数.参数2个 - param_1:大核数,param_2:小核数
  • CMD_SET_CPU_CORE_BIG_LITTLE_MAX:设置最大大小核数.参数2个 - param_1:大核数,param_2:小核数
  • CMD_SET_CPU_FREQ_MIN:设置最低频率.参数1个 - param_1:频率
  • CMD_SET_CPU_FREQ_MAX:设置最高频率.参数1个 - param_1:频率
  • CMD_SET_CPU_FREQ_BIG_LITTLE_MIN:设置最低大小核数.参数2个 - param_1:大核频率,param_2:小核频率
  • CMD_SET_CPU_FREQ_BIG_LITTLE_MAX:设置最高大小核数.参数2个 - param_1:大核频率,param_2:小核频率
  • CMD_SET_GPU_FREQ_MIN:设置GPU最低频率级别,参数1个 - param_1:频率级别
  • CMD_SET_GPU_FREQ_MAX:不支持
  • CMD_SET_MEM_FREQ_MIN:不支持
  • CMD_SET_MEM_FREQ_MAX:不支持
  • CMD_SET_VCORE:设置图形模式,参数1个:DRAM模式:0-默认模式,1-低功耗模式,2-还是默认模式,3-高性能模式
  • CMD_SET_SCREEN_OFF_STATE:设置关屏模式,一个参数,模式值。0-关屏无效,1-关屏有效,2-关屏暂停,打开恢复
  • CMD_SET_CPUFREQ_HISPEED_FREQ:设置高速频率,一个参数。
  • CMD_SET_CPUFREQ_MIN_SAMPLE_TIME:设置最小采样值,一个参数。
  • CMD_SET_CPUFREQ_ABOVE_HISPEED_DELAY:设置above speed hispeed,一个参数。

开关屏的参数,请使用下面的枚举值:

enum {
    SCREEN_OFF_DISABLE      = 0,
    SCREEN_OFF_ENABLE       = 1,
    SCREEN_OFF_WAIT_RESTORE = 2,
};

Java调用PerfService

步骤

  • import IPerfServiceWrapper和PerfServiceWrapper
  • 注册用户场景IPerfServiceWrapper.userReg
  • 激活用户场景IPerfServiceWrapper.userEnable
  • 执行用户场景
  • 反激活用户场景IPerfServiceWrapper.userDisable
  • 反注册用户场景IPerfServiceWrapper.userUnreg

IPerfServiceWrapper定义于 
/frameworks/base/core/Java/com/mediatek/perfservice/IPerfServiceWrapper.java

新API的步骤

新的API也可以调节GPU,但是采用的方式要复杂一些,就不再像老API一样直接指定核和频率了,需要定义配置

  • IPerfServiceWrapper.userRegScn:没有参数,直接注册就好
  • IPerfServiceWrapper.userRegScnConfig:用这个函数去真正指定配置
  • IPerfServiceWrapper.userEnable/IPerfServiceWrapper.userEnableTimeout:跟老API没有区别
  • IPerfServiceWrapper.userDisable:还是老的API
  • IPerfServiceWrapper.userUnregScn:反注册

新API开发指南

获取系统能力

publicintuserGetCapability(int cmd);

参数: 
* cmd: 请参见下面的常量值:

publicstaticfinalint CMD_GET_CPU_FREQ_LEVEL_COUNT        = 0;
publicstaticfinalint CMD_GET_CPU_FREQ_LITTLE_LEVEL_COUNT = 1;
publicstaticfinalint CMD_GET_CPU_FREQ_BIG_LEVEL_COUNT    = 2;
publicstaticfinalint CMD_GET_GPU_FREQ_LEVEL_COUNT        = 3;
publicstaticfinalint CMD_GET_MEM_FREQ_LEVEL_COUNT        = 4;
  • CMD_GET_CPU_FREQ_LEVEL_COUNT:获取CPU频率级别
  • CMD_GET_CPU_FREQ_LITTLE_LEVEL_COUNT:获取小核CPU频率级别
  • CMD_GET_CPU_FREQ_BIG_LEVEL_COUNT:获取大核CPU频率级别
  • CMD_GET_GPU_FREQ_LEVEL_COUNT:获取GPU频率级别
  • CMD_GET_MEM_FREQ_LEVEL_COUNT:获取内存频率级别

注册

因为新的API还需要指定配置,所以注册获取handle就不需要参数了。

原型:

publicintuserRegScn();

反注册

反注册PerfServiceNative_userRegScn注册的handle。注意,跟PerfServiceNative_userUnreg不一样啊。

原型:

publicvoiduserUnregScn(int handle);

配置

原型:

publicvoiduserRegScnConfig(int handle,
int cmd,
int param_1,
int param_2,
int param_3,
int param_4);

参数: 
* handle:PerfServiceNative_userRegScn注册的handle。 
* cmd:命令 
* param_1, param_2, param_3, param_4:根据命令不同的参数

命令请参见下面的常量:

publicstaticfinalint CMD_SET_CPU_CORE_MIN            = 0;
publicstaticfinalint CMD_SET_CPU_CORE_MAX            =1;
publicstaticfinalint CMD_SET_CPU_CORE_BIG_LITTLE_MIN = 2;
publicstaticfinalint CMD_SET_CPU_CORE_BIG_LITTLE_MAX =3;
publicstaticfinalint CMD_SET_CPU_FREQ_MIN            =4;
publicstaticfinalint CMD_SET_CPU_FREQ_MAX            = 5;
publicstaticfinalint CMD_SET_CPU_FREQ_BIG_LITTLE_MIN = 6;
publicstaticfinalint CMD_SET_CPU_FREQ_BIG_LITTLE_MAX = 7;
publicstaticfinalint CMD_SET_GPU_FREQ_MIN            =8;
publicstaticfinalint CMD_SET_GPU_FREQ_MAX            = 9;
publicstaticfinalint CMD_SET_MEM_FREQ_MIN            = 10;
publicstaticfinalint CMD_SET_MEM_FREQ_MAX            = 11;
publicstaticfinalint CMD_SET_SCREEN_OFF_STATE        = 12;
publicstaticfinalint CMD_SET_CPUFREQ_HISPEED_FREQ    =13;
publicstaticfinalint CMD_SET_CPUFREQ_MIN_SAMPLE_TIME =14;
publicstaticfinalint CMD_SET_CPUFREQ_ABOVE_HISPEED_DELAY = 15;
publicstaticfinalint CMD_SET_VCORE                       = 16;
  • CMD_SET_CPU_CORE_MIN:设置最少核数.参数1个 - param_1:核数
  • CMD_SET_CPU_CORE_MAX:设置最大核数.参数1个 - param_1:核数
  • CMD_SET_CPU_CORE_BIG_LITTLE_MIN:设置最少大小核数.参数2个 - param_1:大核数,param_2:小核数
  • CMD_SET_CPU_CORE_BIG_LITTLE_MAX:设置最大大小核数.参数2个 - param_1:大核数,param_2:小核数
  • CMD_SET_CPU_FREQ_MIN:设置最低频率.参数1个 - param_1:频率
  • CMD_SET_CPU_FREQ_MAX:设置最高频率.参数1个 - param_1:频率
  • CMD_SET_CPU_FREQ_BIG_LITTLE_MIN:设置最低大小核数.参数2个 - param_1:大核频率,param_2:小核频率
  • CMD_SET_CPU_FREQ_BIG_LITTLE_MAX:设置最高大小核数.参数2个 - param_1:大核频率,param_2:小核频率
  • CMD_SET_GPU_FREQ_MIN:设置GPU最低频率级别,参数1个 - param_1:频率级别
  • CMD_SET_GPU_FREQ_MAX:不支持
  • CMD_SET_MEM_FREQ_MIN:不支持
  • CMD_SET_MEM_FREQ_MAX:不支持
  • CMD_SET_VCORE:设置图形模式,参数1个:DRAM模式:0-默认模式,1-低功耗模式,2-还是默认模式,3-高性能模式
  • CMD_SET_SCREEN_OFF_STATE:设置关屏模式,一个参数,模式值。0-关屏无效,1-关屏有效,2-关屏暂停,打开恢复
  • CMD_SET_CPUFREQ_HISPEED_FREQ:设置高速频率,一个参数。
  • CMD_SET_CPUFREQ_MIN_SAMPLE_TIME:设置最小采样值,一个参数。
  • CMD_SET_CPUFREQ_ABOVE_HISPEED_DELAY:设置above speed hispeed,一个参数。

Java调用例

WebView中的应用例

例:

publicvoidloadData(String data, String mimeType, String encoding) {checkThread();
if (TRACE) Log.d(LOGTAG, "loadData");
/// M:PerfBoost include @{
if (sFirstLoadData) {
int maxFreq = 0;
try {
                String freqFile = "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq";
                RandomAccessFile reader = newRandomAccessFile(freqFile, "r");
                String stringMaxFreq = reader.readLine();
                reader.close();
               maxFreq = Integer.parseInt(stringMaxFreq);
            } catch (IOException | NumberFormatException e) {
e.printStackTrace();        }
if (maxFreq != 0) {
sPerfService = new PerfServiceWrapper(null);
if (sPerfService != null) {int minCPU = 2;     if (maxFreq <1100000)
     minCPU = 4;
     sPerfHandle = sPerfService.userReg(minCPU, maxFreq);
   if (sPerfHandle != -1) 
   {
   sPerfService.userEnableTimeoutMs(sPerfHandle, 500);
   Handler handler = newHandler();
handler.postDelayed(new Runnable() {
  @Override
publicvoidrun() {
sPerfService.userUnreg(sPerfHandle);
                 }
      }, 600);
                  }
                }
            }
sFirstLoadData = false;
       }
/// @}
 
mProvider.loadData(data, mimeType, encoding);
    }

MTK预定义的一些场景

MediaTek预定义了这么多API,当然它自己也会有自己的预定义场景,这些场景就不需要再定义了。

libperfservice.so中预定义的场景

场景

cpu核数

cpu频率

UI操作

SCN_APP_SWITCH

2

-

app启动、退出

SCN_APP_ROTATE

2

-

app rotate

SCN_APP_TOUCH

2

169000

touch

但是,这个值肯定不是在所有平台上都是最优的值啊,所以MTK也提供了客户定制化的机制。

定制预定义场景

定义于/vendor/mediatek/proprietary/hardware/perfservice/mt[xxxx]/scn_tbl/perfservscntbl.txt中。

我们以MT6735为例,来看一看具体的内容,定义于/vendor/mediatek/proprietary/hardware/perfservice/mt6735/scn_tbl/perfservscntbl.txt中。

CMD_SET_CPU_CORE, SCN_APP_TOUCH, 3
CMD_SET_CPU_FREQ, SCN_APP_TOUCH, 819000
CMD_SET_CPU_CORE, SCN_SW_FRAME_UPDATE, 3
CMD_SET_CPU_FREQ, SCN_SW_FRAME_UPDATE, 819000
CMD_SET_CPU_CORE, SCN_APP_SWITCH, 4
CMD_SET_CPU_FREQ, SCN_APP_SWITCH, 1300000
CMD_SET_CPU_UP_THRESHOLD, SCN_SW_FRAME_UPDATE, 80
CMD_SET_CPU_DOWN_THRESHOLD, SCN_SW_FRAME_UPDATE, 65
CMD_SET_CPU_CORE, SCN_APP_LAUNCH, 4
CMD_SET_CPU_FREQ, SCN_APP_LAUNCH, 1300000

白名单

定义于:/vendor/mediatek/proprietary/hardware/perfservice/mt[xxxx]/app_list/perfservapplist.txt

格式:包名核数

例:

com.imangi.templerun2  3

MTK 功耗优化(1)---MTK PerfService相关推荐

  1. Android手机功耗,高通/MTK功耗

    功耗优化- https://blog.csdn.net/zhangbijun1230/article/category/7541658 android 功耗优化- https://blog.csdn. ...

  2. 手机功耗优化——相机,屏,指纹,usb,三方应用等模块功耗

    手机功耗优化--各器件功耗拆解,三方应用 手机是高耗电的移动设备,所以对续航的要求非常高,因此功耗优化是非常重要的一环,下面介绍一下各个器件的功耗以及如何优化,手机,平板涉及的可拆除器件一般包括cam ...

  3. 最新MTK芯片型号汇总,MTK开发资料大全下载

    前面总结的MTK芯片资料有点混乱,不好查看,现在重新整理一份全面的MTK芯片,MTK开发设计资料,方便大家学习,下载. MTK芯片分类: MTK芯片型号大全:http://bbs.16rd.com/c ...

  4. Android系统功耗优化之CPU - CPU功耗和频率的关系

    现在的处理器都支持DVFS - 动态频率电压调整,我们都知道DVFS的设计是为了low power,那么CPU频率和功耗之间的关系如何,运行在相同频率处理A任务和B任务功耗就一样吗? 同任务不同频率 ...

  5. Android-O wifi扫描机制及功耗优化

    一. Android O wifi扫描场景 Android O上的wifi扫面场景可以归结为以下四种: 1. 亮屏情况下,在Wifi settings界面,固定扫描,时间间隔为10s. 2. 亮屏情况 ...

  6. 高通Camera功耗优化

    一.随便说说 功耗优化一直是一个令人头大的东西,毕竟单枪匹马,没人指导,真的很难. 功耗优化的高通文档: kba-170221213554_7_高通通用功耗温升优化技术期刊 80-P0955-1SC- ...

  7. android功耗(9)----MTK功耗问题需要哪种log

    功耗问题需要哪种log 功耗问题抓log请遵循几条原则: ----------------------------------------------------------------------- ...

  8. Android 功耗(22)---MTK 功耗问题分析

    1.功耗问题需要哪种log 功耗问题抓log请遵循几条原则: --------------------------------------------------------------------- ...

  9. Android Framework 框架系列之 MTK 功耗解决方案

    极力推荐Android 开发大总结文章:欢迎收藏程序员Android 力荐 ,Android 开发者需要的必备技能 本篇文章主要介绍手机开发中的功耗部分知识点,功耗直接影响到手机的待机时间,通过阅读本 ...

最新文章

  1. IO模型之非阻塞IO
  2. IE 下 href 的 BUG
  3. 计蒜客 时间复杂度 (模拟) 洛谷 P3952 时间复杂度
  4. 吴晓灵:尽快制定“个人信息保护法”
  5. boost::intrusive::slist用法的测试程序
  6. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1055:判断闰年
  7. 消息中间件系列(八):Kafka、RocketMQ、RabbitMQ等的优劣势比较
  8. Pentium 4处理器架构/微架构/流水线 (3) - NetBurst微架构
  9. 第 9 章 MybatisX 快速开发插件
  10. android 的几个黄色警告解决办法(转)
  11. 峰情万种_Enhancement of Peak Visual
  12. bzoj3207主席树
  13. html div缩放
  14. Mycat超详细最常用的水平分表规则
  15. SpringBoot2.0整合多数据源拆分
  16. 错误与异常 之 try...catch语句
  17. 使用Outlook Mail App滑动操作快速处理邮件
  18. 压力传感器行业调研报告 - 市场现状分析与发展前景预测
  19. 聊聊云原生数据库的一致性
  20. 这些后缀代表什么文件?

热门文章

  1. ROS 教程之 vision: 摄像头标定camera calibration
  2. as2.0与php交互,Flash(AS2.0)与php通讯 分享
  3. JavaScript-面试 表单验证
  4. BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治
  5. 学习笔记(十五)——镜像的知识点与注意事项
  6. NLP(paper + code)
  7. Android下强制打开键盘
  8. RHEL6.3 ftp服务器参数的戏说——不看白不看,看了不白看
  9. [转] 算法学习之字符串左移和右移
  10. Apache Commons Codec 1.7 发布