ESP32 deep sleep与黄山派standby模式对比

AI助手已提取文章相关产品:

ESP32 与黄山派低功耗机制深度解析:从芯片架构到工程落地

在智能家居、工业传感和远程监控等物联网场景中,设备一旦部署就可能长达数年无法更换电池。你有没有遇到过这样的情况:精心设计的传感器节点,理论续航明明有两年,结果三个月就没电了?🤯 很多开发者都曾被“功耗黑洞”坑得怀疑人生——表面上一切正常,实测电流却高出预期十倍!

问题往往出在对低功耗机制的理解停留在表面。比如你以为调用一句 esp_deep_sleep_start() 就万事大吉,殊不知一个悬空的GPIO就能让休眠电流飙升到50μA以上;又或者你在Linux系统里执行 echo mem > /sys/power/state ,却发现板子根本进不了standby模式,只因某个驱动没注册suspend回调。

这背后,其实是两种截然不同的低功耗哲学在碰撞:一边是ESP32这类MCU通过 最小化运行 实现极致节能,另一边是黄山派这类嵌入式Linux平台借助 系统级挂起 维持复杂上下文。它们不是简单的“谁更省电”,而是代表了两类完全不同的技术路径选择。

今天我们就来一次彻底拆解,不讲套话,不说官话,带你从电源域划分、时钟门控、内存保持策略,一直挖到实际调试技巧和工程优化方法。准备好了吗?我们先从最接地气的ESP32开始👇


深度睡眠 ≠ 关机重启:ESP32 的 μA 级节能密码

很多人误以为deep sleep就是关机再开机,其实不然。ESP32的deep sleep是一种“半冻结”状态——CPU核心、主RAM、Wi-Fi/BT射频模块全部断电,但RTC(实时时钟)模块仍在悄悄工作,就像冬眠中的动物,新陈代谢降到极低,随时能被唤醒。

电源域是怎么玩的?

ESP32内部被划分为多个独立供电区域,这种“按需供电”的设计才是超低功耗的核心秘密。你可以把它想象成一栋大楼的不同楼层:

电源域 编号 主要组件 是否可在Deep Sleep中关闭
VDD_SDIO PD0 SDIO外设、部分GPIO保持 否(可选配置)
RTC_DOMAIN PD1 RTC控制器、ULP协处理器、RTC内存 是(默认开启)
DIG_DOMAIN PD2 CPU、主RAM、数字外设(UART/SPI等) 是(完全关闭)
AON_DOMAIN PD3 始终在线模块(如复位逻辑)

看到没?只有真正需要的部分才通电,其他统统切断。但这套机制也埋下了隐患:如果某个外设没处理好,就会成为“漏电点”。举个真实案例:某团队做环境监测仪,deep sleep电流始终在30μA左右下不来,最后发现是因为一个连接上拉电阻的GPIO没有设置为高阻态,白白消耗了25μA!😱

所以记住这条黄金法则: 进入sleep前必须清理所有非必要资源

// 示例:手动控制电源策略(高级用法)
#include "esp_pm.h"
esp_pm_config_t pm_config = {
    .max_freq_mhz = 80,
    .min_freq_mhz = 40,
    .light_sleep_enable = true
};
esp_pm_configure(&pm_config);

这段代码看起来只是设置了频率范围,但它实际上影响了系统何时进入轻度睡眠(light sleep)。注意⚠️:它并不会直接触发deep sleep,真正的入口是 esp_sleep_enable_xxx_wakeup() + esp_deep_sleep_start() 组合拳。

💡 小贴士 :PMU会根据负载自动判断是否进入light sleep,但在电池供电场景中,建议主动干预,避免不必要的抖动唤醒。


RTC内存 & ULP协处理器:让你的数据“活”过休眠

既然主RAM断电了,那关键数据怎么保留?ESP32提供了两块由RTC电源域供电的内存区:

  • RTC Slow Memory :约8KB,适合存储全局变量
  • RTC Fast Memory :约16KB,访问更快一些

使用方式很简单,加个宏就行:

RTC_DATA_ATTR static int boot_count = 0;

void app_main() {
    boot_count++;
    printf("Booting for the %dth time\n", boot_count);

    esp_sleep_enable_timer_wakeup(5 * 1000000); // 5秒后唤醒
    esp_deep_sleep_start();
}

