功耗_功耗测试 - CSDN
精华内容
参与话题
  • android功耗高通平台 分类:功耗1、底电流调试(Rock Bottom Current Optimization)底电流在手机飞行模式下调试。每个平台的底电流数据可能不一样,具体可以参考release出来的Current Consumption Data文档...

    android

    功耗

    高通平台

     分类:功耗

    1、底电流调试(Rock Bottom Current Optimization

    底电流在手机飞行模式下调试。每个平台的底电流数据可能不一样,具体可以参考release出来的Current Consumption Data文档或者release note。一般情况下的底电流参考数据上限是:

    512M RAM < 1.5mA; 1G RAM < 2mA; 2G RAM < 2.6mA

     1.1校准RF

    保证RFPAAntenna switchTunerAPTGPIO工作在正常状态

     1.2飞行模式

    开启飞行模式、关闭GPS、关闭自动旋转屏幕、关闭自动亮度调节、关闭其他特效效果设置

    开启飞行模式,可以基本避免蓝牙、wifiNFC、网络、FM等的一般影响;

    关闭GPS,可以基本排除开启GPS对底电流的影响;

    关闭自动旋转屏幕,可以基本排除sensor的影响;

    关闭自动亮度调节,可以基本排除距离感应到的影响;

    关闭其他特效效果设置,如指纹识别、黑屏手势、智能体感、手势隔空操作。。。。。。

     1.3使用perf_defconfig

    修改device/qcom//AndroidBoard.mk。如果KERNEL_DEFCONFIG := _defconfig,那么改成KERNEL_DEFCONFIG := -perf_defconfig

    同时,kernel代码改用/kernel/arch/arm/configs/-perf_defconfig

    是平台名称或者项目名称

     

    1.4移除debugging APKs

    /system/app/Logkit.apk

    /system/app/com.qualcomm.qlogcat.apk

    /system/xbin/qlogd

     

    1.5把应用尽量删除

    在设置-->应用,禁用正在运行的应用

     

    1.6去掉CPU占用高的进程

    adb shell

    top

    查看CPU占用,去掉在休眠模式下CPU占用大于0的进程。kill掉该进程,若kill不掉则rm掉相关应用。对于占用CPU高的kwork,需要查找驱动原因。

     

    1.7手动移除所有可以移除的外设

    手机连上安捷伦电源,手机开机,然后让手机进入待机状态。手动移除TPLCM、前camera、后camerasensorSD卡、SIM卡等可以手动移除的外围器件,同时观察并记录底电流变化。

    直接移除WLAN芯片可能会导致开不了机,所以在移除WLAN之前,先对软件做如下处理:

    # mount -o rw,remount -t vfat /dev/block/bootdevice/by-name/modem 

    # cd /firmware/image 

    # rm wcnss.* 

    # reboot 

    或者

    #lsmod

    #rmmod WLAN

    移除其他可以移除的芯片(sensorNFC。。。)

     

    1.8移除驱动模块

    /kernel/arch/arm/configs/-perf_defconfig中把sensorTPLCMcamera等的驱动模块移除;

    或者在对应驱动的Makefile里面,移除驱动代码

    然后编译bootimage,烧入手机观察底电流变化

     

    1.9配置不用的GPIO

    将不用的GPIO置为输入、拉低;配置成SPII2CGPIO,若不用,置为悬空

    boot_images/core/systemdrivers/tlmm/config/platform/TLMMChipset.xml,修改GPIO配置。该处配置GPIO的初始状态,驱动有可能会修改GPIO

    对比项目原理图与平台参考原理图,项目原理图中多出的NC GPIO要处理掉。

     

    1.10检查power相关的NV items

    需要跟CE确认。一般如下:

    1027 = 0

    1895 = 0

    1892 = 0

    1962 = 0

    4679 = 16

    4201 = 0

    3851 = 0

    3852 = 6

    7157 = 1

    69745 rxd_enable = 0

    WCDMA NV:

    NV3581 = 0

    NV3852 = 6

     

    1.11排查GPIOLDO、总线

    对比项目原理图与平台参考原理图,排查硬件不一样的GPIOLDO、总线配置。

    量测各GPIOLDOI2C在休眠时候的电压,需用万用表准确测量。

    休眠时各路I2C GPIO的电压是多少v,用万用表准确测量。

    如果条件允许,测量所有LDO在休眠前和休眠后的准确电压。

    对于LDO,调试方法如下:

    1adb shell关闭LDO

    如关闭L3

    cd /sys/kernel/debug/regulator/8916_l3/

    echo 0 > enable

    2LDO太多设备用到,不适合用adb shell来关。可以这样调试:

    cat /sys/kernel/debug/regulator/8916_l6/consumers 

    shell@msm8916_32:/sys/kernel/debug/regulator/8916_l6 $ cat consumers 

    Device-Supply EN Min_uV Max_uV load_uA 

    0-000c-vio Y 1800000 1800000 0 

    0-0068-vi2c N 1800000 1800000 0 

    5-0038-vcc_i2c Y 1800000 1800000 0 

    1a98000.qcom,mdss_dsi-vddio N 1800000 1800000 100 

    1a98300.qcom,mdss_dsi_pll-vddio N 1800000 1800000 100 

    8916_l6 N 0 0 0 

    这样就可以看到是哪些设备请求了LDO6。然后 找到对应的代码,在休眠时关掉LDO,唤醒时再打开。 

    0-000c: 挂在I2C0上地址为0xc 

    5-0038: 挂在I2C0上地址为0x38 

    查看这两个设备的驱动代码是否有执行regulator_enable

    3)通过寄存器地址关闭LDO

    LDO6的地址是0x14546,则关闭方法是:

    # cd /sys/kernel/debug/spmi/spmi-0 

    # echo 0x14546 > address 

    # echo 1 > count 

    # cat data 可以读寄存器 

    # echo 0x00 > data LDO6

    4)关闭MPP

    在休眠前关闭MPP1MPP2MPP3MPP4 

    PM8916的寄存器地址分别是0xA0460xA1460xA2460xA346 

    在关闭前先cat data以查看原来的值。 

     

    GPIO状态读取的方法如下:

    1GPIO dump

    为了得到休眠时的GPIO状态,增加下面的打印

    rpm_proc/core/power/sleep/src/lpr_definition_uber.c 

    #include "tlmm_hwio.h" 

    void deep_sleep_enter(void) 

    uint64 sleep_duration; 

    ... 

     

    SWEVENT(SLEEP_DEEP_SLEEP_ENTER_COMPLETE, sleep_mode.deep_sleep_mode, sleep_duration); 

    // For test 

    int num; 

    int i=11; 

    volatile uint32 cfg ,inout, val; 

     

    num = 122; //8916 only. Need modify for 8974/8x10/8x26 etc. 

     

    cfg = *(volatile uint32*)HWIO_TLMM_GPIO_CFGn_ADDR(i); //(0x61000000 + i * 0x1000) 

    inout = *(volatile uint32*)HWIO_TLMM_GPIO_IN_OUTn_ADDR(i);//(0x61000004 + i * 0x1000) 

    val = ((cfg << 16)&0xffff0000) | (inout&0xffff); 

    SWEVENT(SLEEP_GPIO_DUMP, i, val); 

    mpm_sw_done(sleep_mode.deep_sleep_mode, sleep_duration); 

    } while(FALSE); 

     

    增加for test下面这一段代码。

    然后再修改

    rpm_proc\core\power\sleep\build\SConscript 

    if 'USES_QDSS_SWE' in env: 

    QDSS_IMG = ['QDSS_EN_IMG'] 

    events = [['SLEEP_DEEP_SLEEP_ENTER=320','deep sleep enter. (sleep mode: %d) (count: %d)'], 

    ['SLEEP_DEEP_SLEEP_EXIT','deep sleep exit (sleep mode: %d)'], 

    ['SLEEP_NO_DEEP_SLEEP','bail early from deep sleep. (sleep mode: %d) (reason: %d)'], 

    ['SLEEP_RPM_HALT_ENTER','rpm halt enter'], 

    ['SLEEP_RPM_HALT_EXIT','rpm halt exit'], 

    ['SLEEP_MPM_INTS','pending mpm interrupts at wakeup: (interrupt_status_1 %d), (interrupt_status_2 %d)'], 

    ['SLEEP_DEEP_SLEEP_ENTER_COMPLETE','deep sleep exit complete (sleep mode: %d)'], 

    ['SLEEP_DEEP_SLEEP_EXIT_COMPLETE','deep sleep exit (sleep mode: %d)'], 

    ['SLEEP_MPM_WAKEUP_TIME','mpm wake up time (wakeup time: 0x%0.8x%0.8x)'], 

    ['SLEEP_GPIO_DUMP','gpio [%d] configuration is %d'],

    ['SLEEP_EVENT_LAST=383','sleep last event placeholder'] 

    增加SLEEP_GPIO_DUMP这一项。 

    编译烧写rpm.mbn

    让机器休眠,进入download,抓dump,然后将如下日志发给平台技术支持分析。 

    CODERAM.bin 

    MSGRAM.bin 

    DATARAM.bin 

    以及新编译出来的RPM_AAAAANAZR.elf。  

    2GPIO寄存器读取

    RPM可能不是很方便,也可以用busybox来读取寄存器,例如读GPIO11: 

    Physical Address for GPIO_CFG11 = 0x100B000 

    root@android:/data/busybox # ./busybox devmem 0x100B000 32 

    ./busybox devmem 0x100B000 32 

    0x00000203 

    GPIO_PULL = "11" PULL_UP 

    FUNC_SEL = "0000" FUNCTION GPIO 

    DRV_STRENGTH = "000" DRV_2_MA 

    GPIO_OE = "1" Output Enable 

     

    1.12 rpm dump

    rpm dump,然后把log提供给平台技术支持。

    方法如下: 

    1ps_hold接地

    在休眠状态下,接ps_hold到地少于200mS,机器会进入紧急下载状态,插入USBQPST会自动得到memory dump,然后上传以下几个文件: 

    CODERAM.bin 

    MSGRAM.bin

    DATARAM.bin 

    以及RPM_AAAAANAZR.elf(必须与机器的编译时间一致匹配的elf) 

    2)改resetdownload key

    发这些命令改resetdownload key: 

    # cd /sys/kernel/debug/spmi/spmi-0 

    # echo 0x844 > address 

    # echo 4 > count 

    # cat data 

    00840 -- -- -- -- 0F 07 04 00 

    # echo 0x00 0x00 0x01 0x00 > data 

    # cat data 

    00840 -- -- -- -- 00 00 01 00 

    # echo 0x00 0x00 0x01 0x80 > data 

    # cat data 

    00840 -- -- -- -- 00 00 01 80 

    然后长按下键,会进入download。之后抓取log方法同上。

    如果进不了download,需要确认: 

    CONFIG_MSM_DLOAD_MODE=y 

    另外也有可能与nv 4399905有关系。

     

    1.13检查rpm_stats

    检查rpm_stats是否进入vdd min或者xo/no shutdown。使用下面的命令检查rpm lower power mode count:

    cat /sys/kernel/debug/rpm_stats

    如果vmincount0,则表明设备从来没有进入vdd minnon-zero则说明设备进入过vdd_min

    RPM Mode: xosd

    count:0

    time in last mode(msec):0

    time since last mode(sec):794

    actual last sleep(msec):0

    RPM Mode:vmin

    count:11

    time in last mode(msec):0

    time since last mode(sec):359

    actual last sleep(msec):110000

     

    1.14使用Trace32

    可以dump出来完整详细的gpio/clk/pmic信息,排除休眠时候的状态异常。

     

     

    2、待机电流优化(Standby Current Optimization

    2.1通过adb log排查

    adb logcat -v time > YearMounthDayHourMinute_logcat.txt   //main log

    adb logcat -v time -b events > YearMounthDayHourMinute_logcat_event.txt   //event log

    adb logcat -v time -b radio > YearMounthDayHourMinute_logcat_radio.txt    //radio log

    adb shell dmesg > YearMounthDayHourMinute_dmesg.txt                 //kernel log

    可以采用功耗问题时间追踪表来精确追踪功耗异常。

    可以使用如下命令来打开指定文件的kernel log(以qpnp-adc-tm.cqpnp-adc-common.c为例):

    adb shell mount -t debugfs none /sys/kernel/debug

    adb shell "echo 8 > /proc/sys/kernel/printk" 

    adb shell "echo 'file qpnp-adc-tm.c +p' > /sys/kernel/debug/dynamic_debug/control"

    adb shell "echo 'file qpnp-adc-common.c +p' > /sys/kernel/debug/dynamic_debug/control"

    adb shell "echo 8 > /proc/sys/kernel/printk"

     

    为指定的函数开启log,以qpnpint_handle_irq为例:

    adb shell "echo 'func qpnpint_handle_irq +p' > /sys/kernel/debug/dynamic_debug/control" 

     

    *#logkit#*调出logkit apk,可以保存logcatdmesgcrashQXDMGPU log等日志信息到手机里面。

     

    2.2 top

    通过top命令,可以查询到cpu占用较高的应用。如果一个应用一直在占用cpu,而此时并没有打开该应用,那么该应用很可能会导致待机异常。

    adb shell

    top

    “该场景下CPU使用率”是User+System+IOW+IRQ

    “模块相关的CPU占用率”是模块相关进程占用CPU使用率的总和

     

    2.3正在运行

    设置-->应用-->正在运行,可以看到正在运行的应用或者服务。禁止掉应用或者服务,观察待机电流变化。

     

    2.4 wakeup debug mask

    调试wakeup问题,可以使能debug功能,然后抓取logLog中会增加一些debug信息。

    mount -t debugfs none /sys/kernel/debug  

    echo 1 > /sys/kernel/debug/clk/debug_suspend  

    echo 1 > /sys/module/msm_show_resume_irq/parameters/debug_mask  

    echo 4 > /sys/module/wakelock/parameters/debug_mask  

    echo 1 > /sys/module/lpm_levels/parameters/debug_mask  

    echo 0x16 > /sys/module/smd/parameters/debug_mask  

     

    2.5 wakelock  

    1wakeup_sources  

    kernel wakelockuserspace wakelock都有可能阻止系统睡眠。所有的wakeup_sources均保存在sys节点/sys/kernel/debug/wakeup_sources里面。 

    该文件包含了如下信息:

    1the total amount of time a wakeup source has prevented suspend  

    2the amount of time a wakelock has been active since the last activation etc. The unit of time is milliseconds. 

     

    2active_since

    active_since值可以用来确认wakelock是否正在阻止休眠。如果该值不是零,那么这个wakelock正在工作并且阻止休眠。

     

    3、获取wakeup_sources的命令

    adb root 67754400

    adb remount

    adb shell 

    cat /sys/kernel/debug/wakeup_sources > /data/wakeup_sources.txt

    adb pull /data/wakeup_sources.txt

    获得wakeup_sources.txt以后,通过Excel打开,active_since不为0的项为wakeup source。以表2为例,msm_dwc3对应的active-since481756>0,这意味着msm_dwc3驱动在阻止系统睡眠,下一步需要检查msm_dwc3驱动代码及相关log

     

    表格 2 Wakeup source opened in Excel

     

    4power:wakeup_source_activate and power:wakeup_source_deactivate events

    当一个wakeup sourceacquire或者release时候,power:wakeup_source_activatepower:wakeup_source_deactivate event将随即被写到trace buffer里面,这样可以记录wakeup sourcedriver使用的频率。

    开启该功能的方法:

    echo "power:wakeup_source_activate power:wakeup_source_deactivate" > /sys/kernel/debug/tracing/set_event

     

    The power:wakeup_source_activate and power:wakeup_source_deactivate events are written to the trace buffer any time a wakeup source is acquired or released and it can provide information on how often a wakeup source is being used by a driver.  

    To enable these events, you can enable following:  

    echo "power:wakeup_source_activate power:wakeup_source_deactivate" > /sys/kernel/debug/tracing/set_event 

    Once the above done, the traces will be present in /sys/kernel/debug/tracing/trace. 

     

    2.6 powertop

    powertop用来看CPU的运行统计以协助调试power问题。powertop的用法如下:

    powertop --h

    Usage: powertop [OPTION...]

    n -d, --dump read wakeups once and print list of top offenders

    n -t, --time=DOUBLE default time to gather data in seconds

    n -r, --reset Reset PM stats data

    n -h, --help Show this help message

    n -v, --version Show version information and exit

    获取powertop log的方法:

    1. 通过USB连接手机到电脑

    2. adb shell,然后执行如下命令:

    sleep 10 && /data/powertop [-r] -d -t 30 > /data/powertop.log & 

    3. 拔掉USB线,等待10秒后开始功耗测试

    4. 插上USB  

    5. adb pull /data/powertop.log  

     

    2.7 CPU freq log 

    打开CPU freq change log

    mount -t debugfs none /sys/kernel/debug  

    cd /sys/kernel/debug 

    echo -n 'file acpuclock-8x60.c +p' > dynamic_debug/control 

    echo -n 'file acpuclock-krait.c +p' > dynamic_debug/control

     

    查看cpu freq stats: 

    cat /sys/devices/system/cpu/cpu0/cpufreq/stats 

    cat /sys/devices/system/cpu/cpu1/cpufreq/stats 

    cat /sys/devices/system/cpu/cpu2/cpufreq/stats 

    cat /sys/devices/system/cpu/cpu3/cpufreq/stats 

     

    To lock cpu freg: 

    echo the same freq to following sys mode will lock cpu freq to the setting freq. 

    /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq 

    /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq

     

    To enable/disable specific freq for ACPU 

    ACPU freq table is defined in acpu_freq_tbl_* structure of specific platform. 

    arch/arm/mach-msm/acpuclock-.c 

    For 8974, it is defined in arch/arm/mach-msm/acpuclock-8974.c. the first column of following table used to enable/disable freq in the row: 1:enable, 0:disable  

    static struct acpu_level acpu_freq_tbl_2p3g_pvs0[] __initdata = { 

    { 1, { 300000, PLL_0, 0, 0 }, L2(0), 800000, 72 }, 

    { 0, { 345600, HFPLL, 2, 36 }, L2(1), 800000, 83 }, 

    { 1, { 422400, HFPLL, 2, 44 }, L2(2), 800000, 101 }, 

    { 0, { 499200, HFPLL, 2, 52 }, L2(2), 805000, 120 }, 

    { 0, { 576000, HFPLL, 1, 30 }, L2(3), 815000, 139 }, 

    { 1, { 652800, HFPLL, 1, 34 }, L2(3), 825000, 159 }, 

    { 1, { 729600, HFPLL, 1, 38 }, L2(4), 835000, 180 }, 

    { 0, { 806400, HFPLL, 1, 42 }, L2(4), 845000, 200 }, 

    { 1, { 883200, HFPLL, 1, 46 }, L2(4), 855000, 221 }, 

    { 1, { 960000, HFPLL, 1, 50 }, L2(9), 865000, 242 }, 

    { 1, { 1036800, HFPLL, 1, 54 }, L2(10), 875000, 264 }, 

    { 0, { 1113600, HFPLL, 1, 58 }, L2(10), 890000, 287 }, 

    { 1, { 1190400, HFPLL, 1, 62 }, L2(10), 900000, 308 }, 

    … 

    { 1, { 1958400, HFPLL, 1, 102 }, L2(19), 1040000, 565 }, 

    { 0, { 2035200, HFPLL, 1, 106 }, L2(19), 1055000, 596 }, 

    { 0, { 2112000, HFPLL, 1, 110 }, L2(19), 1070000, 627 }, 

    { 0, { 2188800, HFPLL, 1, 114 }, L2(19), 1085000, 659 }, 

    { 1, { 2265600, HFPLL, 1, 118 }, L2(19), 1100000, 691 }, 

    { 0, { 0 } } 

    }; 

     

    2.8 Hoplug cores 

    Core 0 cant be hotplugged, Core 1/2/3 can be hotplugged, 

    To remove core : 

    echo 0 > /sys/devices/system/cpu/cpu1/online 

    echo 0 > /sys/devices/system/cpu/cpu2/online 

    echo 0 > /sys/devices/system/cpu/cpu3/online 

     

    To add back core: 

    echo 1 > /sys/devices/system/cpu/cpu1/online

    echo 1 > /sys/devices/system/cpu/cpu2/online

    echo 1 > /sys/devices/system/cpu/cpu3/online

     

    2.9 Scaling governor

    To check scaling governor

    cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

     

    To set new governor

    echo  > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

    比如:

    echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

     

    2.10 Mpdecision

    Use Mpdecison daemon to start/stop/enable debug with commands below: 

    Start mpdecison: 

    start mpdecision 

    Stop mpdecison

    stop mpdecision

     

    Enable mpdecision debug 

    start mpdecision --debug 

     

    2.11 Power feature enable/disable 

    Following sys node can be used to enable the lower resource, 

     

    echo 2 > /sys/module/lpm_resources/enable_low_power/l2 

    echo 1 > /sys/module/lpm_resources/enable_low_power/pxo 

    echo 1 > /sys/module/lpm_resources/enable_low_power/vdd_dig 

    echo 1 > /sys/module/lpm_resources/enable_low_power/vdd_mem 

    echo 1 > /sys/module/pm_8x60/modes/cpu0/power_collapse/suspend_enabled 

    echo 1 > /sys/module/pm_8x60/modes/cpu1/power_collapse/suspend_enabled 

    echo 1 > /sys/module/pm_8x60/modes/cpu2/power_collapse/suspend_enabled 

    echo 1 > /sys/module/pm_8x60/modes/cpu3/power_collapse/suspend_enabled 

    echo 1 > /sys/module/pm_8x60/modes/cpu0/power_collapse/idle_enabled 

    echo 1 > /sys/module/pm_8x60/modes/cpu0/standalone_power_collapse/suspend_enabled

    echo 1 > /sys/module/pm_8x60/modes/cpu1/standalone_power_collapse/suspend_enabled

    echo 1 > /sys/module/pm_8x60/modes/cpu2/standalone_power_collapse/suspend_enabled 

    echo 1 > /sys/module/pm_8x60/modes/cpu3/standalone_power_collapse/suspend_enabled

    echo 1 > /sys/module/pm_8x60/modes/cpu0/standalone_power_collapse/idle_enabled 

    echo 1 > /sys/module/pm_8x60/modes/cpu1/standalone_power_collapse/idle_enabled 

    echo 1 > /sys/module/pm_8x60/modes/cpu2/standalone_power_collapse/idle_enabled 

    echo 1 > /sys/module/pm_8x60/modes/cpu3/standalone_power_collapse/idle_enabled 

    echo 0 to above sys node will disable related low power mode. 

     

    2.12 Check system alarm  

    get android alarms and statistics: 

    adb dumpsys alarm > alarms.txt

     

    enable android debug message in logcat: 

    setprop persist.alarm.debug 1

     

    2.13 Kernel timer check

    Sys node /proc/timer_stats can be used to check kernel timer stastics, customer can use following command to get timer statics in specific scenario: 

    echo 0 > /proc/timer_stats && sleep 10 && echo 1 > /proc/timer_stats && sleep 30 && cat /proc/timer_stats > /data/timer_stats & 

     

    OEMs need to provide file /data/timer_stats to salesforce case for check. 

     

     

    3、其他功耗项的优化

    3.1屏幕对功耗的影响

    屏幕亮度等级不同,功耗不同。亮度越低,功耗越低。调低屏幕默认背光亮度等级和屏幕最高亮度设置时候的背光亮度等级,可以优化手机整体功耗表现。

    LCD背光等级的设备节点:

    /sys/class/leds/lcd-backlight/brightness

    默认背光等级和最高亮度背光等级需要同时考虑到用户体验和功耗表现,需要一起评估。

    另外,调试LCDfps帧率,也可以优化功耗。

     

    3.2 CPU/GPU DVFS

    CPU/GPU的动态调频调压可以优化手机的功耗表现。该影响是整体性的,系统性的。

    CPU降频主要通过两种方式实现,都可以达到降频的目标。

    1、设置CPU工作在powersave模式。设置该模式后,CPU将一直工作在最低频率(300000hz)。此时手机最省电,但是有可能会出现手机运行变卡顿。

    例如:将CPU0置为powersave模式,命令为:

    echo "powersave" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

    例如:将CPU1置为powersave模式,命令为:

    echo "powersave" > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor

    ex780共有4CPUCPU0~CPU3),都可以这样处理

    2、限制CPU最高频率,以限制CPU的运行频率上限

    CPUCPU0~CPU3)可以选择的频率值如下所列,即这些数值都可以用作CPU的频率上限。选择的频率上限可以根据实际场景需要来设置。在超级省电模式下,CPU工作的宗旨是:CPU工作频率低+运行不卡,两项都要保障。

    CPU可以选择的频率:

    300000 422400 652800 729600 883200 960000 1036800 1190400 1267200 1497600 1574400 1728000 1958400 2265600 2457600

    例如:将CPU0的频率上限设置为960000

    echo 960000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

    例如:将CPU0的频率上限设置为422400

    echo 422400 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

     

    GPU相关调试与CPU类似,设备节点路径/sys/devices/fdb00000.qcom,kgsl-3d0/kgsl/kgsl-3d0

     

    3.3 CPU占用率

    应用对cpu的占有率,如果占有率过高,则该应用一般会导致功耗较大。

    adb shell

    top -m 6 

     

    3.4游戏功耗

    可以从下面几个方面优化:

    降低屏幕背光亮度等级;

    采用CPUGPU动态调频调压,并调低CPUGPU频率下限;

    采用thermal-engine.conf 

     

    3.5 Camera功耗偏大

    降低camera帧率;

    降低屏幕背光亮度等级;

    采用CPUGPU动态调频调压,并调低CPUGPU频率下限;

    采用thermal-engine.conf 

    展开全文
  • 静态功耗与动态功耗

    千次阅读 多人点赞 2020-04-05 15:01:57
    功耗的本质是能量耗散。由能量守恒定律可知,能量只能从一种形式转成另一种形式,能量的总量不变。芯片耗散的电能主要转化成热能。如果一颗芯片的功耗过大,容易导致工作时温度过高,造成功能失效,甚至晶体管失效。...

    0. 功耗源

    功耗的本质是能量耗散。由能量守恒定律可知,能量只能从一种形式转成另一种形式,能量的总量不变。芯片耗散的电能主要转化成热能。如果一颗芯片的功耗过大,容易导致工作时温度过高,造成功能失效,甚至晶体管失效。因此,减小芯片功耗是很重要的一个任务。静态功耗以及动态功耗是两个主要的功耗源。

    1. 动态功耗

    动态功耗来源于:
    (1)当门翻转时,负载电容充电和放电,称为翻转功耗
    (2)pmos和nmos管的串并联结构都导通时的有短路电流,称为短路功耗

    1.1 翻转功耗

    翻转功耗可以用如下公式表示:
    Pswitch=αCVDD2fP_{switch}=\alpha C V_{DD}^2f
    α\alpha 称为活动因子,是电路节点从0跳变至1的概率。时钟的活动因子为1,因为它在每个周期都有上升和下降。大多数数据的活动因子为0.5,每周期只跳变一次。
    C称为负载电容。
    有以下办法可以降低翻转功耗:
    (1)使用门控时钟
    降低活动因子是降低功耗的非常有效的办法,如果一个电路的时钟完全关断,那么它的活动因子和动态功耗将降为0。Verilog在设计寄存器时采用下面写法可以综合成一个带门控的寄存器。

    input reg d;
    always @(posedge clk or negedge resetn) begin
        if(~resetn) 
            q<= 1'b0;
        else if(enable)
            q<= d;
    end
    

    (2) 减小毛刺
    毛刺会增大活动因子,有可能使门的活动因子增加到1以上。

    (3)减小负载电容
    电容来自于电路中的连线以及晶体管。缩短连线长度,良好的平面规划和布局可以使连线电容减小。选择较小的逻辑级数以及较小的晶体管可以减小器件的翻转电容。

    (4)电压域
    动态功耗与电压有平方的关系,降低电源电压可以显著降低功耗。将芯片划分成多个电压域,每个电压域可以根据特定电路的需要进行优化。例如,对于存储器采用高电源电压来保证存储单元的稳定性,对于处理器采用中等大小的电压,对运行速度较低的IO外围电路采用低电压。解决跨电压域信号传输的方法是使用电平转换器

    (5)动态电压调整DVS
    CPU处理不同的任务有不同的性能要求。对于低性能要求的任务,可以使时钟频率降低到足以按预定时间完成任务的最低值,然后使电压降低到该频率下工作所需要的最小值就可以节省大量的能耗。

    在这里插入图片描述

    (6)降低频率
    动态功耗正比于频率,芯片只应当工作在所要求的频率下,不能比所要求的还要快。由前面小结可以,降低频率还可以采用较低的电源电压,大大降低功耗。

    (7)谐振电路
    谐振电路通过使能量在储能元件如电容或电感之间来回传送而不是将能量泄放到来减小翻转功耗。

    1.2 短路功耗

    短路功耗发生在当输入发生翻转时,上拉和下拉网络同时部分导通的时候。如果输入信号翻转速率比较慢,那这两个网络将同时导通较长的一段时间,短路功耗也会比较大,增大负载电容可以减小短路功耗,原因是负载较大时,输出在输入跳变期间只翻转变化很小的一个量。

    短路电流一般为负载电流的10%。当输入边沿变化速度很快时,短路功耗一般只占翻转功耗的2%-10%。

    2. 静态功耗

    静态功耗主要来源于:
    (1)流过截止晶体管的亚阈值泄漏电流(subthreshold leakage)
    (2)流过栅介质的泄漏电流(gate leakage)
    (3)源漏扩散区的p-n节泄漏电流(junction leakage)
    (4)在有比电路中的竞争电流

    在这里插入图片描述

    2.1 亚阈值泄漏电流

    亚阈值泄漏电流是晶体管应当截止时流过的电流。在90nm节点之前,泄漏功耗主要在休眠模式下才考虑,这是因为它与动态功耗相比可以忽略不计。但是在低阈值电压和薄栅氧的纳米工艺中,泄漏电流占到总工作功耗的1/3。

    亚阈值泄漏电流与多种因素有关。提高源极电压或应用一个负的体电压可以减小泄漏。泄漏电流还与温度有关,限制芯片温度对于控制泄漏至关重要。另外,通过两个或更多个串联晶体管的泄漏电流会应堆叠效应(stack effect)而大大减小。例如两输入与非门,两个NMOS堆叠在一起。

    2.2 栅泄漏电流

    栅极泄漏电流发生在一个电压加到栅上时(例如当门导通时)载流子遂穿通过薄栅介质的情况下。泄漏电流与介质厚度有极强的关系。工艺中通过选择合适厚度的介质将栅泄漏电流限制到一个可接受的水平上。泄漏电流还取决于栅极电压。通过使晶体管堆叠起来并使截止晶体管靠近电源/地线可以使栅泄漏电流减小。

    2.3 结泄漏电流

    结泄漏电流发生在源或漏扩散区处在与衬底不同电位的情况下。结泄漏电流与其他泄漏电流相比时通常都很小。

    2.4 竞争电流

    静态CMOS电路没有任何竞争电流,但其他某些电路甚至在静态时本身就会吸取电流。电流模式逻辑和许多模拟电路也会吸取静态电流。这样的电路应该在休眠模式时通过禁止上拉或电流源工作来关断他们。

    2.5 降低静态功耗办法

    (1)电源门控
    减小静态电流最容易的方法就是关断休眠模块的电源。这一技术称为电源门控。
    (2) 多种阈值电压和栅氧厚度
    有选择的应用多种阈值电压可以使具有低Vt晶体管保持性能而又使具有高Vt晶体管的其他路径减少泄漏。
    大多数纳米工艺的逻辑管采用薄栅氧,IO晶体管采用厚的多的栅氧以使它们能够承受较大的电压。
    (3)可变阈值电压
    通过体效应可以调制阈值电压。在休眠模式下应用一个反向体偏置减小泄漏。在工作模式下利用一个正向体偏置来提高性能。
    (4)输入向量控制
    由前面可知,堆叠效应和输入排序会引起亚阈值泄漏和栅泄漏的变化。因此,一个逻辑模块的泄漏与门的输入有关。输入向量控制是当模块置于休眠模式时,应用一组输入图案使模块的泄漏最小。这些输入向量可以通过寄存器上的置位/复位输入端或通过扫描链加入。

    展开全文
  • 2.现在很多处理器里都包含性能计数器,这个计数器主要的作用是用来统计硬件运行过程中的事件,类似cpu运行周期数,提交的指令数等,通过分析处理器的功耗分布,选择一些与程序运行时影响功耗大的事件,分别针对动态...

    有下面几种方法:

    1.可以利用性能模拟器,类似gem5那种,模拟一个系统,得出跟功耗相关的节点翻转信息以及结构参数,把这些信息输入到功耗模拟器中,输出功耗文件
    2.现在很多处理器里都包含性能计数器,这个计数器主要的作用是用来统计硬件运行过程中的事件,类似cpu运行周期数,提交的指令数等,通过分析处理器的功耗分布,选择一些与程序运行时影响功耗大的事件,分别针对动态功耗,静态功耗进行建模

    1)动态功耗主要是监测事件中得到的,
    2)静态功耗是与温度和电压有关,由于电压相对比较稳定,只考虑温度的因素,我们可以安装一个硬件监测工具来监测,测处理器的温度----方法是:首先让 处理器接近满负载运行,迅速升温,当温度恒定,处理器处于散热/发热平衡后,停止所有的应用程序,此时监测工具监测到的温度,经过计算处理输出静态功耗)
    3.或者还有一种是在芯片上集成另外的功耗测量电路(I2R


    针对功耗模型的精粗细粒度又分为以下几种***:

    1.结构级功耗模型:分析现有的这个处理器的功能单元的功耗特性,确定各单元在不同输入向量集下的功耗行为,建立一个功耗模型
    2.门级功耗模型:一般只能针对一种功耗,如静态功耗,对门级单元进行晶体管级模拟,提取出来每个单元的功耗模型,并在这个基础上进行计算(比如synopsys公司的power compiler)
    3.晶体管级模型:把整个电路细节到晶体管级别,实现整个电路的仿真,由于仿真实现会随着电路里晶体管的数量呈现爆炸性增长,所以这种方法只适用小型的电路,不适用整个处理器芯片

    展开全文
  • 手机功耗问题浅析

    千次阅读 2018-12-07 17:31:41
    极力推荐Android 开发大总结文章:欢迎收藏程序员Android 力荐 ,Android 开发者需要的必备技能 ...2.正常待机功耗简介 3.最干净的待机电流波形 4.通过唤醒源理清正常待机问题 5.Audio Playback 功耗问题 6.Display ...

    极力推荐Android 开发大总结文章:欢迎收藏
    程序员Android 力荐 ,Android 开发者需要的必备技能

     

    本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

    1.飞行模式底电流问题
    2.正常待机功耗简介
    3.最干净的待机电流波形
    4.通过唤醒源理清正常待机问题
    5.Audio Playback 功耗问题
    6.Display 及多媒体功耗问题
    7.通话功耗问题

    1. 飞行模式底电流问题

    系统睡眠的底电流是所有功耗问题的前置条件,此时wifi 、Bluetooth、Location、Radio都处于关闭状态。

    系统睡眠的条件

    查看CPU是否进入suspend状态, suspend确切的说是 MCU (ARM)suspend, 也是CPU进入WFI(Wait For Interrupt)状态,CPU 进入WFI后,整个系统就依靠一颗 SCP:SPM(System Power Manager) 来控制 睡眠/唤醒 的流程

    灭屏到CPU 进入suspend的流程

    灭屏到CPU 进入suspend的流程

    判断系统是否进入suspend
    在kernel log中搜索关键字 Chip_pm_begin 或者 suspend entry

    查看suspend状态

    查看SPM(System Power Manager)状态

    在 kernel log 中搜索关键字 wake up by, 在kernel Log中查看R13寄存器跟debug_flag的值

    查看SPM(System Power Manager)状态

    2. 正常待机功耗简介

    待机功耗很容易出现问题,并且很难理清,因为其涉及到APK 、Modem、Wifi、Other这些不确定因素。

    功耗问题处理原则:

    1.先花时间把现象理清,到底在什么样的环境下复现。
    2.多做几个实验,给出清晰的问题描述、问题复现条件、电流波形图。
    3.提供关闭 modem 的log

    3. 最干净的待机电流波形

    最干净的待机电流波形

    4. 通过唤醒源理清正常待机问题

    1. 其他唤醒源分析

    kernel Log收缩关键字 wakeup bywakeup by xxxx ,其中 xxxx 就是唤醒源。

    image.png

    2. APK 唤醒源分析

    APK 唤醒系统是通过设置 type 0 和type 2的alarm 来唤醒系统,这两种alarm 会设置到RTC寄存器中,而RTC Module 其实是在PMIC 里面,因此APK唤醒实际上是PMICEINT唤醒。

    RTC 唤醒sys_log中搜索关键字 AlarmManager: sending alarm Alarm,查看 type 0和 type 2 的应用有哪些。

    gms包APK经常唤醒系统

    如果log没有开启,请使用adb shell dumpsys alarm log on

    5. Audio Playback 功耗问题

    Audio playback 时候MTK低端平台没有专门的audio DSP(Heilo X20除外),故无法在suspend状态下完成audio playback,故需要CPU 做这件事情。

    通话的时候之所以可以睡眠,是疑问modem 充当了dsp的角色。

    deep idle 状态

    Deep idle 实际上系统还是Active状态,因此CPU需要快速响应系统请求调度,因此 GPT唤醒源 是Deep idle的主要唤醒源。

    在 Kernel Log中搜索关键字 wake up by , 这个log是在 swapper进程 中打印出来的(代表当前CPU在运行idle task) ,并且后面可以看到 DP:的字样。

    播放MPS GPT 唤醒源 log

    MP3播放时进入deep idle状态(20mA)举例

    MP3 播放时进入deep idle 状态(20mA)举例

    区分suspend 与deep Idle

    1. suspend 是跑在 suspend workqueue 中,因此log的进程主体是kwork
    2. deep idle 是跑在idle task 中,因此log的进程主体是swapper
    3. suspend 默认不会被 GPT 唤醒。

    6.Display 及多媒体功耗问题

    手机所有亮屏的场景都是模块自身的耗电跟Display 部分耗电的叠加,所以Display 的功耗在整个系统中占比非常高。
    Display 功耗 = 硬件+平台+内容

    在 Kernel Log中搜索关键字 wake up by , 这个log是在 swapper进程 中打印出来的(代表当前CPU在运行idle task) ,并且后面可以看到 SO:的字样(通)

    Display 及多媒体功耗问题

    7. 通话电流功耗问题

    通话模式的功耗跟正常模式的功耗区别

    通话模式的功耗跟正常模式的功耗区别

    一般情况下
    GSM 功耗< 3G-TD < 3G-W 功耗

    GSM 3G-TD 功耗图

    3G-W功耗图

    飞行模式底电流 参考文档
    标准模式功耗 参考文档
    Audio PlayBack功耗 参考文档
    通话底功耗 参考文档
    Display 及多媒体功耗 参考文档

    至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

    如有侵权,请联系小编,小编对此深感抱歉,届时小编会删除文章,立即停止侵权行为,请您多多包涵。

    小礼物走一走,来简书关注我

    展开全文
  • DDR的功耗计算

    千次阅读 2018-06-30 11:47:23
    全文摘自:https://blog.csdn.net/viicauss/article/details/39027197 在进行嵌入式系统设计过程中总功耗的计算是一个无法绕开的问题,在总功耗的计算过程中尤其以SDRAM、DDR、DDR2等动态随机存储器件的功耗难以...
  • 功耗

    千次阅读 2012-09-06 14:57:38
    1.功耗来源 CMOS电路中的功耗来自两个部分: a:动态功耗: (1)当门翻转时充电放电负载电容 (2)当PMOS管和NMOS管的串并联结构都部分导通时的“短路”电流。 b:静态功耗: (1)流过截至晶体管的亚阈值...
  • Android功耗分析

    千次阅读 2018-05-10 13:44:06
    系统功耗跟踪 功耗分析 doze模式一直处于关闭状态 doze模式开启状态 功耗优化 参考 系统功耗跟踪 使用方法,搜集日志 adb shell dumpsys batterystats --reset // 运行... adb bugreport bugreport...
  • 【项目举例】FPGA功耗的那些事儿

    千次阅读 2018-03-23 14:56:43
    这就要看FPGA的功耗了,因为FPGA是可编程芯片,它的功耗和被使用的资源大小有关,例如你不能说3C120的功耗是多少多少,你只能说你的设计需要怎样的功耗。因此在原理图设计时有必要对功耗进行估计,以便于能够选择...
  • 手机功耗问题

    2019-06-21 16:47:01
    功耗问题由于涉及比较多,应该由硬件、驱动、音频、软件等同事协同分析,团队解决。但并不是说每个问题都需要所有人员参与,不同模块的功耗问题,有时候可以请专门负责的同事来解决,这样效率会提高不少。 以下内容...
  • NFC低功耗模式

    千次阅读 2013-10-15 15:56:05
  • 一、手机功耗分析二、模块功耗主要功耗场景和优化点三、测试功耗
  • CMOS电路的功耗

    万次阅读 2017-08-07 20:29:57
    CMOS功耗
  • 功耗板子测试功耗的方法

    千次阅读 2016-09-06 15:56:46
    在蓝牙、wifi、ZigBee等低功耗组网通信和智能电子设备开发过程中,功耗的调试是至关重要的一部分, 怎样简易的测试功耗以方便我们对功耗的调试呢,介绍一种万用表测试整体功耗的方法。 如图: 万用表...
  • 静态功耗具体指什么

    千次阅读 2017-03-06 11:28:05
    之前我的理解一直为静态功耗等同于关机功耗,今天专门搜索了解了下。百度百科给出的定义是指漏电流功耗,是电路状态稳定时的功耗,其数量级很小。其实这个定义很模糊,怎样的状态是电路稳定状态。我自己的理解是静态...
  • 一、功耗管理 低功耗 概述 TencentOS tiny提供了多级低功耗管理框架。初级低功耗的方案是,当系统处于“空闲”状态,也即进入idle任务时,系统调用处理器(目前支持的架构是arm v7m)低功耗接口进入短暂的睡眠...
  • 集成电路中的低功耗设计(一)

    千次阅读 2017-08-10 09:06:11
    功耗设计在现在的IC系统中非常重要,正如Intel所称:功耗问题是决定摩尔定理能否适用的唯一因素。在CMOS电路中,功耗可以分为动态功耗和静态功耗。静态功耗是电路不工作时消耗的功耗;动态功耗是当电路活动时消耗...
  • 功耗设计的几个思路

    万次阅读 2017-09-18 18:59:15
    数字电路的功耗有2部分构成,其一是静态功耗,通常表现为电子线路的漏电流,控制这部分功耗主要决定于生产工艺和所用的材料;其二是动态工作电流,而影响这部分功耗的因素很多,如电路设计的方式,线路的复杂程度,...
  • 到了2018年的今天,依然有很多人对TDP功耗有误解,不只是把TDP功耗当作处理器标称功耗,还有个关键的问题——处理器的实际功耗要比TDP功耗低还是高?能够回答对这个问题的人还真不多。 对于电脑处理器功耗,到了...
  • introduction 用PTPX的好处?作为前端设计人员来说,个人理解: ...静态漏电流功耗 本征漏电流功耗 gate漏电流功耗 动态功耗 内部功耗 switching开关功耗 设置power derating factor 生成pow...
  • MCU实现低功耗本质而言便是停止MCU工作,通过中断的方式重新唤醒MCU,这些中断可以包括外部IO中断,UART接收中断,定时器中断等等。如果结合嵌入式操作系统,可以在空任务或者空任务钩子函数中进入低功耗模式,在...
1 2 3 4 5 ... 20
收藏数 99,817
精华内容 39,926
关键字:

功耗