MS-RTOS 设备低功耗

更新时间:
2023-08-09
下载文档

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_NONECPU 不休眠,系统空闲时执行 NOP 指令,不使用 Tick-less
MS_PM_SLEEP_MODE_IDLE系统空闲时执行 CPU idle 指令,使用 Tick-less,任一中断唤醒
MS_PM_SLEEP_MODE_LIGHTCPU 浅休眠,目前与 MS_PM_SLEEP_MODE_IDLE 相同
MS_PM_SLEEP_MODE_DEEPCPU 深度休眠,挂起设备,使用低功耗定时器,任一中断唤醒
MS_PM_SLEEP_MODE_STANDBYCPU 待机模式,挂起设备,只能被某些中断唤醒,唤醒后重新执行程序,可通过启动模式与关机模式进行区分
MS_PM_SLEEP_MODE_SHUTDOWNCPU 关机模式,挂起设备,彻底关机

运行模式

如果需要调整为比当前更高的运行频率,则会立刻调整,以保证实时性,否则会在系统空闲时(idle 任务运行时)调整。运行模式调整除了调用 ms_bsp_pm_set_run_mode 函数调整 CPU 主频外,还会调用设备驱动的 adjust_freq 函数。

文档内容是否对您有所帮助?
有帮助
没帮助