全部文档
概述 硬件支持 快速开发指南 内核 驱动 通用组件 专业组件 常见问题

低功耗套件

目录

简介

低功耗管理(Low power manager, LPMGR)套件是结合tickless和MCU低功耗来实现RTOS低功耗的管理组件,它的主要核心原理是:系统运行在最低优先级IDLE任务时CPU停止工作。

对于运行RTOS的设备中,有许多的任务,其中IDLE任务优先级最低,当其它任务都处在挂起(非运行或者就绪)状态时,任务就运行在IDLE任务,IDLE任务没有做任何事情,这时CPU是空跑的,让CPU空跑的这段时间进入低功耗,运行在IDLE任务的时间使用完了需要切换高任务优先级的时候再退出低功耗,来进行任务切换,这样来达到节省功耗的目的。

配置指南

menuconfig配置:

1.打开lpmgr功能

“Tickless for low power consumption”选项是tickless结合MCU低功耗功能,我们一般选择此选项

“Simple low power consumption”选择是对MCU低功耗功能简单的封装,提供统一API

(Top) → Drivers→ Low power manager→ Enable low power manager drivers → Low power options
                                            OneOS Configuration
(X) Tickless for low power consumption
( ) Simple low power consumption

2.使用低功耗需要使用systick作为kernel tick,配置如下:

(Top) → Drivers→ Timer
                  ↑↑↑↑↑↑↑            OneOS Configuration
-*- Using timer driver
-*-     clocksource
[*]         clocksource show
[ ]         Timekeeping
[*]     clockevent
[*]         clockevent show
[ ]     hrtimer(soft timer)
        cortex-m hardware timer config  --->
(Top) → Drivers→ Timer→ Using timer driver → cortex-m hardware timer confi→ cortex-m systick config
                  ↑↑↑↑↑↑↑            OneOS Configuration
(X) systick for kernel tick
( ) systick for clocksource
( ) systick for clockevent

3.如果使用软件定时器需要打开"Enable software timer with a timer task"和“Software timers in each hash bucket are sorted”

(Top) → Kernel
                                            OneOS Configuration
    The max size of kernel object name (15)  --->
    The max level value of priority of task (32)  --->
(100) Tick frequency(Hz)
(10) Task time slice(unit: tick)
[*] Using stack overflow checking
-*- Enable global assert
[*] Enable kernel lock check
[*] Enable kernel debug
        The global log level of kernel (Warning)  --->
[*]     Enable color log
[*]     Enable kernel log with function name and line number
(2048) The stack size of main task
(512) The stack size of idle task
(512) The stack size of recycle task
[*] Enable software timer with a timer task
(512)   The stack size of timer task
[*]     Software timers in each hash bucket are sorted
[*]     Enable workqueue
[*]         Enable system workqueue
(2048)          System workqueue task stack size
(0)             System workqueue task priority level
    Inter-task communication and synchronization  --->
    Memory management  --->

4.默认打开了红外功能,需要关闭,因为红外功能中有一个100ms的定时器,会影响我们验证低功耗功能

(Top) → Drivers→ Infrared
                                            OneOS Configuration
[ ] Using infrared device drivers

5.关闭默认打开的任务,剩余的任务如下:

sh />show_task
Task             Priority  State                 Stack top   Stack addr  Stack size  Max used  Left tick
---------------  --------  --------------------  ----------  ----------  ----------  --------  ---------
timer            0         Suspend               0x200024f4  0x20002368  512          22%      10       
recycle          0         Suspend               0x20002294  0x200020f0  512          37%      10       
idle             31        Ready                 0x20001eec  0x20001d50  512          19%      1        
dlog_async       30        Block                 0x200069cc  0x20006230  2048         12%      2        
sys_work         0         Block                 0x20002f54  0x200027c0  2048          5%      10       
tshell           20        Running               0x20003790  0x20003078  2048         25%      10

示例

我们提供低功耗的几种常用方法,代码路径:demos\driver\lpmgr_requst_test.c,把lpmgr_requst_test.c文件加入工程编译

注释掉user任务,避免影响低功耗的测试

int main(void)
{
//    os_task_t *task;

//    task = os_task_create("user", user_task, NULL, 512, 3);
//    OS_ASSERT(task);
//    os_task_startup(task);

    return 0;
}

编译成功后,烧写到板子,help命令查看命令,我们需要使用到如下2个命令测试

requst_wake_up   - requst_wake_up
wakeup_iqr       - wakeup_iqr

定时唤醒功能

使用requst_wake_up 3 5命令,3表示低功耗模式deep,5表示定时器的时间5s,这5s的时间系统会进入IDLE任务,也就是系统会进入低功耗5s时间,然后再退出低功耗执行定时器任务,任务执行完成后再次进入IDLE任务,如此循环

sh />requst_wake_up 3 5
[..\..\demos\driver\lpmgr_requst_test.c]-[83], mode[3], timeout[5]
sh />
sh />[1329] I/lpmgr: [..\..\drivers\lpmgr\lpmgr.c]-[233], timeout_tick[499], delt_tick[499], cur_tick[1329]
user task, start current tick: 1330
 [lpmgr_start][233]
[1829] I/lpmgr: [..\..\drivers\lpmgr\lpmgr.c]-[233], timeout_tick[499], delt_tick[499], cur_tick[1829]
user task, start current tick: 1830
 [lpmgr_start][233]