每次唤醒, boot_count 都会递增,说明它的值跨过了休眠周期!👏 这对于记录重启次数、累计运行时间非常有用。

但别高兴太早——这块内存容量有限,且访问速度慢,频繁读写会影响性能。更酷的是,ESP32还内置了一个 ULP-RISC-V协处理器 (或传统版本中的ULP-coprocessor),它可以在主CPU休眠时独立运行简单程序,比如采集ADC电压、检测温度变化。

想象一下这个场景:太阳能监控摄像头白天充电,晚上靠电池工作。你希望它只在有人经过时才唤醒拍照上传,否则一直睡觉。这时候就可以让ULP每秒钟检查一次PIR传感器,只有检测到移动才唤醒主核。这样即使连续睡一个月,也不会多耗一滴电🔋。

void ulp_load_and_start() {
    extern const uint8_t sensor_program_bin_start[] asm("_binary_ulp_sensor_program_bin_start");
    esp_err_t err = ulp_riscv_load_binary(sensor_program_bin_start, 
                                          (const uint8_t*)&sensor_program_bin_end - sensor_program_bin_start);
    if (err != ESP_OK) {
        ESP_LOGE("ULP", "Failed to load program: %d", err);
        return;
    }
    ulp_set_wakeup_period(0, 1000000); // 每1秒唤醒一次ULP
    ulp_riscv_run();
}

ULP加载的是预先编译好的二进制程序( .bin 文件),通常由汇编语言编写。虽然开发门槛略高,但换来的是惊人的能效比提升。


唤醒方式三巨头:定时、中断、ULP联动

光会睡还不够,还得知道怎么醒。ESP32支持多种唤醒源,合理搭配才能构建智能系统。

定时唤醒:周期性任务的首选

最常见的就是每隔几分钟上报一次温湿度数据。API很简单:

#include "esp_sleep.h"

void configure_timer_wakeup(uint64_t sleep_us) {
    esp_sleep_enable_timer_wakeup(sleep_us);
    printf("Entering deep sleep for %.2f seconds...\n", sleep_us / 1000000.0);
    esp_deep_sleep_start();
}

参数单位是微秒,最大支持约890万年(理论上 😂),实际受限于RTC精度。如果你用了外部32.768kHz晶振,典型误差为±20ppm,也就是每天偏差约1.7秒。对于高精度需求,可以做校准补偿:

int64_t rtc_cal = esp_clk_slowclk_cal_get();
float period_ms = (float)(sleep_us / 1000) * ((float)rtc_cal / 1024);

另外记得提前关闭Wi-Fi/BT,否则radio模块可能无法完全下电:

esp_wifi_stop();
esp_bluedroid_disable();

不然你会发现sleep电流莫名其妙高了一截!

外部中断唤醒:事件驱动的灵魂

安防系统里的红外感应、工业PLC的急停按钮,都需要外部事件触发唤醒。ESP32支持最多5个RTC GPIO作为唤醒源:

void setup_gpio_wakeup() {
    const int BUTTON_GPIO = 35;
    gpio_config_t io_conf = {
        .pin_bit_mask = BIT64(BUTTON_GPIO),
        .mode = GPIO_MODE_INPUT,
        .pull_up_en = GPIO_PULLUP_ENABLE,
        .pull_down_en = GPIO_PULLDOWN_DISABLE,
        .intr_type = GPIO_INTR_NEGEDGE  // 下降沿触发
    };
    gpio_config(&io_conf);
    esp_sleep_enable_ext1_wakeup(BIT64(BUTTON_GPIO), ESP_EXT1_WAKEUP_ALL_LOW);
}

这里有个细节:EXT1支持“任意高”或“全部低”两种逻辑模式,非常适合做密码解锁或多源中断判断。而EXT0只能用于单引脚电平变化唤醒。

下面是几种常见唤醒方式对比:

唤醒类型 API 支持引脚数 触发条件 适用场景
EXT0 esp_sleep_enable_ext0_wakeup() 1个RTC GPIO 电平变化 单键唤醒
EXT1 esp_sleep_enable_ext1_wakeup() 最多5个 多引脚组合 密码解锁、多源中断
UART esp_sleep_enable_uart_wakeup() UART0/1 接收字符 AT命令唤醒

✅ 提示:尽量使用内部上下拉,避免浮空导致误唤醒。

