31、Linux系统电源管理:从电源域到唤醒源的深度解析

Linux系统电源管理:从电源域到唤醒源的深度解析

1. 电源域的概念

电源域在不同视角下有不同的定义:
- 技术层面 :电源域是共享电源资源(如时钟或电源平面)的一组设备。
- 内核视角 :电源域是一组设备,其电源管理在子系统级别使用相同的回调集和通用的PM数据。
- 硬件视角 :电源域是用于管理电源电压相关设备的硬件概念,例如视频核心IP与显示IP共享一条电源轨。

由于SoC设计日益复杂,需要一种抽象方法来使驱动尽可能通用,于是出现了通用电源域(Generic Power Domain,genpd)。它是Linux内核的一种抽象,将每个设备的运行时电源管理扩展到共享电源轨的一组设备。此外,电源域在设备树中定义,描述了设备与电源控制器之间的关系,这使得电源域可以动态重新设计,驱动程序无需重启整个系统或重建新内核即可适应变化。

如果设备存在电源域对象,其PM回调将优先于总线类型(或设备类或类型)回调。相关的通用文档可在 Documentation/devicetree/bindings/power/power_domain.txt 内核源文件中找到,特定SoC的文档也可在同一目录中找到。

2. 系统挂起和恢复序列

struct dev_pm_ops 数据结构的引入有助于理解PM核心在挂起或恢复阶段执行的步骤和操作,其完整的系统PM链如下:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    A([prepare]):::startend --> B(Suspend):::process
    B --> C(suspend_late):::process
    C --> D(suspend_noirq):::process
    D --> E(Wakeup):::process
    E --> F(resume_noirq):::process
    F --> G(resume_early):::process
    G --> H(resume):::process
    H --> I([complete]):::startend

这个流程对应于 include/linux/suspend.h 中定义的 enum suspend_stat_step 枚举。在Linux内核代码中, enter_state() 函数由系统电源管理核心调用,用于使系统进入睡眠状态。下面详细介绍系统挂起和恢复过程中实际发生的操作。

2.1 挂起阶段

enter_state() 在挂起时会经历以下步骤:
1. 同步文件系统 :如果未设置 CONFIG_SUSPEND_SKIP_SYNC 内核配置选项,则首先在文件系统上调用 sync() (参见 ksys_sync() )。
2. 调用挂起通知器 :在用户空间仍然存在时调用挂起通知器,可参考 register_pm_notifier() 进行注册。
3. 冻结任务 :调用 suspend_freeze_processes() 冻结用户空间和内核线程。如果内核配置中未设置 CONFIG_SUSPEND_FREEZER ,则跳过此步骤。
4. 挂起设备 :调用驱动程序注册的每个 .suspend() 回调,这是挂起的第一阶段(参见 suspend_devices_and_enter() )。
5. 禁用设备中断 :调用 suspend_device_irqs() 禁用设备中断,防止设备驱动程序接收中断。
6. 第二阶段挂起设备 :调用 .suspend_noirq 回调,此步骤称为无中断(noirq)阶段。
7. 禁用非引导CPU :使用CPU热插拔禁用非引导CPU,并通知CPU调度器在这些CPU离线前不要调度任何任务(参见 disable_nonboot_cpus() )。
8. 关闭中断 :关闭系统的中断。
9. 执行系统核心回调 :调用 syscore_suspend() 执行系统核心回调。
10. 使系统进入睡眠状态 :将系统置于睡眠状态。

这些操作的行为可能会根据系统要进入的睡眠状态略有不同。

2.2 恢复阶段

当系统挂起后,一旦发生唤醒事件,系统需要恢复。PM核心执行以下步骤来唤醒系统:
1. 唤醒信号 :接收到唤醒信号。
2. 运行CPU唤醒代码 :执行CPU的唤醒代码。
3. 执行系统核心回调 :执行系统核心回调。
4. 打开中断 :打开系统的中断。
5. 启用非引导CPU :使用CPU热插拔启用非引导CPU。
6. 设备恢复的第一阶段 :调用 .resume_noirq() 回调。
7. 启用设备中断 :启用设备的中断。
8. 设备恢复的第二阶段 :调用 .resume() 回调。
9. 解冻任务 :解冻之前冻结的任务。
10. 调用通知器 :当用户空间恢复后调用通知器。

