MS-RTOS 设备低功耗
本章将介绍 MS-RTOS 设备低功耗的实现。
低功耗技术
MS-RTOS 实现了以下三种低功耗技术:
低功耗技术 | 描述 | 特点 |
---|---|---|
Tick-less | 系统计算下一次应该产生 Tick 中断的时间,修改 Tick 定时器的到期时间,而不是以固定频率(如 1000Hz)产生,可让 CPU 有更多时间执行有效计算指令和 CPU idle 指令 | 无须 APP 和设备驱动程序参与、 低功耗效果不够理想 |
CPU 休眠 | 分为多个休眠模式,每个 APP 申请进入指定的休眠模式,由系统仲裁决策最终的休眠模式,进入深度休眠模式时会挂起设备,退出时恢复设备 | 需要 APP 和设备驱动程序参与、 需要硬件具备 CPU 休眠期间能正常工作和到期唤醒 CPU 的低功耗定时器、低功耗效果明显 |
CPU 动态频率 | 由 APP 根据计算能力需求或动态检测系统负载主动申请调整 CPU 及设备的运行频率 | 需要 APP 和设备驱动程序参与、 低功耗效果好 |
BSP 要求
Tick-less 技术
BSP 需要实现以下函数:
// 获得 tick-less 模式相关工作参数
void ms_bsp_tick_less_param(ms_tick_t *max_tick, ms_tick_t *min_tick,
ms_uint32_t *timer_cnt_per_tick,
ms_uint32_t *timer_stop_compensation);
// 进入 tick-less CPU 休眠模式
void ms_bsp_tick_less_sleep(ms_tick_t expected_tick, ms_arch_sr_t sr);
CPU 动态频率技术
BSP 和设备驱动程序需要实现以下函数:
// 设置 CPU 运行模式
void ms_bsp_pm_set_run_mode(ms_pm_run_mode_t run_mode);
// 设备驱动操作
typedef struct {
...
// 根据运行模式调整设备的运行频率
void (*adjust_freq)(ms_ptr_t ctx, ms_pm_run_mode_t run_mode);
...
} const ms_io_driver_ops_t;
CPU 休眠技术
BSP 和设备驱动程序需要实现以下函数:
// 响应电源管理的通知事件
void ms_bsp_pm_notify(ms_pm_sleep_mode_t sleep_mode, ms_pm_event_t event);
// 让 CPU 进入指定的休眠模式
void ms_bsp_pm_sleep(ms_pm_sleep_mode_t sleep_mode, ms_arch_sr_t sr);
// 启动低功耗定时器
void ms_bsp_pm_timer_start(ms_tick_t tick);
// 停止低功耗定时器
void ms_bsp_pm_timer_stop(void);
// 获得 CPU 休眠期间低功耗定时器流逝的嘀嗒数
ms_tick_t ms_bsp_pm_timer_elapsed(void);
// 设备驱动操作
typedef struct {
...
// 挂起设备
ms_err_t (*suspend)(ms_ptr_t ctx, ms_pm_sleep_mode_t sleep_mode);
// 恢复设备
void (*resume)(ms_ptr_t ctx, ms_pm_sleep_mode_t sleep_mode);
...
} const ms_io_driver_ops_t;
APP 要求
CPU 休眠技术和 CPU 动态频率技术需要 APP 参与。
用户空间不能使用电源管理相关的 API,只能通过对 /dev/pm
设备操作达到电源管理的目的。如果 APP 没有对 /dev/pm
设备的访问权限,则 APP 不能进行电源管理相关的操作。
/dev/pm 设备 ioctl 命令
ioctl 命令及相关说明如下表所示:
命令 | 描述 | 参数 |
---|---|---|
MS_PM_CMD_REQUEST_SLEEP_MODE | 请求进入指定的 CPU 休眠模式 | ms_pm_sleep_mode_t 指针 |
MS_PM_CMD_RELEASE_SLEEP_MODE | 取消请求进入指定的 CPU 休眠模式 | ms_pm_sleep_mode_t 指针 |
MS_PM_CMD_SET_DEFAULT_SLEEP_MODE | 设置默认的 CPU 休眠模式 | ms_pm_sleep_mode_t 指针 |
MS_PM_CMD_SET_RUN_MODE | 设置 CPU 运行模式 | ms_pm_run_mode_t 指针 |
MS_PM_CMD_GET_RUN_MODE | 获得当前的 CPU 运行模式 | ms_pm_run_mode_t 指针 |
MS_PM_CMD_GET_BOOT_MODE | 获得 CPU 的启动模式 | ms_pm_boot_mode_t 指针 |
操作系统低功耗行为
休眠模式
系统空闲(idle 任务运行时)时判断所有休眠模式的申请次数,采用有申请的最轻的休眠模式作为最终的结果。
不同的 CPU 休眠模式,系统的行为有所不同:
CPU 休眠模式类型 | 系统行为 |
---|---|
MS_PM_SLEEP_MODE_NONE | CPU 不休眠,系统空闲时执行 NOP 指令,不使用 Tick-less |
MS_PM_SLEEP_MODE_IDLE | 系统空闲时执行 CPU idle 指令,使用 Tick-less,任一中断唤醒 |
MS_PM_SLEEP_MODE_LIGHT | CPU 浅休眠,目前与 MS_PM_SLEEP_MODE_IDLE 相同 |
MS_PM_SLEEP_MODE_DEEP | CPU 深度休眠,挂起设备,使用低功耗定时器,任一中断唤醒 |
MS_PM_SLEEP_MODE_STANDBY | CPU 待机模式,挂起设备,只能被某些中断唤醒,唤醒后重新执行程序,可通过启动模式与关机模式进行区分 |
MS_PM_SLEEP_MODE_SHUTDOWN | CPU 关机模式,挂起设备,彻底关机 |
运行模式
如果需要调整为比当前更高的运行频率,则会立刻调整,以保证实时性,否则会在系统空闲时(idle 任务运行时)调整。运行模式调整除了调用 ms_bsp_pm_set_run_mode
函数调整 CPU 主频外,还会调用设备驱动的 adjust_freq
函数。