ULP协同唤醒:永远在线但几乎不耗电

结合ULP和deep sleep,你能做出“事件驱动型”感知系统。例如冷链运输监控,要求温度超过阈值立即报警:

// ulp_sensor_program.c (运行在ULP-RISCV上)
#include "ulp_riscv.h"

void entry() {
    int temp = read_temperature_adc(); // 自定义ADC读取
    if (temp > THRESHOLD_TEMP) {
        ulp_riscv_core_wake_up(); // 唤醒主CPU
    }
    ulp_riscv_timer_resume(); // 继续休眠
}

整个流程如下:
1. 编译ULP程序为 .bin 文件;
2. 主程序调用 ulp_riscv_load_binary() 加载;
3. 启动ULP循环扫描;
4. 条件满足则唤醒主核处理告警。

主CPU全程处于deep sleep,平均功耗极低,完美适配长周期任务。


实测才是硬道理:功耗测量与调试实战

理论再美好,也要经得起实测考验。错误配置可能导致实际电流高出预期十倍以上!

如何准确测量sleep电流?

推荐方案:
- 高端:Keysight N2891A电流探头 + 示波器
- 平价替代:分流电阻(shunt resistor)+ ADC采样

Python伪代码示例(解析CSV日志):

import pandas as pd
data = pd.read_csv("current_log.csv")
sleep_phase = data[(data['time'] > 10) & (data['time'] < 15)]  # 提取第10~15秒数据
avg_sleep_current = sleep_phase['current'].mean()
print(f"Average deep sleep current: {avg_sleep_current:.2f} μA")

典型功耗分布参考:

工作阶段 平均电流 持续时间 能量占比
Active (WiFi Tx) 180 mA 500 ms ~60%
Sensor Read 20 mA 100 ms ~5%
Deep Sleep 6.2 μA 9 min 50 s ~35%

看出重点了吗?无线传输才是能耗大户!哪怕只持续半秒,贡献的能量消耗也远超长时间休眠。优化方向应优先考虑减少通信频率,或改用LoRa等更低功耗通信方式。

平均功耗怎么算?

建立数学模型有助于评估整体能效:

$$
I_{avg} = \frac{I_{active} \cdot T_{active} + I_{sleep} \cdot T_{sleep}}{T_{cycle}}
$$

代入实测值:
- $I_{active} = 180\text{mA}, T_{active}=0.6\text{s}$
- $I_{sleep} = 6.2\mu\text{A}, T_{sleep}=599.4\text{s}$
- $T_{cycle}=600\text{s}$

计算得:
$$
I_{avg} ≈ 180.6\mu\text{A}
$$

这意味着使用2000mAh电池,理论续航可达 11,070小时 (约15个月),远优于未优化系统(通常仅数周)。

常见问题排查清单
问题现象 可能原因 解决方案
系统无法进入deep sleep 存在未释放的资源(如WiFi连接) 调用 esp_wifi_stop() 后再sleep
频繁自动唤醒 GPIO浮空导致误触发 设置内部上下拉或禁用无关中断
唤醒后崩溃 RTC内存越界访问 检查 RTC_DATA_ATTR 变量大小
功耗过高(>50μA) 外设未断电 关闭LED、蜂鸣器、传感器供电

定位唤醒源神器:

esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause();
switch (cause) {
    case ESP_SLEEP_WAKEUP_TIMER:
        ESP_LOGI(TAG, "Woke up due to timer");
        break;
    case ESP_SLEEP_WAKEUP_EXT1:
        ESP_LOGI(TAG, "Woke up due to GPIO");
        break;
    default:
        ESP_LOGW(TAG, "Unknown wakeup reason");
}

性能优化四大杀招

缩短唤醒时间 = 降低平均功耗

每一次唤醒都是能量爆发。缩短active时间是降低$I_{avg}$的关键。

优化措施包括:

  • 使用SPI RAM扩展堆空间,避免频繁GC;
  • 预初始化WiFi/BT驱动,减少连接延迟;
  • 采用MQTT Keep Alive机制减少重连开销;
  • 数据本地聚合后批量发送。
#define BATCH_SIZE 5
static sensor_data_t buffer[BATCH_SIZE];
static int buf_index = 0;

