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:
@@ -49,6 +49,7 @@ static_library("kernel") {
|
||||
"../components/cpup",
|
||||
"../components/exchook",
|
||||
"../components/backtrace",
|
||||
"../components/power",
|
||||
"../utils",
|
||||
"//third_party/bounds_checking_function/include",
|
||||
]
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
#include "los_memory.h"
|
||||
#include "los_membox.h"
|
||||
|
||||
|
||||
/*lint -save -e40 -e522 -e533*/
|
||||
UINT32 g_intCount = 0;
|
||||
|
||||
@@ -169,10 +168,6 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID)
|
||||
g_intCount++;
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
OsSchedUpdateSleepTime();
|
||||
#endif
|
||||
|
||||
hwiIndex = HalIntNumGet();
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_ISR_ENTER, hwiIndex);
|
||||
|
||||
@@ -103,15 +103,11 @@ WEAK VOID HalTickUnlock(VOID)
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
|
||||
UINT32 HalEnterSleep(VOID)
|
||||
{
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
if (sleep == OS_SYS_DEEP_SLEEP) {
|
||||
OsSchedToSleep();
|
||||
}
|
||||
#endif
|
||||
|
||||
__DSB();
|
||||
__WFI();
|
||||
__ISB();
|
||||
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
#include "los_memory.h"
|
||||
#include "los_membox.h"
|
||||
|
||||
|
||||
/*lint -save -e40 -e522 -e533*/
|
||||
UINT32 g_intCount = 0;
|
||||
|
||||
@@ -159,10 +158,6 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID)
|
||||
g_intCount++;
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
OsSchedUpdateSleepTime();
|
||||
#endif
|
||||
|
||||
hwiIndex = HalIntNumGet();
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_ISR_ENTER, hwiIndex);
|
||||
|
||||
@@ -102,15 +102,11 @@ WEAK VOID HalTickUnlock(VOID)
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
|
||||
UINT32 HalEnterSleep(VOID)
|
||||
{
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
if (sleep == OS_SYS_DEEP_SLEEP) {
|
||||
OsSchedToSleep();
|
||||
}
|
||||
#endif
|
||||
|
||||
__DSB();
|
||||
__WFI();
|
||||
__ISB();
|
||||
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
#include "los_memory.h"
|
||||
#include "los_membox.h"
|
||||
|
||||
|
||||
/*lint -save -e40 -e522 -e533*/
|
||||
UINT32 g_intCount = 0;
|
||||
|
||||
@@ -168,10 +167,6 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID)
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
OsSchedUpdateSleepTime();
|
||||
#endif
|
||||
|
||||
hwiIndex = HalIntNumGet();
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_ISR_ENTER, hwiIndex);
|
||||
|
||||
@@ -102,15 +102,10 @@ WEAK VOID HalTickUnlock(VOID)
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
|
||||
UINT32 HalEnterSleep(VOID)
|
||||
{
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
if (sleep == OS_SYS_DEEP_SLEEP) {
|
||||
OsSchedToSleep();
|
||||
}
|
||||
#endif
|
||||
|
||||
__DSB();
|
||||
__WFI();
|
||||
__ISB();
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
#include "los_memory.h"
|
||||
#include "los_membox.h"
|
||||
|
||||
|
||||
/*lint -save -e40 -e522 -e533*/
|
||||
UINT32 g_intCount = 0;
|
||||
|
||||
@@ -168,10 +167,6 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID)
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
OsSchedUpdateSleepTime();
|
||||
#endif
|
||||
|
||||
hwiIndex = HalIntNumGet();
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_ISR_ENTER, hwiIndex);
|
||||
|
||||
@@ -102,15 +102,11 @@ WEAK VOID HalTickUnlock(VOID)
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
|
||||
UINT32 HalEnterSleep(VOID)
|
||||
{
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
if (sleep == OS_SYS_DEEP_SLEEP) {
|
||||
OsSchedToSleep();
|
||||
}
|
||||
#endif
|
||||
|
||||
__DSB();
|
||||
__WFI();
|
||||
__ISB();
|
||||
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
#include "los_memory.h"
|
||||
#include "los_membox.h"
|
||||
|
||||
|
||||
/*lint -save -e40 -e522 -e533*/
|
||||
UINT32 g_intCount = 0;
|
||||
|
||||
@@ -169,10 +168,6 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID)
|
||||
g_intCount++;
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
OsSchedUpdateSleepTime();
|
||||
#endif
|
||||
|
||||
hwiIndex = HalIntNumGet();
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_ISR_ENTER, hwiIndex);
|
||||
|
||||
@@ -103,16 +103,12 @@ WEAK VOID HalTickUnlock(VOID)
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
|
||||
UINT32 HalEnterSleep(VOID)
|
||||
{
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
if (sleep == OS_SYS_DEEP_SLEEP) {
|
||||
OsSchedToSleep();
|
||||
}
|
||||
#endif
|
||||
|
||||
__DSB();
|
||||
__WFI();
|
||||
__ISB();
|
||||
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
#include "los_memory.h"
|
||||
#include "los_membox.h"
|
||||
|
||||
|
||||
/*lint -save -e40 -e522 -e533*/
|
||||
UINT32 g_intCount = 0;
|
||||
|
||||
@@ -172,10 +171,6 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID)
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
OsSchedUpdateSleepTime();
|
||||
#endif
|
||||
|
||||
hwiIndex = HalIntNumGet();
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_ISR_ENTER, hwiIndex);
|
||||
|
||||
@@ -103,16 +103,11 @@ WEAK VOID HalTickUnlock(VOID)
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
|
||||
UINT32 HalEnterSleep(VOID)
|
||||
{
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
if (sleep == OS_SYS_DEEP_SLEEP) {
|
||||
OsSchedToSleep();
|
||||
}
|
||||
#endif
|
||||
|
||||
__DSB();
|
||||
__WFI();
|
||||
__ISB();
|
||||
}
|
||||
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
#include "los_memory.h"
|
||||
#include "los_membox.h"
|
||||
|
||||
|
||||
/*lint -save -e40 -e522 -e533*/
|
||||
UINT32 g_intCount = 0;
|
||||
|
||||
@@ -159,10 +158,6 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID)
|
||||
g_intCount++;
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
OsSchedUpdateSleepTime();
|
||||
#endif
|
||||
|
||||
hwiIndex = HalIntNumGet();
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_ISR_ENTER, hwiIndex);
|
||||
|
||||
@@ -102,15 +102,11 @@ WEAK VOID HalTickUnlock(VOID)
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
|
||||
UINT32 HalEnterSleep(VOID)
|
||||
{
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
if (sleep == OS_SYS_DEEP_SLEEP) {
|
||||
OsSchedToSleep();
|
||||
}
|
||||
#endif
|
||||
|
||||
__DSB();
|
||||
__WFI();
|
||||
__ISB();
|
||||
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
#include "los_memory.h"
|
||||
#include "los_membox.h"
|
||||
|
||||
|
||||
/*lint -save -e40 -e522 -e533*/
|
||||
UINT32 g_intCount = 0;
|
||||
|
||||
@@ -168,10 +167,6 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID)
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
OsSchedUpdateSleepTime();
|
||||
#endif
|
||||
|
||||
hwiIndex = HalIntNumGet();
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_ISR_ENTER, hwiIndex);
|
||||
|
||||
@@ -102,15 +102,11 @@ WEAK VOID HalTickUnlock(VOID)
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
|
||||
UINT32 HalEnterSleep(VOID)
|
||||
{
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
if (sleep == OS_SYS_DEEP_SLEEP) {
|
||||
OsSchedToSleep();
|
||||
}
|
||||
#endif
|
||||
|
||||
__DSB();
|
||||
__WFI();
|
||||
__ISB();
|
||||
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
@@ -52,20 +52,11 @@ extern "C" {
|
||||
#define RTC_CALIBRATE_SLEEP_TIME 8
|
||||
#define MACHINE_CYCLE_DEALAY_TIMES (LOSCFG_BASE_CORE_TICK_PER_SECOND << 2)
|
||||
|
||||
typedef enum {
|
||||
OS_SYS_NORMAL_SLEEP = 0,
|
||||
OS_SYS_DEEP_SLEEP,
|
||||
} LOS_SysSleepEnum;
|
||||
|
||||
VOID HalTickLock(VOID);
|
||||
|
||||
VOID HalTickUnlock(VOID);
|
||||
|
||||
BOOL HalGetSysSleepFlag(VOID);
|
||||
|
||||
VOID HalClearSysSleepFlag(VOID);
|
||||
|
||||
VOID HalEnterSleep(LOS_SysSleepEnum sleep);
|
||||
UINT32 HalEnterSleep(VOID);
|
||||
|
||||
/**
|
||||
* @ingroup los_timer
|
||||
|
||||
@@ -109,16 +109,11 @@ WEAK VOID HalTickUnlock(VOID)
|
||||
SysTimer_Start();
|
||||
}
|
||||
|
||||
|
||||
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
|
||||
UINT32 HalEnterSleep(VOID)
|
||||
{
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
if (sleep == OS_SYS_DEEP_SLEEP) {
|
||||
OsSchedToSleep();
|
||||
}
|
||||
#endif
|
||||
|
||||
__WFI();
|
||||
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -76,14 +76,10 @@ WEAK UINT64 HalGetTickCycle(UINT32 *period)
|
||||
return OS_COMBINED_64(timerH, timerL);
|
||||
}
|
||||
|
||||
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
|
||||
UINT32 HalEnterSleep(VOID)
|
||||
{
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
if (sleep == OS_SYS_DEEP_SLEEP) {
|
||||
OsSchedToSleep();
|
||||
}
|
||||
#endif
|
||||
|
||||
wfi();
|
||||
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -634,10 +634,34 @@ extern UINT8 *m_aucSysMem0;
|
||||
|
||||
/**
|
||||
* @ingroup los_config
|
||||
* When the tick timer is a non-64/128-bit timer, it has ultra-low power compensation.
|
||||
* Configuration item for low power frame tailoring
|
||||
*/
|
||||
#ifndef LOSCFG_BASE_CORE_SCHED_SLEEP
|
||||
#define LOSCFG_BASE_CORE_SCHED_SLEEP 0
|
||||
#ifndef LOSCFG_KERNEL_PM
|
||||
#define LOSCFG_KERNEL_PM 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @ingroup los_config
|
||||
* Configuration item for priority of low-power task.
|
||||
*/
|
||||
#ifndef LOSCFG_KERNEL_PM_TASK_PTIORITY
|
||||
#define LOSCFG_KERNEL_PM_TASK_PTIORITY 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @ingroup los_config
|
||||
* Configuration item for stack size of low-power task.
|
||||
*/
|
||||
#ifndef LOSCFG_KERNEL_PM_TASK_STACKSIZE
|
||||
#define LOSCFG_KERNEL_PM_TASK_STACKSIZE 0x800
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @ingroup los_config
|
||||
* Configuration item for low power frame debug tailoring
|
||||
*/
|
||||
#ifndef LOSCFG_KERNEL_PM_DEBUG
|
||||
#define LOSCFG_KERNEL_PM_DEBUG 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
||||
@@ -53,7 +53,7 @@ VOID OsSchedSetIdleTaskSchedParam(LosTaskCB *idleTask);
|
||||
|
||||
UINT32 OsSchedSwtmrScanRegister(SchedScan func);
|
||||
|
||||
VOID OsSchedUpdateExpireTime(UINT64 startTime);
|
||||
VOID OsSchedUpdateExpireTime(UINT64 startTime, BOOL timeUpdate);
|
||||
|
||||
VOID OsSchedTaskDeQueue(LosTaskCB *taskCB);
|
||||
|
||||
@@ -81,27 +81,64 @@ BOOL OsSchedTaskSwitch(VOID);
|
||||
|
||||
LosTaskCB *OsGetTopTask(VOID);
|
||||
|
||||
UINT32 OsSchedRealSleepTimeSet(VOID (*func)(UINT64));
|
||||
|
||||
VOID OsSchedTimerBaseReset(UINT64 currTime);
|
||||
|
||||
/**
|
||||
* @ingroup los_sched
|
||||
* @brief Get the time, in nanoseconds, remaining before the next tick interrupt response.
|
||||
*
|
||||
* @par Description:
|
||||
* This API is used to get the time, in nanoseconds, remaining before the next tick interrupt response.
|
||||
*
|
||||
* @attention None.
|
||||
*
|
||||
* @param None.
|
||||
*
|
||||
* @retval #time, in nanoseconds.
|
||||
* @par Dependency:
|
||||
* <ul><li>los_sched.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see
|
||||
*/
|
||||
extern UINT64 LOS_SchedTickTimeoutNsGet(VOID);
|
||||
|
||||
/**
|
||||
* @ingroup los_sched
|
||||
* @brief The system-provided tick interrupt handler.
|
||||
*
|
||||
* @par Description:
|
||||
* This API is used to wake up a task that is blocked by time.
|
||||
*
|
||||
* @attention None.
|
||||
*
|
||||
* @param None.
|
||||
*
|
||||
* @retval None.
|
||||
* @par Dependency:
|
||||
* <ul><li>los_sched.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see
|
||||
*/
|
||||
extern VOID LOS_SchedTickHandler(VOID);
|
||||
|
||||
/**
|
||||
* @ingroup los_sched
|
||||
* @brief Trigger a system dispatch.
|
||||
*
|
||||
* @par Description:
|
||||
* This API is used to trigger a system dispatch.
|
||||
*
|
||||
* @attention None.
|
||||
*
|
||||
* @param None.
|
||||
*
|
||||
* @retval None.
|
||||
* @par Dependency:
|
||||
* <ul><li>los_sched.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see
|
||||
*/
|
||||
extern VOID LOS_Schedule(VOID);
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
VOID OsSchedUpdateSleepTime(VOID);
|
||||
|
||||
VOID OsSchedToSleep(VOID);
|
||||
|
||||
typedef UINT32 (*SchedSleepInit)(VOID);
|
||||
|
||||
typedef VOID (*SchedSleepStart)(UINT64);
|
||||
|
||||
typedef VOID (*SchedSleepStop)(VOID);
|
||||
|
||||
typedef UINT64 (*SchedSleepGetSleepTimeNs)(VOID);
|
||||
|
||||
extern UINT32 LOS_SchedSleepInit(SchedSleepInit init, SchedSleepStart start,
|
||||
SchedSleepStop stop, SchedSleepGetSleepTimeNs getTime);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
|
||||
@@ -1636,6 +1636,8 @@ extern UINT32 OsGetAllTskInfo(VOID);
|
||||
|
||||
extern VOID *OsTskUserStackInit(VOID* stackPtr, VOID* userSP, UINT32 userStackSize);
|
||||
|
||||
extern UINT32 OsPmEnterHandlerSet(VOID (*func)(BOOL));
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
|
||||
@@ -124,6 +124,12 @@ extern UINT64 LOS_SysCycleGet(VOID);
|
||||
|
||||
#define OS_NS_PER_TICK (OS_SYS_NS_PER_SECOND / LOSCFG_BASE_CORE_TICK_PER_SECOND)
|
||||
|
||||
#define OS_SYS_CYCLE_TO_NS(cycle, freq) (((cycle) / (freq)) * OS_SYS_NS_PER_SECOND + \
|
||||
((cycle) % OS_SYS_CLOCK) * OS_SYS_NS_PER_SECOND / (freq))
|
||||
|
||||
#define OS_SYS_NS_TO_CYCLE(time, freq) (((time) / OS_SYS_NS_PER_SECOND) * (freq) + \
|
||||
(time % OS_SYS_NS_PER_SECOND) * (freq) / OS_SYS_NS_PER_SECOND)
|
||||
|
||||
/**
|
||||
* @ingroup los_tick
|
||||
* System time basic function error code: Null pointer.
|
||||
|
||||
@@ -62,6 +62,9 @@
|
||||
#include "los_backtrace.h"
|
||||
#endif
|
||||
|
||||
#if (LOSCFG_KERNEL_PM == 1)
|
||||
#include "los_pm.h"
|
||||
#endif
|
||||
|
||||
/*****************************************************************************
|
||||
Function : LOS_Reboot
|
||||
@@ -191,6 +194,14 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_KernelInit(VOID)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (LOSCFG_KERNEL_PM == 1)
|
||||
ret = OsPmInit();
|
||||
if (ret != LOS_OK) {
|
||||
PRINT_ERR("Pm init failed!\n");
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef LOSCFG_TEST
|
||||
//ret = los_TestInit();
|
||||
//if (ret != LOS_OK) {
|
||||
|
||||
@@ -59,19 +59,17 @@ STATIC UINT32 g_queueBitmap;
|
||||
|
||||
STATIC UINT32 g_schedResponseID = 0;
|
||||
STATIC UINT64 g_schedResponseTime = OS_SCHED_MAX_RESPONSE_TIME;
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
typedef struct {
|
||||
SchedSleepInit init;
|
||||
SchedSleepStart start;
|
||||
SchedSleepStop stop;
|
||||
SchedSleepGetSleepTimeNs getTimeNs;
|
||||
} SchedSleep;
|
||||
STATIC VOID (*SchedRealSleepTimeSet)(UINT64) = NULL;
|
||||
|
||||
STATIC BOOL g_schedSleepFlags = FALSE;
|
||||
STATIC UINT64 g_schedSleepTime;
|
||||
STATIC UINT64 g_schedEntrySleepTime;
|
||||
STATIC SchedSleep g_schedSleepCB;
|
||||
#endif
|
||||
UINT32 OsSchedRealSleepTimeSet(VOID (*func)(UINT64))
|
||||
{
|
||||
if (func == NULL) {
|
||||
return LOS_NOK;
|
||||
}
|
||||
|
||||
SchedRealSleepTimeSet = func;
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
#if (LOSCFG_BASE_CORE_TICK_WTIMER == 0)
|
||||
STATIC UINT64 g_schedTimerBase;
|
||||
@@ -83,6 +81,14 @@ VOID OsSchedUpdateSchedTimeBase(VOID)
|
||||
(VOID)HalGetTickCycle(&period);
|
||||
g_schedTimerBase += period;
|
||||
}
|
||||
|
||||
VOID OsSchedTimerBaseReset(UINT64 currTime)
|
||||
{
|
||||
LOS_ASSERT(currTime > g_schedTimerBase);
|
||||
|
||||
g_schedTimerBase = currTime;
|
||||
g_schedResponseTime = OS_SCHED_MAX_RESPONSE_TIME;
|
||||
}
|
||||
#endif
|
||||
|
||||
UINT64 OsGetCurrSchedTimeCycle(VOID)
|
||||
@@ -124,7 +130,7 @@ STATIC INLINE VOID OsTimeSliceUpdate(LosTaskCB *taskCB, UINT64 currTime)
|
||||
taskCB->startTime = currTime;
|
||||
}
|
||||
|
||||
STATIC INLINE VOID OsSchedSetNextExpireTime(UINT64 startTime, UINT32 responseID, UINT64 taskEndTime)
|
||||
STATIC INLINE VOID OsSchedSetNextExpireTime(UINT64 startTime, UINT32 responseID, UINT64 taskEndTime, BOOL timeUpdate)
|
||||
{
|
||||
UINT64 nextExpireTime = OsGetNextExpireTime(startTime);
|
||||
UINT64 nextResponseTime;
|
||||
@@ -141,15 +147,15 @@ STATIC INLINE VOID OsSchedSetNextExpireTime(UINT64 startTime, UINT32 responseID,
|
||||
if ((g_schedResponseTime > nextExpireTime) && ((g_schedResponseTime - nextExpireTime) >= OS_CYCLE_PER_TICK)) {
|
||||
nextResponseTime = nextExpireTime - startTime;
|
||||
if (nextResponseTime > OS_TICK_RESPONSE_TIME_MAX) {
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
g_schedSleepTime = nextResponseTime - OS_CYCLE_PER_TICK;
|
||||
#endif
|
||||
if (SchedRealSleepTimeSet != NULL) {
|
||||
SchedRealSleepTimeSet(nextResponseTime);
|
||||
}
|
||||
nextResponseTime = OS_TICK_RESPONSE_TIME_MAX;
|
||||
nextExpireTime = startTime + nextResponseTime;
|
||||
} else if (nextResponseTime < OS_CYCLE_PER_TICK) {
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
g_schedSleepTime = 0;
|
||||
#endif
|
||||
if (SchedRealSleepTimeSet != NULL) {
|
||||
SchedRealSleepTimeSet(0);
|
||||
}
|
||||
nextResponseTime = OS_CYCLE_PER_TICK;
|
||||
nextExpireTime = startTime + nextResponseTime;
|
||||
if (nextExpireTime >= g_schedResponseTime) {
|
||||
@@ -170,12 +176,14 @@ STATIC INLINE VOID OsSchedSetNextExpireTime(UINT64 startTime, UINT32 responseID,
|
||||
|
||||
g_schedResponseTime = nextExpireTime;
|
||||
#if (LOSCFG_BASE_CORE_TICK_WTIMER == 0)
|
||||
g_schedTimerBase = OsGetCurrSchedTimeCycle();
|
||||
if (timeUpdate) {
|
||||
g_schedTimerBase = OsGetCurrSchedTimeCycle();
|
||||
}
|
||||
#endif
|
||||
HalSysTickReload(nextResponseTime);
|
||||
}
|
||||
|
||||
VOID OsSchedUpdateExpireTime(UINT64 startTime)
|
||||
VOID OsSchedUpdateExpireTime(UINT64 startTime, BOOL timeUpdate)
|
||||
{
|
||||
UINT64 endTime;
|
||||
LosTaskCB *runTask = g_losTask.runTask;
|
||||
@@ -186,7 +194,7 @@ VOID OsSchedUpdateExpireTime(UINT64 startTime)
|
||||
} else {
|
||||
endTime = OS_SCHED_MAX_RESPONSE_TIME;
|
||||
}
|
||||
OsSchedSetNextExpireTime(startTime, runTask->taskID, endTime);
|
||||
OsSchedSetNextExpireTime(startTime, runTask->taskID, endTime, timeUpdate);
|
||||
}
|
||||
|
||||
STATIC INLINE VOID OsSchedPriQueueEnHead(LOS_DL_LIST *priqueueItem, UINT32 priority)
|
||||
@@ -450,7 +458,7 @@ VOID OsSchedStart(VOID)
|
||||
|
||||
g_schedResponseTime = OS_SCHED_MAX_RESPONSE_TIME;
|
||||
g_schedResponseID = OS_INVALID;
|
||||
OsSchedSetNextExpireTime(newTask->startTime, newTask->taskID, newTask->startTime + newTask->timeSlice);
|
||||
OsSchedSetNextExpireTime(newTask->startTime, newTask->taskID, newTask->startTime + newTask->timeSlice, TRUE);
|
||||
|
||||
PRINTK("Entering scheduler\n");
|
||||
}
|
||||
@@ -490,11 +498,31 @@ BOOL OsSchedTaskSwitch(VOID)
|
||||
} else {
|
||||
endTime = OS_SCHED_MAX_RESPONSE_TIME;
|
||||
}
|
||||
OsSchedSetNextExpireTime(newTask->startTime, newTask->taskID, endTime);
|
||||
OsSchedSetNextExpireTime(newTask->startTime, newTask->taskID, endTime, TRUE);
|
||||
|
||||
return isTaskSwitch;
|
||||
}
|
||||
|
||||
UINT64 LOS_SchedTickTimeoutNsGet(VOID)
|
||||
{
|
||||
UINT32 intSave;
|
||||
UINT64 responseTime;
|
||||
UINT64 currTime;
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
responseTime = g_schedResponseTime;
|
||||
currTime = OsGetCurrSchedTimeCycle();
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
if (responseTime > currTime) {
|
||||
responseTime = responseTime - currTime;
|
||||
} else {
|
||||
responseTime = 0; /* Tick interrupt already timeout */
|
||||
}
|
||||
|
||||
return OS_SYS_CYCLE_TO_NS(responseTime, OS_SYS_CLOCK);
|
||||
}
|
||||
|
||||
VOID LOS_SchedTickHandler(VOID)
|
||||
{
|
||||
UINT64 currTime;
|
||||
@@ -518,7 +546,7 @@ VOID LOS_SchedTickHandler(VOID)
|
||||
} else {
|
||||
currTime = OsGetCurrSchedTimeCycle();
|
||||
OsTimeSliceUpdate(g_losTask.runTask, currTime);
|
||||
OsSchedUpdateExpireTime(currTime);
|
||||
OsSchedUpdateExpireTime(currTime, TRUE);
|
||||
}
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
@@ -531,103 +559,6 @@ VOID LOS_Schedule(VOID)
|
||||
}
|
||||
}
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
|
||||
VOID OsSchedUpdateSleepTime(VOID)
|
||||
{
|
||||
UINT64 nextResponseTime;
|
||||
UINT64 currTime, realSleepTime;
|
||||
UINT32 intSave;
|
||||
|
||||
if ((g_schedSleepFlags == FALSE) || (g_schedSleepCB.stop == NULL)) {
|
||||
return;
|
||||
}
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
if (g_schedSleepCB.getTimeNs != NULL) {
|
||||
realSleepTime = g_schedSleepCB.getTimeNs();
|
||||
realSleepTime = (realSleepTime / OS_SYS_NS_PER_SECOND) * OS_SYS_CLOCK +
|
||||
(realSleepTime % OS_SYS_NS_PER_SECOND) * OS_SYS_CLOCK / OS_SYS_NS_PER_SECOND;
|
||||
if (realSleepTime < g_schedSleepTime) {
|
||||
nextResponseTime = g_schedSleepTime - realSleepTime;
|
||||
} else {
|
||||
nextResponseTime = 0;
|
||||
}
|
||||
|
||||
#if (LOSCFG_BASE_CORE_TICK_WTIMER == 1)
|
||||
currTime = HalGetTickCycle(NULL);
|
||||
#else
|
||||
g_schedTimerBase = g_schedEntrySleepTime + realSleepTime;
|
||||
currTime = g_schedTimerBase;
|
||||
#endif
|
||||
if (nextResponseTime > OS_TICK_RESPONSE_TIME_MAX) {
|
||||
nextResponseTime = OS_TICK_RESPONSE_TIME_MAX;
|
||||
} else if (nextResponseTime < OS_CYCLE_PER_TICK) {
|
||||
nextResponseTime = OS_CYCLE_PER_TICK;
|
||||
}
|
||||
|
||||
g_schedResponseID = OS_INVALID;
|
||||
g_schedResponseTime = currTime + nextResponseTime;
|
||||
HalSysTickReload(nextResponseTime);
|
||||
g_schedSleepTime = 0;
|
||||
}
|
||||
g_schedSleepFlags = FALSE;
|
||||
g_schedSleepCB.stop();
|
||||
LOS_IntRestore(intSave);
|
||||
}
|
||||
|
||||
VOID OsSchedToSleep(VOID)
|
||||
{
|
||||
UINT32 intSave;
|
||||
UINT64 sleepTime;
|
||||
|
||||
if (g_schedSleepCB.start == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (g_schedSleepCB.getTimeNs != NULL) {
|
||||
sleepTime = (g_schedSleepTime / OS_SYS_CLOCK) * OS_SYS_NS_PER_SECOND +
|
||||
(g_schedSleepTime % OS_SYS_CLOCK) * OS_SYS_NS_PER_SECOND / OS_SYS_CLOCK;
|
||||
if (sleepTime == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
HalTickLock();
|
||||
g_schedEntrySleepTime = OsGetCurrSchedTimeCycle();
|
||||
} else {
|
||||
intSave = LOS_IntLock();
|
||||
}
|
||||
|
||||
g_schedSleepCB.start(sleepTime);
|
||||
g_schedSleepFlags = TRUE;
|
||||
LOS_IntRestore(intSave);
|
||||
}
|
||||
|
||||
UINT32 LOS_SchedSleepInit(SchedSleepInit init, SchedSleepStart start,
|
||||
SchedSleepStop stop, SchedSleepGetSleepTimeNs getTime)
|
||||
{
|
||||
UINT32 ret;
|
||||
|
||||
if ((init == NULL) && (start == NULL) && (stop == NULL)) {
|
||||
return LOS_NOK;
|
||||
}
|
||||
|
||||
g_schedSleepCB.init = init;
|
||||
g_schedSleepCB.start = start;
|
||||
g_schedSleepCB.stop = stop;
|
||||
g_schedSleepCB.getTimeNs = getTime;
|
||||
|
||||
if (g_schedSleepCB.init != NULL) {
|
||||
ret = g_schedSleepCB.init();
|
||||
if (ret != LOS_OK) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return LOS_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
|
||||
@@ -217,7 +217,7 @@ LITE_OS_SEC_TEXT VOID OsSwtmrStart(SWTMR_CTRL_S *swtmr)
|
||||
#endif
|
||||
OsAdd2SortLink(&swtmr->stSortList, currTime, swtmr->uwCount, OS_SORT_LINK_SWTMR);
|
||||
if (LOS_TaskIsRunning()) {
|
||||
OsSchedUpdateExpireTime(currTime);
|
||||
OsSchedUpdateExpireTime(currTime, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -248,7 +248,7 @@ LITE_OS_SEC_TEXT VOID OsSwtmrStop(SWTMR_CTRL_S *swtmr)
|
||||
swtmr->ucState = OS_SWTMR_STATUS_CREATED;
|
||||
|
||||
if (LOS_TaskIsRunning()) {
|
||||
OsSchedUpdateExpireTime(OsGetCurrSchedTimeCycle());
|
||||
OsSchedUpdateExpireTime(OsGetCurrSchedTimeCycle(), TRUE);
|
||||
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
|
||||
g_swtmrAlignID[swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT].isAligned = 0;
|
||||
#endif
|
||||
|
||||
@@ -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