4.9.2. 调试指南

4.9.2.1. PM 框架概述

ZX-RTT 的 PM 驱动完全遵循 RT_Thread 的 PM 框架。 PM 框架将系统功耗分为 多个等级:

功耗模式

级别

描述

ZX-RTT 是否支持

PM_SLEEP_MODE_NONE

0

系统处于活跃状态

PM_SLEEP_MODE_IDLE

1

空闲模式

PM_SLEEP_MODE_LIGHT

2

轻睡眠模式

PM_SLEEP_MODE_DEEP

3

深睡眠模式

PM_SLEEP_MODE_STANDBY

4

待机模式

PM_SLEEP_MODE_SHUTDOWN

5

关机模式

  • PM_SLEEP_MODE_NONE:未采取任何降功耗措施。

  • PM_SLEEP_MODE_IDLE:空闲模式,驱动中仅实现为进入WFI。

  • PM_SLEEP_MODE_LIGHT:轻睡眠模式,驱动实现为 CPU 及总线时钟切换到 24MHz,PLL 时钟关闭,串口可用

  • PM_SLEEP_MODE_DEEP:深睡眠模式,驱动实现为 CPU 及总线时钟切换到 24MHz,PLL 时钟关闭,串口不可用

RT-Thread 的功耗模式需要在代码中主动申请和释放,为了保证系统的正常运行,功耗越大的模式优先级越高。例如,有线程申请了 PM_SLEEP_MODE_NONE 模式和 PM_SLEEP_MODE_DEEP 模式,为了保证系统运行正常,PM 框架将会以 PM_SLEEP_MODE_NONE 模式运行,直到代码中主动释放了 PM_SLEEP_MODE_NONE 模式,PM 框架才会以 PM_SLEEP_MODE_DEEP 模式运行,即进入 deep sleep mode

在 PM 框架初始化时,将 PM_SLEEP_MODE_DEEP 模式设置成了默认休眠模式,即当系统中没有比 PM_SLEEP_MODE_DEEP 模式更高优先级的请求时,系统会立刻进入 deep sleep mode 。同时,PM 框架初始化时申请了 PM_SLEEP_MODE_NONE 模式,以确保在PM 初始化完成后,系统可以正常运行,而不会立即进入 deep sleep mode

4.9.2.2. 休眠唤醒

PM 框架及驱动使能后,RT-Thread 会在 idle 线程进入休眠唤醒流程。在休眠唤醒流程中,检测系统当前申请的最高优先级的功耗模式(功耗越高,优先级越高),然后以最高优先级的功耗模式运行。因为在 PM 框架初始化时,已申请 PM_SLEEP_MODE_NONE 模式,所以,想要进入休眠,需要在代码中主动释放 PM_SLEEP_MODE_NONE 模式,可以使用如下接口:

rt_pm_release(rt_uint8_t mode):释放mode 模式

若希望系统不进入休眠模式,可以主动申请高优先级的功耗模式:

rt_pm_request(rt_uint8_t sleep_mode):申请mode 模式

如果在代码执行的某个阶段不允许系统进入更低的功耗模式,可以通过 rt_pm_requestrt_pm_release 对该过程进行保护。例如,如果在读取数据过程中不允许进入休眠,可以如下处理: ``

/* 请求不进入任何低功耗模式 */
rt_pm_request(PM_SLEEP_MODE_NONE);

/* 读取数据过程 */

/* 释放该模式 */
rt_pm_release(PM_SLEEP_MODE_NONE);

备注

PM 框架中模式的申请和释放必须成对使用。

4.9.2.3. 设置唤醒源

ZX-RTT SDK 在 PM 框架基础上增加了设置唤醒源的接口,唤醒源的中断可以唤醒系统。设置唤醒源的接口如下:

rt_device_wakeup_enable(rt_device_t dev, rt_bool_t enable)

4.9.2.4. 调试辅助

可以使用pm_dump 命令查看PM 的模式状态,使用示例如下:

ZXM47D0N /> pm_dump
| Power Management Mode | Counter | Timer |
+-----------------------+---------+-------+
|             None Mode |       2 |     0 |
|             Idle Mode |       0 |     0 |
|       LightSleep Mode |       0 |     0 |
|        DeepSleep Mode |       0 |     1 |
|          Standby Mode |       0 |     0 |
|         Shutdown Mode |       0 |     0 |
+-----------------------+---------+-------+
pm current sleep mode: None Mode
pm current run mode:   Normal Speed

| module | busy | start time |  timeout  |
+--------+------+------------+-----------+
|  0001  |  0   | 0x00000000 | 0x00000000 |
|  0004  |  0   | 0x00000000 | 0x00000000 |
+--------+------+------------+-----------+

如上所示,模式的优先级按从高到低排列,Counter 一栏标识该模式请求的计数值,上图表示当前系统 None mode 模式被请求两次。Timer 一栏标识是否开启睡眠时间补偿,目前 ZX-RTT 中仅 deep sleep mode 进行时间补偿。