void record_and_upload(float value) {
    buffer[buf_index].temp = value;
    buffer[buf_index].ts = get_timestamp();
    buf_index++;

    if (buf_index >= BATCH_SIZE) {
        send_batch_to_cloud(buffer, BATCH_SIZE);
        buf_index = 0;
    }
}
外设断电顺序不能乱

很多项目忽视了外设电源管理。正确的做法是在sleep前切断所有非必要负载:

void prepare_for_sleep() {
    disable_sensor_power();     // 控制MOSFET关断传感器VCC
    turn_off_status_led();      // 关闭状态灯
    gpio_set_direction(PWR_EN_PIN, GPIO_MODE_OUTPUT);
    gpio_set_level(PWR_EN_PIN, 0); // 切断外接模块供电
}

建议使用PMOS管控制外设供电,由GPIO低电平导通,确保sleep时自动断开。

结合FreeRTOS实现智能休眠决策

在复杂系统中,不能盲目进入deep sleep。应基于任务队列状态动态决策:

void power_manager_task(void *pvParameter) {
    while (1) {
        vTaskDelay(pdMS_TO_TICKS(1000));

        if (uxQueueMessagesWaiting(upload_queue) == 0 &&
            is_network_connected()) {
            enter_deep_sleep(60 * 1000000); // 60秒后唤醒
        }
    }
}

该任务监听上传队列,仅当无待发数据且网络就绪时才允许休眠,避免丢失实时事件。


黄山派 standby 模式:Linux 系统下的 suspend-to-RAM 实践

如果说ESP32是“游击战专家”,那黄山派就是“正规军指挥官”。它基于RISC-V架构,支持完整Linux系统,其standby模式本质上是 suspend-to-RAM ——将整个系统的运行状态冻结并保留在DRAM中,主CPU停止执行指令,大部分I/O进入高阻态。

这种模式特别适合需要长期待机、具备快速恢复能力且运行复杂服务的边缘计算设备,比如智能网关、工业HMI终端。

RISC-V 核心的低功耗基因

基础RISC-V ISA(如RV32IMAC)本身不包含电源管理指令,但黄山派定制内核引入了专为低功耗设计的扩展指令集:

指令 功能描述 所属扩展 运行权限
wfi 停止指令执行,等待中断 Zicsr / Zicfil M/S模式
pwrdown 请求系统级断电 自定义Xpm Machine模式
retsi 中断返回并恢复现场 Zicsr M模式

这些指令构成了软件与硬件之间的桥梁。以 wfi 为例:

  1. CPU检测到 wfi 后,立即停止取指流水线;
  2. 当前PC值和寄存器状态由硬件自动保存;
  3. 控制权移交至SPMC(System Power Management Controller);
  4. 若无有效中断待处理,则逐步关闭PLL、切断CPU_VDD;
  5. 系统进入低功耗状态,直到任一唤醒事件触发。

过程完全透明于应用层,体现了RISC-V“简洁ISA + 强大协处理器”的理念。


SPMC:系统级电源管理的大脑

SPMC是黄山派实现standby的核心组件,负责统筹多达7个独立电源域(CPU Core PD、DDR PHY PD、Peripheral I/O PD、RTC PD等)。每个电源域均可独立上电/断电,支持精细粒度控制。

SPMC通过专用CSR寄存器暴露接口:

  • SPMC_PD_CTRL0 : 电源域使能控制
  • SPMC_WAKE_MASK : 唤醒源掩码设置
  • SPMC_PWR_STATUS : 当前各域供电状态查询

进入standby前,Linux内核会调用SPMC驱动的 suspend_enter() 回调函数:

static int huangshan_spmc_suspend(void)
{
    spmc_write(SPMC_WAKE_MASK, WAKE_SRC_RTC | WAKE_SRC_GPIO0);
    spmc_power_down_domain(PD_PERIPH);
    spmc_power_down_domain(PD_GPU);
    ddr_set_self_refresh(1);
    __asm__ volatile ("pwrdown");
    return 0;
}

逐行解读:
1. 屏蔽非必要唤醒源;
2. 关闭外围电源域;
3. DDR进入自刷新模式;
4. 执行断电指令。

该函数运行在Machine模式下,具有最高权限,确保安全访问所有电源寄存器。


内存与总线状态保持机制

standby期间,DRAM必须继续保持供电以维持数据完整性,但可切换至 自刷新(Self-refresh)模式 。黄山派支持LPDDR4颗粒,其自刷新电流典型值约为80μA per bank。