从驱动程序的角度来看,这些步骤是透明的。驱动程序只需根据希望参与的步骤,在 struct dev_pm_ops 中填充适当的回调即可。

3. 实现系统睡眠能力

系统睡眠和运行时PM虽然相关,但却是不同的概念。在某些情况下,以不同方式操作可能会使系统达到相同的物理状态,因此通常不建议用一个替代另一个。

设备驱动程序通过根据需要参与的睡眠状态,在 struct dev_pm_ops 数据结构中填充一些回调来参与系统睡眠。常见的回调及其定义如下:
| 回调 | 描述 |
| ---- | ---- |
| .suspend | 在系统进入保留主内存内容的睡眠状态之前执行。 |
| .resume | 在系统从保留主内存内容的睡眠状态唤醒后调用,设备在此回调运行时的状态取决于设备所属的平台和子系统。 |
| .freeze | 特定于休眠,在创建休眠映像之前执行。类似于 .suspend ,但不应使设备能够发出唤醒事件或更改其电源状态。大多数实现此回调的设备驱动程序只需将设备设置保存在内存中,以便在后续从休眠恢复时使用。 |
| .thaw | 特定于休眠,在创建休眠映像后或映像创建失败时执行。也在尝试从此类映像恢复主内存内容失败后执行。必须撤销先前 .freeze 所做的更改,以使设备的操作方式与调用 .freeze 之前相同。 |
| .poweroff | 特定于休眠,在保存休眠映像后执行。类似于 .suspend ,但无需将设备设置保存在内存中。 |
| .restore | 特定于休眠,在从休眠映像恢复主内存内容后执行。类似于 .resume 。 |

为了提高代码可读性或便于回调填充,PM核心提供了一些宏:

3.1 SET_SYSTEM_SLEEP_PM_OPS宏

#define SET_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \
        .suspend = suspend_fn, \
        .resume = resume_fn, \
        .freeze = suspend_fn, \
        .thaw = resume_fn, \
        .poweroff = suspend_fn, \
        .restore = resume_fn,

该宏接受挂起和恢复函数,并填充与系统相关的PM回调。

3.2 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS宏

#define SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \
        .suspend_noirq = suspend_fn, \
        .resume_noirq = resume_fn, \
        .freeze_noirq = suspend_fn, \
        .thaw_noirq = resume_fn, \
        .poweroff_noirq = suspend_fn, \
        .restore_noirq = resume_fn,

如果驱动程序仅需要参与系统挂起的无中断阶段,可以使用此宏自动填充 struct dev_pm_ops 数据结构中与 _noirq() 相关的回调。

3.3 SET_LATE_SYSTEM_SLEEP_PM_OPS宏

#define SET_LATE_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \
        .suspend_late = suspend_fn, \
        .resume_early = resume_fn, \
        .freeze_late = suspend_fn, \
        .thaw_early = resume_fn, \
        .poweroff_late = suspend_fn, \
        .restore_early = resume_fn,

该宏将 suspend_late 、 freeze_late 和 poweroff_late 指向同一个函数,反之, resume_early 、 thaw_early 和 restore_early 也指向同一个函数。

所有这些宏都受 #ifdef CONFIG_PM_SLEEP 内核配置选项的条件限制,如果不需要PM功能,则不会构建这些宏。如果希望对挂起到RAM和休眠使用相同的挂起和恢复回调,可以使用以下命令:

#define SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \
const struct dev_pm_ops name = { \
    SET_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \
}

在上述代码片段中, name 表示设备PM操作结构的实例化名称, suspend_fn 和 resume_fn 是系统进入挂起状态或从睡眠状态恢复时调用的回调。

4. 成为系统唤醒源

PM核心允许系统在挂起后被唤醒,能够唤醒系统的设备在PM术语中被称为唤醒源。唤醒源正常工作需要所谓的唤醒事件,大多数情况下,唤醒事件与IRQ线相关联。也就是说,唤醒源会生成唤醒事件,当唤醒源生成唤醒事件时,通过唤醒事件框架提供的接口将唤醒源设置为激活状态,事件处理结束后,将其设置为停用状态。激活和停用之间的间隔表示事件正在处理中。下面介绍如何在驱动代码中使设备成为系统唤醒源。

