初始版本
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
|
||||
#include "pt_task.h"
|
||||
#include "pt_pm.h"
|
||||
#include "pt_ext.h"
|
||||
|
||||
#include "stdio.h"
|
||||
|
||||
// 系统空闲条件
|
||||
#define SYSTEM_IS_IDLE() (ALL_TASKS_IDLE())
|
||||
#define DEEP_SLEEP_THRESHOLD 5 // 进入深度休眠的空闲计数阈值
|
||||
|
||||
static struct {
|
||||
pm_adapter_t default_adapter;
|
||||
pt_t pt;
|
||||
pm_mode_t current_mode; // 当前功耗模式
|
||||
uint32_t ref_count[PM_SLEEP_MODE_MAX]; // 引用计数数组
|
||||
} pm;
|
||||
|
||||
static bool system_is_idle(void)
|
||||
{
|
||||
return pt_task_all_idle();
|
||||
}
|
||||
|
||||
/*
|
||||
功耗管理:遍历所有任务状态,然后根据用于请求的功耗模式,调用适配器接口,调整MCU的运行模式
|
||||
*/
|
||||
static void pt_pm_handler(void) {
|
||||
|
||||
if (system_is_idle()) {
|
||||
|
||||
// 切换到下一个可用的功耗模式
|
||||
pm_mode_t next_mode = PM_SLEEP_MODE_NONE;
|
||||
for (pm_mode_t m = PM_SLEEP_MODE_NONE; m < PM_SLEEP_MODE_MAX; m++) {
|
||||
if (pm.ref_count[m] > 0 ) {
|
||||
next_mode = m;
|
||||
}
|
||||
}
|
||||
|
||||
if (next_mode != pm.current_mode && pm.default_adapter.sleep) {
|
||||
pm.default_adapter.sleep(next_mode);
|
||||
pm.current_mode = next_mode;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
pt_pm_release(PM_SLEEP_MODE_NONE); // 唤醒系统
|
||||
|
||||
if (pm.default_adapter.wakeup) {
|
||||
pm.default_adapter.wakeup();
|
||||
}
|
||||
pm.current_mode = PM_SLEEP_MODE_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void pt_pm_adapter_init(pm_adapter_t *adapter) {
|
||||
if (adapter) {
|
||||
pm.default_adapter = *adapter; // 复制整个结构体
|
||||
} else {
|
||||
pm.default_adapter.sleep = 0;
|
||||
pm.default_adapter.wakeup = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void pt_pm_init(void) {
|
||||
|
||||
PT_INIT(&pm.pt);
|
||||
}
|
||||
|
||||
|
||||
int pt_task_pm(void) {
|
||||
|
||||
PT_BEGIN(&pm.pt);
|
||||
|
||||
while (1) {
|
||||
|
||||
pt_pm_handler(); // 处理功耗状态
|
||||
|
||||
PT_DELAY_MS(&pm.pt, system_is_idle() ? 1000 : 100);
|
||||
}
|
||||
|
||||
PT_END(&pm.pt);
|
||||
}
|
||||
|
||||
/*
|
||||
请求功耗模式:引用计数自增,如果为1,则调用适配器接口,调整MCU的运行模式
|
||||
*/
|
||||
void pt_pm_request(pm_mode_t mode) {
|
||||
if (mode >= PM_SLEEP_MODE_MAX) {
|
||||
return; // 无效模式
|
||||
}
|
||||
pm.ref_count[mode]++; // 仅操作引用计数
|
||||
}
|
||||
|
||||
/*
|
||||
释放功耗模式:引用计数自减,如果为0,则调用适配器接口,调整MCU的运行模式
|
||||
*/
|
||||
void pt_pm_release(pm_mode_t mode) {
|
||||
if (mode >= PM_SLEEP_MODE_MAX) {
|
||||
return; // 无效模式
|
||||
}
|
||||
if (pm.ref_count[mode] > 0) {
|
||||
pm.ref_count[mode]--; // 仅操作引用计数
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user