[2329] I/lpmgr: [..\..\drivers\lpmgr\lpmgr.c]-[233], timeout_tick[499], delt_tick[499], cur_tick[2329]
user task, start current tick: 2330
 [lpmgr_start][233]
[2829] I/lpmgr: [..\..\drivers\lpmgr\lpmgr.c]-[233], timeout_tick[499], delt_tick[499], cur_tick[2829]
user task, start current tick: 2830
 [lpmgr_start][233]
[3329] I/lpmgr: [..\..\drivers\lpmgr\lpmgr.c]-[233], timeout_tick[499], delt_tick[500], cur_tick[3329]
user task, start current tick: 3330
 [lpmgr_start][233]

按键唤醒功能

wakeup_iqr 3的3表示deep低功耗模式,执行命令后,进入低功耗并永久睡眠,没有时间唤醒,使用外部按键产生中断唤醒系统后,执行灯闪烁任务,任务执行完成后重新进入IDLE任务,并进入永久睡眠的低功耗

sh />wakeup_iqr 3
request sleep [..\..\demos\driver\lpmgr_requst_test.c]-[146], mode[3]
sh />
sh />wake up[..\..\demos\driver\lpmgr_requst_test.c]-[113], pin[58], tick[19825]
wake up, enter user code[..\..\demos\driver\lpmgr_requst_test.c]-[157], tick[19825]
[19825] I/lpmgr: [..\..\drivers\lpmgr\lpmgr.c]-[233], timeout_tick[4294967295], delt_tick[0], cur_tick[19825]
 [lpmgr_start][233]
wake up[..\..\demos\driver\lpmgr_requst_test.c]-[113], pin[58], tick[19840]

sh />
sh />
sh />
sh />
sh />
sh />wake up, exit user code[..\..\demos\driver\lpmgr_requst_test.c]-[161], tick[20526]
wake up, enter user code[..\..\demos\driver\lpmgr_requst_test.c]-[157], tick[20526]

API列表

接口 说明
os_lpmgr_request 请求低功耗模式
os_lpmgr_release 释放请求的低功耗模式,需要和os_lpmgr_request配套使用
os_lpmgr_device_register 注册进入退出低功耗需要操作的设备
os_lpmgr_device_unregister 注销进入低功耗前需要关闭的设备
os_lpmgr_notify_set 设置通知,会在进入退出低功耗的时候调用,用作通知低功耗被调用了

API说明

os_lpmgr_request

请求的功耗模式,其函数原型如下:

void os_lpmgr_request(os_uint8_t sleep_mode);
参数 说明
os_uint8_t sleep_mode 功耗模式:
/ sleep modes /
SYS_SLEEP_MODE_NONE = 0,
SYS_SLEEP_MODE_IDLE,
SYS_SLEEP_MODE_LIGHT,
SYS_SLEEP_MODE_DEEP,
SYS_SLEEP_MODE_STANDBY,
SYS_SLEEP_MODE_SHUTDOWN,
SYS_SLEEP_MODE_MAX,
返回 说明
void
os_lpmgr_release

释放请求的功耗模式,其函数原型如下:

void os_lpmgr_release(os_uint8_t sleep_mode);
参数 说明
os_uint8_t sleep_mode 功耗模式:
/ sleep modes /
SYS_SLEEP_MODE_NONE = 0,
SYS_SLEEP_MODE_IDLE,
SYS_SLEEP_MODE_LIGHT,
SYS_SLEEP_MODE_DEEP,
SYS_SLEEP_MODE_STANDBY,
SYS_SLEEP_MODE_SHUTDOWN,
SYS_SLEEP_MODE_MAX,
返回 说明
void
os_lpmgr_device_register

注册进入退出低功耗需要操作的设备,suspend会在进入低功耗前调用,resume会在退出低功耗后调用,函数原型如下:

os_err_t os_lpmgr_device_register(struct os_device *device, const struct os_lpmgr_device_ops *ops);
参数 说明
struct os_device *device 设备
const struct os_lpmgr_device_ops *ops 回调接口:
struct os_lpmgr_device_ops
{
os_err_t (suspend)(struct os_device device, lpmgr_sleep_mode_e mode);
void (resume)(struct os_device device, lpmgr_sleep_mode_e mode);
};
返回 说明
os_err_t OS_EOK -- 注册成功
os_lpmgr_device_unregister

注销进入低功耗前需要关闭的设备,函数原型如下:

void os_lpmgr_device_unregister(struct os_device *device, const struct os_lpmgr_device_ops *ops)
参数 说明
struct os_device *device 设备
const struct os_lpmgr_device_ops *ops 回调接口:
struct os_lpmgr_device_ops
{
os_err_t (suspend)(struct os_device device, lpmgr_sleep_mode_e mode);
void (resume)(struct os_device device, lpmgr_sleep_mode_e mode);
};
返回 说明
os_err_t OS_EOK -- 注销成功
os_lpmgr_notify_set

设置通知,会在进入退出低功耗的时候调用,用作通知低功耗被调用了,其函数原型如下:

void os_lpmgr_notify_set(void (*notify)(os_lpmgr_sys_e event, lpmgr_sleep_mode_e mode, void *data), void *data)
参数 说明
void (*notify) 回调函数,根据event取值在进入退出低功耗的时候调用,event取值:
SYS_ENTER_SLEEP = 0,
SYS_EXIT_SLEEP,
void *data 参数
返回 说明
void

results matching ""

    No results matching ""