4.1 唤醒源数据结构

内核通过 struct wakeup_source 抽象唤醒源,该结构也用于收集与唤醒源相关的统计信息,其定义如下:

struct wakeup_source {
    const char *name;
    struct list_head entry;
    spinlock_t lock;
    struct wake_irq *wakeirq;
    struct timer_list timer;
    unsigned long timer_expires;
    ktime_t total_time;
    ktime_t max_time;
    ktime_t last_time;
    ktime_t start_prevent_time;
    ktime_t prevent_sleep_time;
    unsigned long event_count;
    unsigned long active_count;
    unsigned long relax_count;
    unsigned long expire_count;
    unsigned long wakeup_count;
    bool active:1;
    bool autosleep_enabled:1;
};

该结构各字段含义如下:
| 字段 | 描述 |
| ---- | ---- |
| name | 唤醒源的名称 |
| entry | 用于在链表中跟踪所有唤醒源 |
| lock | 自旋锁 |
| wakeirq | 唤醒IRQ相关结构 |
| timer | 定时器 |
| timer_expires | 定时器到期时间 |
| total_time | 唤醒源处于激活状态的总时间 |
| max_time | 唤醒源连续处于激活状态的最长时间 |
| last_time | 唤醒源最后一次激活的开始时间 |
| start_prevent_time | 唤醒源开始阻止系统自动睡眠的时间点 |
| prevent_sleep_time | 唤醒源阻止系统自动睡眠的总时间 |
| event_count | 唤醒源报告的事件数量 |
| active_count | 唤醒源被激活的次数 |
| relax_count | 唤醒源被停用的次数 |
| expire_count | 唤醒源定时器到期的次数 |
| wakeup_count | 唤醒源终止挂起过程的次数 |
| active | 唤醒源的激活状态 |
| autosleep_enabled | 记录系统自动睡眠状态是否启用 |

4.2 使设备成为唤醒源的步骤

4.2.1 初始化唤醒能力

为了使设备成为唤醒源,其驱动程序必须调用 device_init_wakeup() 函数。该函数会设置设备的 power.can_wakeup 标志,使 device_can_wakeup() 辅助函数能够返回当前设备作为唤醒源的能力,并将其与唤醒相关的属性添加到sysfs中。此外,它会创建一个唤醒源对象,注册该对象并将其附加到设备( dev->power.wakeup )。但 device_init_wakeup() 仅使设备成为具有唤醒能力的设备,不会为其分配唤醒事件。

重要注意事项 :只有具有唤醒能力的设备才会在sysfs中有一个 power 目录,以提供所有唤醒信息。

4.2.2 分配唤醒事件

为了分配唤醒事件,驱动程序必须调用 enable_irq_wake() ,并将用作唤醒事件的IRQ线作为参数传入。 enable_irq_wake() 的操作可能因平台而异(其中包括调用底层irqchip驱动程序暴露的 irq_chip.irq_set_wake 回调)。除了开启平台逻辑以将给定的IRQ作为系统唤醒中断线处理外,它还会指示 suspend_device_irqs() (在系统挂起路径上调用,参考挂起阶段部分的步骤5)以不同方式处理给定的IRQ。结果是,该IRQ将保持启用状态以处理下一个中断,之后将被禁用、标记为待处理并挂起,以便在后续系统恢复时由 resume_device_irqs() 重新启用。因此,驱动程序的 ->suspend 方法是调用 enable_irq_wake() 的合适位置,以确保唤醒事件始终在正确的时刻重新启用。另一方面,驱动程序的 ->resume 回调是调用 disable_irq_wake() 的合适位置,该函数将关闭该IRQ的系统唤醒能力的平台配置。

设备是否应该发出唤醒事件是一个策略决策,由用户空间通过sysfs属性 /sys/devices/.../power/wakeup 进行管理。该文件允许用户空间检查或决定设备(通过其唤醒事件)是否能够从睡眠状态唤醒系统。该文件可读可写,读取时可能返回 enabled 或 disabled 。如果返回 enabled ,则表示设备能够发出事件;如果返回 disabled ,则表示设备不能发出事件。向该文件写入 enabled 或 disabled 字符串将分别指示设备是否应该发出系统唤醒信号(内核的 device_may_wakeup() 辅助函数将分别返回 true 或 false )。请注意,对于不能生成系统唤醒事件的设备,该文件不存在。