此时:
- DDR控制器周期性发出 auto-refresh 命令;
- AXI总线主设备全部断开;
- AHB桥接器关闭时钟门控;
- 片上NoC网络进入idle freeze模式;

某些关键外设(如RTC、看门狗定时器)仍连接至Always-on Domain,可在休眠期间继续运行。

不同内存策略功耗对比:

内存策略 是否支持Standby 典型功耗(μA) 数据保留时间
Full DRAM Retention ✅ 是 ~1200 无限期
Self-refresh DRAM ✅ 是 ~800 受温度影响
PSRAM Low-power mode ⚠️ 部分支持 ~600 数小时
Off-chip SRAM power down ❌ 否 <50 数据丢失

建议优先选用支持自刷新的DRAM方案,并通过设备树明确指定属性:

memory@80000000 {
    device_type = "memory";
    reg = <0x80000000 0x80000000>;
    power-domains = <&spmc PD_DDR>;
    self-refresh-enable;
};

两大平台终极对决:如何选型?

别再问“哪个更好”了,关键看你要解决什么问题!

架构本质差异一览表

特性 ESP32 (FreeRTOS) 黄山派 (Linux)
唤醒延迟 < 5ms 20~100ms
中断响应确定性 高(硬实时可调优) 中等(受内核调度影响)
系统启动时间 < 100ms > 500ms(含 bootloader)
是否支持 deep sleep ✅ 支持 ❌ 不适用
是否支持 standby ❌ 不原生支持 ✅ 支持
场景1:传感器节点(长期待机+周期上报)

以每30秒上传一次数据为例:

平台 工作电流 休眠电流 平均功耗 续航估算(2000mAh电池)
ESP32 80mA (Wi-Fi传输) 5μA ~130μA ≈ 700 天
黄山派 150mA (网络栈开销大) 800μA ~26mA ≈ 30 天

ESP32完胜!在极低频通信场景下,它的超低休眠功耗优势明显。

场景2:边缘网关(间歇工作+快速响应)

需维持TCP长连接并处理消息。此时黄山派凭借Linux的epoll机制与内核级电源管理更具适应性:

# 用户空间触发 standby
echo mem > /sys/power/state

系统会自动执行suspend流程,所有外设进入低功耗状态。

场景3:移动终端(用户交互驱动)

带触摸屏的便携设备,用户期望“按下即亮”。黄山派可通过中断快速恢复图形界面,而ESP32缺乏图形加速能力难以胜任。


成本、生态与维护性对比

项目 ESP32 黄山派
主芯片单价 $2.5 $9.8
外围元件数量 少(集成 Wi-Fi/BT) 多(DDR、PMIC、eMMC)
PCB 层数建议 2层 4层以上
功耗监测难易度 易(直接测主供电轨) 复杂(多电源域分离测量)

ESP32文档完善,社区活跃,GitHub相关项目超10万条;黄山派目前主要依赖厂商SDK,社区支持较弱。

固件升级方面,ESP32支持OTA但受限于Flash容量;黄山派可部署容器化系统,支持差分升级、回滚、日志上报,更适合企业级部署。


工程实践方法论:打造高效低功耗系统

决策矩阵:根据业务周期选平台

周期频率 推荐平台 理由
< 1min ESP32 快速启停、低漏电
1~10min 视功能定 若需联网服务选黄山派
> 10min 均可 优先考虑成本与生态

混合架构:双芯协同才是王道

在复合型设备中,可采用“主控+协处理器”架构:

  • 主控芯片 :黄山派负责UI渲染、云通信;
  • 协处理器 :ESP32-C3专责传感器采集与本地逻辑判断;
  • 两者通过UART通信,主控在无事件时进入standby,由ESP32检测异常后唤醒。

已在部分工业手持终端中落地,兼顾能效与智能性。

构建自动化测试框架

用Python + 串口 + 功率计搭建回归测试脚本:

import serial
import time
import pyvisa

