Battery Reset的4大原因

Battery Stats Reset的4大原因:

一、读电池文件异常执行reset[BatteryStatsImpl.RESET_REASON_CORRUPT_FILE]

  1. 超过200个持锁;

  2. 超过200个syn或job;

  3. 超过1000个sensor;

  4. 超过1000个processes;

  5. 超过1000个应用;

  6. 超过1000个alarm

  7. 超过10000个service

二、命令行执行reset[BatteryStatsImpl.RESET_REASON_ADB_COMMAND]

adb dumpsys batterystats --reset

三、充电执行reset[BatteryStatsImpl.RESET_REASON_FULL_CHARGE]

  1. 充满电状态

  2. 电量百分比90%以上,

  3. 电量百分比从20%以下到80%以上

  4. 充电期间累计总充电量百分比>200%

四、开机检测到power buckets改变执行reset[BatteryStatsImpl.RESET_REASON_MEASURED_ENERGY_BUCKETS_CHANGE]

每次开机检测当前机型所支持的POWER_BUCKET_的类别和数量是否发生改变,若和上次开机不同,则表示可能存在兼容性差异(MeasuredEnergyStatsConfig.isCompatible(config)),需要reset 可能场景举例:换电池或刷其他power_profile的版本

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

@IntDef(prefix = {"POWER_BUCKET_"}, value = {
            POWER_BUCKET_UNKNOWN,
            POWER_BUCKET_SCREEN_ON,
            POWER_BUCKET_SCREEN_DOZE,
            POWER_BUCKET_SCREEN_OTHER,
            POWER_BUCKET_CPU,
            POWER_BUCKET_WIFI,
            POWER_BUCKET_BLUETOOTH,
            POWER_BUCKET_GNSS,
            POWER_BUCKET_MOBILE_RADIO,
    })


    private static final int[] SUPPORTED_PER_PROCESS_STATE_STANDARD_ENERGY_BUCKETS = {
            MeasuredEnergyStats.POWER_BUCKET_CPU, // CPU 电量消耗桶
            MeasuredEnergyStats.POWER_BUCKET_MOBILE_RADIO,// Modem 电量消耗桶
            MeasuredEnergyStats.POWER_BUCKET_WIFI,// WIFI 电量消耗桶
            MeasuredEnergyStats.POWER_BUCKET_BLUETOOTH,// 蓝牙 电量消耗桶
    };

本次开机检测到与上一次开机CPU、Modem、WIFI、蓝牙的电量消耗桶发生变化了,之前的数据可能不可靠,需要进行重置

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

200      public static final int RESET_REASON_CORRUPT_FILE = 1;
201      public static final int RESET_REASON_ADB_COMMAND = 2;
202      public static final int RESET_REASON_FULL_CHARGE = 3;
203      public static final int RESET_REASON_MEASURED_ENERGY_BUCKETS_CHANGE = 4;


15536              if (!mNoAutoReset && mSystemReady
15537                      && (oldStatus == BatteryManager.BATTERY_STATUS_FULL
15538                      || level >= 90
15539                      || (mDischargeCurrentLevel < 20 && level >= 80)
15540                      || getHighDischargeAmountSinceCharge() >= 200)) {
15541                  Slog.i(TAG, "Resetting battery stats: level=" + level + " status=" + oldStatus
15542                          + " dischargeLevel=" + mDischargeCurrentLevel
15543                          + " lowAmount=" + getLowDischargeAmountSinceCharge()
15544                          + " highAmount=" + getHighDischargeAmountSinceCharge());


267      private static final int[] SUPPORTED_PER_PROCESS_STATE_STANDARD_ENERGY_BUCKETS = {
268              MeasuredEnergyStats.POWER_BUCKET_CPU,
269              MeasuredEnergyStats.POWER_BUCKET_MOBILE_RADIO,
270              MeasuredEnergyStats.POWER_BUCKET_WIFI,
271              MeasuredEnergyStats.POWER_BUCKET_BLUETOOTH,
272      };

109          /**
110           * Returns true if the supplied Config is compatible with this one and therefore
111           * data collected with one of them will work with the other.
112           */
113          public boolean isCompatible(Config other) {
114              return Arrays.equals(mSupportedStandardBuckets, other.mSupportedStandardBuckets)
115                      && Arrays.equals(mCustomBucketNames, other.mCustomBucketNames)
116                      && Arrays.equals(mSupportedMultiStateBuckets,
117                      other.mSupportedMultiStateBuckets)
118                      && Arrays.equals(mStateNames, other.mStateNames);
119          }

logcat|grep -Ei "isCompatible|initEnergyConsumerStatsLocked"

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,这里给出一个STM32F103小程序的参考代码,通过ADC模块测量电压并通过串口发送给PC端显示。假设我们将测试的3个电压分别连接到ADC1的通道0、通道1和通道2上,串口波特率为115200。 ```c #include "stm32f10x.h" #include "stdio.h" void ADC_Config(void); void USART_Config(void); void USART_SendChar(uint8_t ch); int main(void) { uint16_t battery_value = 0; uint16_t source_value = 0; uint16_t ground_value = 0; float battery_voltage = 0; float source_voltage = 0; float ground_voltage = 0; char voltage_str[20]; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1 | RCC_APB2Periph_USART1, ENABLE); ADC_Config(); USART_Config(); while(1) { // 测量电池电压 ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_28Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); battery_value = ADC_GetConversionValue(ADC1); battery_voltage = (float)battery_value / 4096 * 3.3 * 2; // 测量电源电压 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_28Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); source_value = ADC_GetConversionValue(ADC1); source_voltage = (float)source_value / 4096 * 3.3; // 测量地线电压 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_28Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); ground_value = ADC_GetConversionValue(ADC1); ground_voltage = (float)ground_value / 4096 * 3.3; // 发送电压值到串口 sprintf(voltage_str, "Battery voltage: %.2fV\r\n", battery_voltage); for(int i=0; i<strlen(voltage_str); i++) USART_SendChar(voltage_str[i]); sprintf(voltage_str, "Source voltage: %.2fV\r\n", source_voltage); for(int i=0; i<strlen(voltage_str); i++) USART_SendChar(voltage_str[i]); sprintf(voltage_str, "Ground voltage: %.2fV\r\n", ground_voltage); for(int i=0; i<strlen(voltage_str); i++) USART_SendChar(voltage_str[i]); } } void ADC_Config(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // ADC GPIO配置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); // ADC配置 RCC_ADCCLKConfig(RCC_PCLK2_Div6); ADC_DeInit(ADC1); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); } void USART_Config(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // USART GPIO配置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // USART配置 USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } void USART_SendChar(uint8_t ch) { USART_SendData(USART1, (uint8_t) ch); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } ``` 在串口调试工具上,可以看到输出的电压值,例如: ``` Battery voltage: 2.53V Source voltage: 3.24V Ground voltage: 0.00V ``` 需要注意的是,电池电压的测量需要注意电路中的分压比例,以避免过高或过低的电压损坏ADC模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值