前端旅游网站行程怎么做网址关键词查询网站
休眠模式是在系统层面定义的,它包括将APU置于待机模式,并将多个控制器保持在无时钟的复位状态。
进入休眠模式可以大大降低功耗。在休眠模式下,大多数功能时钟组都会被关闭或断电。唯一需要保持活动的设备是一个CPU、窥探控制单元(SCU)和一个wake-up设备。理想情况下,唯一引起动态功耗的设备应该是SCU和wake-up外设。wake-up外设可以是UART、GPIO或任何能够生成中断的设备。
如果wake-up设备是一个AXI总线主设备,且该AXI总线主设备能够启动针对DRAM的事务,那么就需要使用额外的限制。由于整个interconnect和DDR内存都处于低功耗模式且不可访问,因此必须确保在针对DRAM进行任何事务之前,CPU已经完成了整个wake-up过程。这可以确保针对DRAM的潜在事务能够得到正确处理。
休眠模式的设计旨在实现功耗和性能之间的平衡。通过允许关键组件在休眠期间保持活动状态,系统可以在需要时迅速恢复操作,同时最大限度地减少功耗。这种功耗管理策略对于需要长时间待机但又要求快速响应的应用场景非常有用。
1、设置wake-up事件
发送给PS的每个中断都可以用作wake-up事件。要实现这一点,必须在外设和GIC中启用所需的中断。wake-up设备必须能够在休眠模式下生成中断,这意味着其时钟可能不会被门控关闭。
在配置wake-up事件时,需要确保所选器件在休眠模式下仍然能够工作,并且能够生成中断信号。这通常涉及配置设备的电源管理设置,以确保其时钟不会被关闭。此外,还需要在GIC中配置中断处理程序,以便在接收到中断时能够正确响应并wake-up系统。
2、使用休眠模式的注意事项
在休眠模式下,主CPU负责关闭所有非wake-up设备,包括系统中的所有其他主设备和PL(如果可能的话)。由于时钟频率在更改时钟分频器和PLL配置时会发生变化,因此配置wake-up设备不仅意味着激活所需的wake-up中断,还需要更改外设配置以应对修改后的时钟频率。如果两个CPU都在运行,主CPU应在进入待机模式之前首先关闭从CPU。哪个CPU作为主CPU是用户的选择。此外,必须采取预防措施,确保在DDR时钟被禁用时执行的代码在此期间可访问,例如,将这些代码段放在OCM中,或锁定L2缓存和TLB。根据实际实现情况,这可能适用于以下情况:
• DDR不可用时执行的代码
• 进入和退出待机模式的例行程序
• 转换表
• 堆栈
当前使用的转换表和堆栈的位置分别可以通过TTBR和SP寄存器进行控制。如果需要,这允许在正常运行模式和待机模式之间切换不同的结构。
在待机序列中,CPU中的中断被禁用。这样,在进入待机模式时执行不会被中断,并且一旦发生wake-up事件,执行将在wfi(等待中断)指令之后立即恢复,而不是跳转到向量表。wake-up中断必须在相应的wake-up设备和GIC中断控制器中启用,以产生合格的wake-up事件。wake-up后重新启用中断时,wake-up中断仍然处于挂起状态,并导致CPU像往常一样跳转到其中断处理程序。
三、进入休眠模式
CPU必须执行以下步骤,才能从正常运行模式进入休眠模式:
1.禁用中断。
执行cpsid if。
2.配置wake-up设备。
3.启用L2缓存动态时钟门控。
设置l2cpl310.reg15_power_ctrl[dynamic_clk_gating_en] = 1。
4.启用SCU待机模式。
设置mpcore.SCU_CONTROL_REGISTER[SCU_standby_enable] = 1。
5.启用顶层开关时钟停止。
设置slcr.TOPSW_CLK_CTRL[CLK_DIS] = 1。
6.启用Cortex-A9动态时钟门控。
设置cp15.power_control_register[dynamic_clock_gating] = 1。
7.将外部DDR内存置于自刷新模式。
8.将PLL置于旁路( bypass)模式。
设置slcr.{Arm, DDR, IO}_PLL_CTRL[PLL_BYPASS_FORCE] = 1。
9.关闭PLL。
设置slcr.{Arm, DDR, IO}_PLL_CTRL[PLL_PWRDWN] = 1。
10.增加时钟分频器以减慢CPU时钟。
设置slcr.ARM_CLK_CTRL[DIVISOR] = 0x3f。
11.执行wfi(等待中断)指令以进入WFI模式。
在实际应用中,可能还需要执行其他步骤或检查以确保系统能够正确和安全地进入休眠模式。务必参考使用的硬件和软件的官方文档,以确保遵循正确的编程指南和最佳实践。
四、退出休眠模式
退出休眠模式是由配置好的中断触发的。中断wake-up CPU,使其恢复执行。新启动的活动也会触发顶层开关、SCU和L2缓存控制器离开空闲状态并继续正常操作。以下概述了wake-up过程的步骤。
要退出休眠模式:
1.恢复CPU时钟分频器设置。
设置slcr.ARM_CLK_CTRL[DIVISOR] = <原始值>。
2.给PLL上电。
设置slcr.{ARM, DDR, IO}_PLL_CTRL[PLL_PWRDWN] = 0。
3.等待PLL上电并锁定。
等待slcr.PLL_STATUS[{ARM, DDR, IO}_PLL_LOCK] == 1。
4.禁用PLL旁路模式。
设置slcr.{ARM, DDR, IO}_PLL_CTRL[PLL_BYPASS_FORCE] = 0。
5.禁用L2缓存动态时钟门控。
设置l2cpl310.reg15_power_ctrl[dynamic_clk_gating_en] = 0。
6.禁用SCU待机模式。
设置mpcore.SCU_CONTROL_REGISTER[SCU_standby_enable] = 0。
7.禁用 Interconnect时钟停止。
设置slcr.TOPSW_CLK_CTRL[CLK_DIS] = 0。
8.禁用Cortex-A9动态时钟门控。
设置cp15.power_control_register[dynamic_clock_gating] = 0。
9.启用所有必需的外围设备。
包括DDR控制器时钟。
10.重新启用并处理中断。
执行cpsie if。
旁路PLL和修改时钟分频器会改变系统中的时钟频率。在这些条件下,必须注意为wake-up设备和看门狗计时器(如果使用)等提供时钟。