低功耗套件
目录
简介
低功耗管理(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 | 无 |