4.3 驱动示例

以下是 i.MX 6 SNV S powerkey 驱动的部分代码示例:

static int imx_snvs_pwrkey_probe(struct platform_device *pdev)
{
    [...]
    error = devm_request_irq(&pdev->dev, pdata->irq,
    imx_snvs_pwrkey_interrupt, 0, pdev->name, pdev);
    pdata->wakeup = of_property_read_bool(np, “wakeup-source”);
    [...]
    device_init_wakeup(&pdev->dev, pdata->wakeup);
    return 0;
}

static int maybe_unused imx_snvs_pwrkey_suspend(struct device *dev)
{
    [...]
    if (device_may_wakeup(&pdev->dev))
        enable_irq_wake(pdata->irq);
    return 0;
}

static int maybe_unused imx_snvs_pwrkey_resume(struct device *dev)
{
    [...]
    if (device_may_wakeup(&pdev->dev))
        disable_irq_wake(pdata->irq);
    return 0;
}

static SIMPLE_DEV_PM_OPS(imx_snvs_pwrkey_pm_ops,
                         imx_snvs_pwrkey_suspend,
                         imx_snvs_pwrkey_resume);

static struct platform_driver imx_snvs_pwrkey_driver = {
    .driver = {
        .name = “snvs_pwrkey”,
        .pm   = &imx_snvs_pwrkey_pm_ops,
        .of_match_table = imx_snvs_pwrkey_ids,
    },
    .probe = imx_snvs_pwrkey_probe,
};

static irqreturn_t imx_snvs_pwrkey_interrupt(int irq, void *dev_id)
{
    struct platform_device *pdev = dev_id;
    struct pwrkey_drv_data *pdata = platform_get_drvdata(pdev);
    pm_wakeup_event(pdata->input->dev.parent, 0);
    [...]
    return IRQ_HANDLED;
}

在上述代码中:
- imx_snvs_pwrkey_probe 函数首先使用 device_init_wakeup() 函数启用设备的唤醒能力。
- imx_snvs_pwrkey_suspend 函数在PM挂起回调中,使用 device_may_wakeup() 辅助函数检查设备是否允许发出唤醒信号,然后调用 enable_irq_wake() 启用唤醒事件。
- imx_snvs_pwrkey_resume 函数在PM恢复回调中,同样使用 device_may_wakeup() 进行检查,然后调用 disable_irq_wake() 禁用唤醒事件的IRQ线。
- SIMPLE_DEV_PM_OPS 宏表示将使用相同的挂起回调( imx_snvs_pwrkey_suspend )和恢复回调( imx_snvs_pwrkey_resume )来处理挂起到RAM或休眠睡眠状态。
- imx_snvs_pwrkey_interrupt 函数中的 pm_wakeup_event() 函数用于报告唤醒事件,并可能会中止当前的系统状态转换。其原型如下:

void pm_wakeup_event(struct device *dev, unsigned int msec)

第一个参数是唤醒源所属的设备,第二个参数 msec 是在PM唤醒核心自动将唤醒源切换到非激活状态之前等待的毫秒数。如果 msec 等于0,则在报告事件后立即禁用唤醒源;如果 msec 不为0,则在未来 msec 毫秒后安排唤醒源停用。

综上所述,通过理解电源域、系统挂起和恢复序列、实现系统睡眠能力以及使设备成为唤醒源等方面的知识,开发者可以更好地管理Linux系统的电源,提高系统的能效和响应性。

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    A([设备驱动]):::startend --> B(调用device_init_wakeup):::process
    B --> C(设置power.can_wakeup标志):::process
    C --> D(添加唤醒相关属性到sysfs):::process
    D --> E(创建并注册唤醒源对象):::process
    E --> F(调用enable_irq_wake):::process
    F --> G(开启平台逻辑处理IRQ):::process
    G --> H(指示suspend_device_irqs特殊处理IRQ):::process
    H --> I([设备成为唤醒源]):::startend

以上流程图展示了使设备成为唤醒源的主要步骤。

相关推荐

可唤醒中断