def measure_avg_current(port, duration=300):
    ser = serial.Serial(port, 115200)
    rm = pyvisa.ResourceManager()
    dmm = rm.open_resource('USB0::0x0957::0x0607::MY5xxxxx::INSTR')  # 是德科技万用表

    start_time = time.time()
    currents = []

    while time.time() - start_time < duration:
        try:
            line = ser.readline().decode().strip()
            if "SLEEP_ENTER" in line:
                print(f"[{time.time()}] Device entered sleep")
            elif "WAKEUP" in line:
                print(f"[{time.time()}] Device woken up")
        except:
            pass

        current_val = float(dmm.query("MEAS:CURR?"))
        currents.append(current_val)

        time.sleep(1)

    avg = sum(currents) / len(currents)
    print(f"Average current over {duration}s: {avg:.2f} mA")
    return avg

可用于持续监控不同固件版本下的实际功耗表现,形成闭环优化流程。


写在最后

ESP32的deep sleep和黄山派的standby,看似是两种低功耗技术,实则是两种系统哲学的体现:

  • ESP32 走的是“极致简化”路线:尽可能少地运行,用最低代价完成任务;
  • 黄山派 则追求“无缝体验”:哪怕休眠,也要保持完整的系统上下文,随时恢复复杂交互。

没有绝对的好坏,只有是否匹配你的场景。下次当你面对一个新的IoT项目时,不妨先问问自己:

👉 设备多久唤醒一次?
👉 是否需要保持网络连接?
👉 用户能否接受几秒的启动延迟?
👉 固件是否会频繁升级?

答案自然浮现。而这,才是真正的低功耗设计之道。✨

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

您可能感兴趣的与本文相关内容

### ESP32在Arduino环境下的睡眠模式实现 ESP32支持多种低功耗模式,其中包括深度睡眠(Deep Sleep)、轻度睡眠(Light Sleep)以及待机模式Standby Mode)。这些模式能够有效减少设备的能耗,在电池供电或对续航时间有较高要求的情况下尤为重要[^1]。 #### 深度睡眠模式简介 深度睡眠是一种极端节能的状态,在此状态下大部分芯片功能会被关闭,仅保留RTC外设和少量RAM用于维持基本操作。进入深度睡眠后,可以通过外部GPIO中断或者定时器来唤醒设备。为了启用这种模式,开发者可以调用`esp_deep_sleep_start()` API函数,并通过配置电源管理寄存器进一步优化功耗表现。 以下是基于Arduino IDE的一个简单示例程序,展示如何让ESP32进入深度睡眠状态: ```cpp #include <WiFi.h> void setup() { Serial.begin(115200); // 进入深度睡眠前的操作逻辑 WiFi.disconnect(true); // 断开Wi-Fi连接以节省电量 delay(100); // 设置唤醒源为定时器,单位微秒 (此处设置为60秒) esp_sleep_enable_timer_wakeup(60 * 1000000); // 打印即将进入深度睡眠的消息 Serial.println("Entering deep sleep..."); } void loop() { // 主循环为空,因为所有工作都在setup完成之后转入深度睡眠 } ``` 上述代码展示了如何利用`esp_sleep_enable_timer_wakeup()`方法指定一个计时器作为唤醒条件,当达到设定的时间间隔时自动退出深度睡眠。 #### MicroPython中的深度睡眠应用实例 除了Arduino平台之外,在MicroPython框架下也可以轻松实现类似的深度睡眠控制流程。下面给出了一段使用`machine.deepsleep()`接口的例子[^2]: ```python import machine from time import sleep_ms uart = machine.UART(1, baudrate=9600) led = machine.Pin(2, machine.Pin.OUT) while True: data = uart.read() if data is not None: print("Received data:", data.decode()) led.value(not led.value()) # 切换LED状态 sleep_ms(500) # 延迟半秒钟 # 启动深度睡眠模式,持续时间为60秒 machine.deepsleep(60000) ``` 该脚本同样实现了周期性的休眠机制,不过它采用了不同的语法结构适应于MicroPython生态系统的需求。 #### 最佳实践建议 - **选择合适的唤醒方式**: 可根据具体应用场景决定采用何种类型的触发事件来结束当前的睡眠阶段,比如超时、按键按下或是其他传感器信号变化等。 - **保存必要参数至非易失存储区**: 如果应用程序依赖某些运行期间产生的动态变量,则需考虑将其写入Flash或其他形式的永久性记忆体之中以便重启恢复时重新加载。 - **断开端口通信链路**: 在准备切换到省电模式之前应确保释放掉任何活跃的数据传输通道,防止意外干扰引起不必要的电流消耗[^3]. ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值