feat: L0 支持低功耗框架
1.【需求描述】 L0 支持低功耗投票框架, 使内核与应用、驱动分离开,通过注册及投票机制控制系统的低功耗模式, 减低系统功耗,提升设备电池寿命。 2.【方案描述】 (1).提供注册机制,使驱动与内核分离 (2).提供投票机制,判断系统运行模式 (3).记录持锁设备,便于回溯 进入:系统运行进入idle任务时判断当前的功耗模式,如果上层应用未对当前功耗模式(deep和shutdown) 持锁,则系统准备进入当前模式,首先所有设备依次进入当前模式,如果有设备进入当前模式失败,则恢复 已进入当前模式的所有设备,并且功耗模式变为normal模式;设备依次进入当前功耗模式后cpu再进入当前 功耗模式。 恢复:功耗模式为deep时,需要恢复逻辑,时系统恢复运行。当有中断出发时,系统会退出低功耗模式, 恢复顺序为:首先cpu先恢复,然后设备依次恢复。 BREAKING CHANGE: 1.原调度中基于tick timer的低功耗扩展和当前的pm模块合并,删除原对外接口LOS_SchedSleepInit, 变为pm模块统一提供的LOS_PmRegistered接口. 2.原来在arch los_timer.h下提供的低功耗模式为枚举LOS_SysSleepEnum,其中OS_SYS_NORMAL_SLEEP 和OS_SYS_DEEP_SLEEP不符合对外定义,统一修改为LOS_SYS_NORMAL_SLEEP和LOS_SYS_DEEP_SLEEP, 并移至los_pm.h中. 3.VOID HalEnterSleep(LOS_SysSleepEnum sleep) 变更为UINT32 HalEnterSleep(VOID). Close #I3UDNV Signed-off-by: zhushengle <zhushengle@huawei.com> Change-Id: Id5382c42c8055ba7850895a3f575130a73e38a65
This commit is contained in:
@@ -45,7 +45,6 @@
|
||||
#include "los_cpup.h"
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* @brief Convenience macro for bitwise operation of task module
|
||||
@@ -102,6 +101,8 @@ LITE_OS_SEC_DATA_INIT LOS_DL_LIST g_losFreeTask;
|
||||
LITE_OS_SEC_DATA_INIT LOS_DL_LIST g_taskRecyleList;
|
||||
LITE_OS_SEC_BSS BOOL g_taskScheduled = FALSE;
|
||||
|
||||
STATIC VOID (*PmEnter)(BOOL isIdle) = NULL;
|
||||
|
||||
#if (LOSCFG_BASE_CORE_TSK_MONITOR == 1)
|
||||
TSKSWITCHHOOK g_pfnUsrTskSwitchHook = NULL;
|
||||
#endif /* LOSCFG_BASE_CORE_TSK_MONITOR == 1 */
|
||||
@@ -145,6 +146,16 @@ STATIC VOID OsRecyleFinishedTask(VOID)
|
||||
LOS_IntRestore(intSave);
|
||||
}
|
||||
|
||||
UINT32 OsPmEnterHandlerSet(VOID (*func)(BOOL))
|
||||
{
|
||||
if (func == NULL) {
|
||||
return LOS_NOK;
|
||||
}
|
||||
|
||||
PmEnter = func;
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
Function : OsIdleTask
|
||||
Description : Idle task.
|
||||
@@ -152,11 +163,16 @@ STATIC VOID OsRecyleFinishedTask(VOID)
|
||||
Output : None
|
||||
Return : None
|
||||
*****************************************************************************/
|
||||
LITE_OS_SEC_TEXT WEAK VOID OsIdleTask(VOID)
|
||||
LITE_OS_SEC_TEXT VOID OsIdleTask(VOID)
|
||||
{
|
||||
while (1) {
|
||||
OsRecyleFinishedTask();
|
||||
HalEnterSleep(OS_SYS_DEEP_SLEEP);
|
||||
|
||||
if (PmEnter != NULL) {
|
||||
PmEnter(TRUE);
|
||||
} else {
|
||||
(VOID)HalEnterSleep();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user