可唤醒中断 Android手机处于节省功耗考虑,在没有操作的情况下进入休眠模式,休眠模式下内核和应用层程序都处理冻结状态。对于进入休眠模式的系统,如何配置中断,使系统在中断发生时被唤醒呢? 在驱动代码里,对设备驱动xxx_driver中定义如下: static struct device_driver xxx_driver = { .name = “xxx”, .owner = THIS

zhanghuan_xa的专栏 1760

RK3568电源管理深度解析:休眠唤醒与开关机链路实战

电源管理是嵌入式系统低功耗设计的核心环节,涉及处理器、PMIC、内核框架与设备树的协同。从Linux内核的PM框架到ARM Trusted Firmware中的PSCI,系统级休眠唤醒依赖多层级机制配合,其原理决定了设备的待机功耗与响应可靠性。在实际工程中,掌握PMIC的电压域配置、DCDC/LDO通道管理以及设备树中regulator与wakeup-source的设定,是降低整机功耗、确保稳定开关机的关键。这项技术广泛应用于工控、车载、物联网等对功耗和可靠性要求严格的场景。以RK3568典型平台为例,其休

weixin_29193359的博客 257

UFS电源管理深度解析:M-PHY、HIBERN8与Linux内核协同优化

UFS(通用闪存)作为现代移动设备核心存储接口,其功耗表现直接决定整机续航与响应体验。理解UFS电源管理,需从M-PHY物理层切入——HS-Gear切换本质是硬件重训练过程,而HIBERN8并非简单断电,而是维持PLL微弱供电的低功耗态,退出延迟受PLL锁定、眼图校准等模拟电路特性制约。技术价值在于通过跨层协同(物理层电气设计、协议栈状态机、内核Runtime PM调度、供电网络PDN优化),实现功耗与性能的精细平衡。典型应用场景包括后台消息延迟优化、游戏IO抖动抑制、视频导出热节流控制等。本文聚焦真实芯片

weixin_34417183的博客 636

嵌入式音频系统McBSP时钟电源管理:Smart Idle模式与唤醒机制详解

在嵌入式系统设计中,时钟与电源管理是实现高性能低功耗的关键技术。其核心原理是通过精细划分时钟域和设计电源状态机,动态控制外设模块的能耗。这项技术的工程价值在于,它允许系统在保持实时响应能力的同时,显著降低静态和动态功耗。在音频编解码、数字信号处理等对时序和功耗敏感的领域,这种管理机制尤为重要。以多通道缓冲串行端口(McBSP)模块为例,其内部集成了复杂的中断与DMA协同机制,并支持Smart Idle等智能电源模式。通过配置CLOCKACTIVITY等寄存器,工程师可以灵活设定在空闲状态下哪些时钟保持运行,

weixin_33835103的博客 347

ARMv9/v8电源管理架构解析:PSCI与电源域模型

电源管理在现代ARM系统中已从简单的寄存器配置演进为涵盖硬件、固件与内核协同的系统级架构。其核心原理基于分层化电源域(Power Domain)模型和标准化接口PSCI(Power State Coordination Interface),通过明确定义的状态编码、调用契约与责任边界,实现确定性功耗控制。该架构的技术价值在于支撑毫秒级响应、微瓦级漏电优化及安全世界(如Realm)下的上下文一致性。典型应用场景包括车载IVI待机唤醒、工业网关低功耗运行及多核异构SoC能效编排。本文深入剖析ARMv9/v8下P

weixin_26854829的博客 171

i.MX31与MC13783电源管理:从DVFS到电源门控的嵌入式低功耗设计实战

电源管理是嵌入式系统设计的核心,尤其在电池供电设备中,它直接决定了产品的续航与稳定性。其基本原理在于通过精细控制芯片的电压与频率,动态匹配系统负载,从而大幅降低功耗。动态电压与频率缩放(DVFS)和电源门控是实现这一目标的关键技术。DVFS通过调整处理器工作点,在满足性能需求的同时最小化动态功耗;而电源门控则能彻底关断闲置模块,消除静态功耗。这些技术的工程价值在于,它们能将理论上的低功耗模型转化为实际可量产的、可靠的系统方案。在智能手机、便携媒体播放器、物联网终端等场景中,高效电源管理是产品竞争力的关键。本

weixin_30832405的博客 463

ARM Cortex-A15 MPU子系统低功耗管理:上下文、时钟与中断唤醒机制详解

在嵌入式系统开发中,低功耗管理与可靠唤醒是核心挑战,尤其在对功耗敏感的汽车电子与工业控制领域。其原理基于处理器状态的精���控制,涉及上下文保存与恢复、时钟门控以及中断唤醒仲裁等硬件机制。这些技术的核心价值在于实现系统在深度休眠与快速响应间的平衡,从而显著延长电池寿命并提升系统可靠性。典型应用场景包括车载信息娱乐系统的待机唤醒、工业网关的事件触发响应以及便携设备的睡眠管理。本文以德州仪器Jacinto 6 Plus平台为例,深入解析ARM Cortex-A15 MPU子系统的**上下文管理**与**中断唤醒

weixin_33672109的博客 409

嵌入式深度睡眠模式:外部与RTC唤醒原理与实战避坑指南

在嵌入式系统开发中,低功耗设计是延长电池供电设备续航能力的关键技术。其核心原理在于通过关闭CPU核心时钟、PLL以及非必要外设,并让内存进入自刷新模式,从而系统性地削减动态功耗与静态功耗。这项技术的核心价值在于,它使得物联网传感器、便携式医疗设备等能够以极低的待机功耗长时间运行,仅在需要时被唤醒。实现这一目标主要依赖两种唤醒机制:外部信号唤醒用于响应异步事件(如按键或传感器触发),而RTC定时唤醒则用于实现周期性的心跳式工作。本文将结合TI处理器技术手册,深入解析这两种唤醒方式的具体实现流程、寄存器配置细节

weixin_30751947的博客 337

AM62L USB xHCI寄存器深度解析:电源管理与中断调优实战

在嵌入式系统开发中,USB主机控制器是实现外设连接与数据传输的核心模块。其工作原理基于xHCI(eXtensible Host Controller Interface)规范,通过寄存器编程实现对控制器行为的精细控制。寄存器作为硬件与软件交互的桥梁,直接决定了系统的功耗、实时性与稳定性。在工业与边缘计算场景下,深入理解并优化寄存器配置具有重要技术价值,能够有效解决USB设备异常掉线、系统功耗过高及CPU中断负载过重等工程难题。本文聚焦TI AM62L平台,针对电源管理(LPM)与中断调制(IMOD)这两个关

diaoqu4574的博客 415

OMAP平台唤醒域引脚配置详解:从原理到实践

在嵌入式系统与SoC设计中,引脚复用(Pin Muxing)是一项基础且关键的技术,它允许单个物理引脚通过内部数字开关矩阵连接到多个内部功能模块,从而在有限的芯片封装引脚上实现丰富的功能扩展。其核心原理是通过配置特定的控制寄存器位域,来切换引脚的信号源和电气特性。这项技术的价值在于,它直接决定了系统硬件的功能定义、信号完整性和功耗表现,是确保CPU、外设与外部电路正确通信的基石。在移动设备、物联网终端等对功耗极其敏感的应用场景中,引脚配置的精细度更是深度影响系统的低功耗管理能力,尤其是唤醒功能的可靠性。本文

weixin_34034261的博客 291

设备低功耗开发:从功耗链路建模到唤醒事件治理

设备功耗本质上是时间加权的能量积分过程,其优化需穿透硬件选型、电源拓扑、SoC休眠管理、OS调度与驱动配置等多层约束。核心原理在于识别并切断非必要唤醒链路,通过功耗基线建模实现目标分解,结合电流波形测量定位瞬态尖峰,最终在安卓与嵌入式平台分别落实WakeLock治理与电源域隔离等硬核手段。技术价值体现在可量化续航提升(如待机功耗降低22%)、支撑IoT产品标称‘一年一换电池’等关键指标,并广泛应用于智能穿戴、TWS耳机、无线传感器等对电池寿命敏感的终端场景。本文聚焦功耗链路和唤醒事件两大热词,提供从理论到实

weixin_33857679的博客 622

嵌入式系统硬件设计:从引脚配置到电源管理的实战指南

在嵌入式系统开发中,引脚配置与电源管理是构建稳定硬件平台的基础。引脚复用(MUX)机制允许单个物理引脚承载多种功能,其原理是通过内部寄存器配置,决定信号流向,这极大地提升了芯片资源利用的灵活性。理解并正确配置GPIO、I2C、SPI等通用接口的驱动能力、电平兼容性及中断特性,是实现外设控制与通信的技术关键。稳定的电源网络,特别是对核心电压域、I/O电压域及模拟电源域进行合理的隔离与去耦设计,是保障系统长时间可靠运行、避免噪声干扰的工程基石。这些技术共同应用于复杂的多核处理器(如文中的DMVA3/4)系统设计

weixin_30387799的博客 410

避坑指南:在RK3588/树莓派等ARM开发板上调试Linux休眠唤醒,你得先搞懂PSCI与cpu_ops

本文深入解析在RK3588/树莓派等ARM开发板上调试Linux休眠唤醒的关键技术,重点探讨PSCI机制与cpu_ops的实现细节。通过分析常见问题场景、设备树配置要点及系统化调试方法论,帮助开发者有效解决系统休眠唤醒中的'睡死'等电源管理难题,提升ARM嵌入式开发效率。

weixin_31574149的博客 284

(C#脚本)Unity中角色移动的几种实现方法,以及心得。(适合新手入门)

PS:首先我们要知道,在C#中Transform组件是可以直接调用的,而其他的(例如:Rigidbody,Animator)都需要通过 GetConpoment<组件的名称>(); 来获取进行实例化。 例子:调用Rigidbody2D private Rigidbody2D rb2D;//声明变量实例化 void Start() { rb2d = GetComponent<Rigidbody2D>();//获取 } 1.对Unity脚本写入有一定的思维了解...

qq_48860282的博客 1万+

单细胞分析进阶:sctransform标准化在Seurat中的实战解析

本文深入解析了sctransform标准化方法在Seurat单细胞分析中的实战应用。通过对比传统对数标准化,sctransform能更有效地建模并剔除技术噪音,提升数据质量。文章提供了从环境配置、数据准备、核心参数解析到完整流程整合的详细指南,并针对常见问题给出解决方案,帮助研究者获得更清晰的细胞分群和更可靠的差异表达结果。

weixin_29248313的博客 153

openeuler在线/离线安装docker服务

openeuler在线/离线安装docker服务

haixuti7的博客 1071

VisionMaster位置修正功能深度解析:如何让找圆工具自动跟随移动目标?

本文深度解析海康威视VisionMaster平台的位置修正功能,重点介绍如何通过模板匹配与找圆工具的智能联动实现移动目标的动态追踪。文章详细阐述了工业视觉检测中的坐标系同步原理、模板匹配配置技巧及异常处理策略,为工程师提供了一套完整的工业级解决方案。

uu89012的博客 288

【报错】sqli-labs靶场搭建出现“Unable to connect to the database: security”

搭建sqli-labs靶场时,“Unable to connect to the database: security”报错解决

九芒星的博客 2998

PCL 改进快速欧式聚类【2025最新版】

在FEC: Fast Euclidean Clustering for Point Cloud Segmentation一文的基础上对算法进行改进。博客长期更新,本文最近更新时间为:2025年9月16日。

点云侠的博客 2570

【FF-A】第四章 Concepts

SPM的责任分为两个组件:SPM调度器(SPMD)和SPM核心(SPMC)。这两个组件都可以访问整个物理地址空间,并且是受信任的计算基础的一部分。当无需区分这两个组件时,术语SPM被使用。这些组件的责任如下所示。SPMD 位于 EL3 中,以 AArch64 或 AArch32 执行状态运行。SPMC 可以与 SPMD 共存在 EL3 中,也可以位于相邻的异常级别,即 S-EL1 或 S-EL2。SPM 在启动时初始化 EL3 LSP,并在运行时促进它们与其他端点之间的通信。

baron-周贺贺-代码改变世界ctw 1196

[CSP-X2025山东小学组T4]勇者斗恶龙

[CSP-X2025山东小学组T4]勇者斗恶龙,动态规划

少儿编程乔老师 150

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: 47、机器学习系统的监控与维护:保障模型效能的关键策略
下一篇: 23、随机过程与伊藤随机微积分入门
人间清醒863
博客等级 码龄3年 33粉丝 1544原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值