diff --git a/kal/cmsis/cmsis_liteos2.c b/kal/cmsis/cmsis_liteos2.c
index c37552a8..9f679f10 100755
--- a/kal/cmsis/cmsis_liteos2.c
+++ b/kal/cmsis/cmsis_liteos2.c
@@ -242,25 +242,7 @@ int32_t osKernelRestoreLock(int32_t lock)
uint32_t osKernelGetTickCount(void)
{
- uint64_t ticks;
- UINTPTR uvIntSave;
-
- if (OS_INT_ACTIVE) {
-#ifndef LITEOS_WIFI_IOT_VERSION
- ticks = g_ullTickCount;
-#else
- ticks = g_tickCount;
-#endif
- } else {
- uvIntSave = LOS_IntLock();
-#ifndef LITEOS_WIFI_IOT_VERSION
- ticks = g_ullTickCount;
-#else
- ticks = g_tickCount;
-#endif
- LOS_IntRestore(uvIntSave);
- }
-
+ uint64_t ticks = LOS_TickCountGet();
return (uint32_t)ticks;
}
@@ -316,11 +298,7 @@ osThreadId_t osThreadNew(osThreadFunc_t func, void *argument, const osThreadAttr
(void)memset_s(&stTskInitParam, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));
stTskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)func;
-#ifndef LITEOS_WIFI_IOT_VERSION
stTskInitParam.uwArg = (UINT32)argument;
-#else
- stTskInitParam.auwArgs[0] = (UINT32)argument;
-#endif
stTskInitParam.uwStackSize = attr->stack_size;
stTskInitParam.pcName = (CHAR *)attr->name;
stTskInitParam.usTaskPrio = OS_TASK_PRIORITY_LOWEST - ((UINT16)(attr->priority) - LOS_PRIORITY_WIN); /* 0~31 */
@@ -370,11 +348,7 @@ void *osThreadGetArgument(void)
if (taskCb == NULL) {
return NULL;
}
-#ifndef LITEOS_WIFI_IOT_VERSION
return (void *)(taskCb->arg);
-#else
- return (void *)(taskCb->args[0]);
-#endif
}
osThreadState_t osThreadGetState(osThreadId_t thread_id)
@@ -395,7 +369,7 @@ osThreadState_t osThreadGetState(osThreadId_t thread_id)
} else if (taskStatus & OS_TASK_STATUS_READY) {
stState = osThreadReady;
} else if (taskStatus &
- (OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND | OS_TASK_STATUS_SUSPEND | OS_TASK_STATUS_PEND_QUEUE)) {
+ (OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND | OS_TASK_STATUS_SUSPEND)) {
stState = osThreadBlocked;
} else if (taskStatus & OS_TASK_STATUS_UNUSED) {
stState = osThreadInactive;
diff --git a/kernel/arch/arm/cortex-m3/keil/los_arch_context.h b/kernel/arch/arm/cortex-m3/keil/los_arch_context.h
index 972f2fde..afd1810a 100644
--- a/kernel/arch/arm/cortex-m3/keil/los_arch_context.h
+++ b/kernel/arch/arm/cortex-m3/keil/los_arch_context.h
@@ -41,7 +41,7 @@ extern "C" {
#endif /* __cpluscplus */
#endif /* __cpluscplus */
-typedef struct tagTskContext {
+typedef struct TagTskContext {
#if ((defined(__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined(__FPU_USED) && (__FPU_USED == 1U)))
UINT32 S16;
diff --git a/kernel/arch/arm/cortex-m3/keil/los_arch_interrupt.h b/kernel/arch/arm/cortex-m3/keil/los_arch_interrupt.h
old mode 100755
new mode 100644
index b3ab442f..165f9346
--- a/kernel/arch/arm/cortex-m3/keil/los_arch_interrupt.h
+++ b/kernel/arch/arm/cortex-m3/keil/los_arch_interrupt.h
@@ -449,15 +449,14 @@ extern VOID HalPendSV(VOID);
#define OS_EXC_EVENT 0x00000001
/**
- *@ingroup los_exc
+ * @ingroup los_exc
* the struct of register files
*
* description: the register files that saved when exception triggered
*
* notes:the following register with prefix 'uw' correspond to the registers in the cpu data sheet.
*/
-typedef struct tagExcContext {
- //handler save
+typedef struct TagExcContext {
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
UINT32 S16;
@@ -486,7 +485,7 @@ typedef struct tagExcContext {
UINT32 uwR10;
UINT32 uwR11;
UINT32 uwPriMask;
- //auto save
+ /* auto save */
UINT32 uwSP;
UINT32 uwR0;
UINT32 uwR1;
@@ -532,7 +531,7 @@ VOID HalExcHandleEntry(UINT32 excType, UINT32 faultAddr, UINT32 pid, EXC_CONTEXT
* @attention:
*
*
- *@param uwArraySize [IN] Memory size of exception.
+ * @param uwArraySize [IN] Memory size of exception.
*
* @retval: None
* @par Dependency:
@@ -551,155 +550,155 @@ VOID HalHwiInit();
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器入栈时发生错误
+ * @ingroup los_exc
+ * Cortex-M exception types: An error occurred while the bus status register was being pushed.
*/
#define OS_EXC_BF_STKERR 1
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器出栈时发生错误
+ * @ingroup los_exc
+ * Cortex-M exception types: An error occurred while the bus status register was out of the stack.
*/
#define OS_EXC_BF_UNSTKERR 2
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器不精确的数据访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Bus status register imprecise data access violation.
*/
#define OS_EXC_BF_IMPRECISERR 3
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器精确的数据访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Bus status register exact data access violation.
*/
#define OS_EXC_BF_PRECISERR 4
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器取指时的访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Bus status register access violation while pointing.
*/
#define OS_EXC_BF_IBUSERR 5
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:存储器管理状态寄存器入栈时发生错误
+ * @ingroup los_exc
+ * Cortex-M exception types: An error occurred while the memory management status register was being pushed.
*/
#define OS_EXC_MF_MSTKERR 6
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:存储器管理状态寄存器出栈时发生错误
+ * @ingroup los_exc
+ * Cortex-M exception types: An error occurred while the memory management status register was out of the stack.
*/
#define OS_EXC_MF_MUNSTKERR 7
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:存储器管理状态寄存器数据访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Memory management status register data access violation.
*/
#define OS_EXC_MF_DACCVIOL 8
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:存储器管理状态寄存器取指访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Memory management status register access violation.
*/
#define OS_EXC_MF_IACCVIOL 9
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,表示除法运算时除数为零
+ * @ingroup los_exc
+ * Cortex-M exception types: ncorrect usage indicating that the divisor is zero during the division operation.
*/
#define OS_EXC_UF_DIVBYZERO 10
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,未对齐访问导致的错误
+ * @ingroup los_exc
+ * Cortex-M exception types: Usage error, error caused by unaligned access.
*/
#define OS_EXC_UF_UNALIGNED 11
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,试图执行协处理器相关指令
+ * @ingroup los_exc
+ * Cortex-M exception types: Incorrect usage attempting to execute coprocessor related instruction.
*/
#define OS_EXC_UF_NOCP 12
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,在异常返回时试图非法地加载EXC_RETURN到PC
+ * @ingroup los_exc
+ * Cortex-M exception types: Usage error attempting to load EXC_RETURN to PC illegally on exception return.
*/
#define OS_EXC_UF_INVPC 13
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,试图切入ARM状态
+ * @ingroup los_exc
+ * Cortex-M exception types: Incorrect usage, attempting to cut to ARM state.
*/
#define OS_EXC_UF_INVSTATE 14
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,执行的指令其编码是未定义的——解码不能
+ * @ingroup los_exc
+ * Cortex-M exception types: Incorrect usage. Executed instruction whose code is undefined.
*/
#define OS_EXC_UF_UNDEFINSTR 15
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:NMI中断
+ * @ingroup los_exc
+ * Cortex-M exception types: NMI
*/
#define OS_EXC_CAUSE_NMI 16
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:硬fault
+ * @ingroup los_exc
+ * Cortex-M exception types: hard fault
*/
#define OS_EXC_CAUSE_HARDFAULT 17
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:任务处理函数退出
+ * @ingroup los_exc
+ * Cortex-M exception types: The task handler exits.
*/
#define OS_EXC_CAUSE_TASK_EXIT 18
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:致命错误
+ * @ingroup los_exc
+ * Cortex-M exception types: A fatal error.
*/
#define OS_EXC_CAUSE_FATAL_ERR 19
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:调试事件导致的硬fault
+ * @ingroup los_exc
+ * Cortex-M exception types: Hard Fault caused by a debug event.
*/
#define OS_EXC_CAUSE_DEBUGEVT 20
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:取向量时发生的硬fault
+ * @ingroup los_exc
+ * Cortex-M exception types: A hard fault that occurs when a quantity is oriented.
*/
#define OS_EXC_CAUSE_VECTBL 21
/**
- *@ingroup los_exc
- * 异常信息结构体
+ * @ingroup los_exc
+ * Exception information structure
*
- * 描述:M4平台下的异常触发时保存的异常信息
+ * Description: Exception information saved when an exception is triggered on the Cortex-M4 platform.
*
*/
-typedef struct tagExcInfo {
- /**< 异常发生阶段: 0表示异常发生在初始化中,1表示异常发生在任务中,2表示异常发生在中断中 */
+typedef struct TagExcInfo {
+ /**< Exception occurrence phase: 0 means that an exception occurs in initialization, 1 means that an exception occurs in a task, and 2 means that an exception occurs in an interrupt */
UINT16 phase;
- /**< 异常类型,出异常时对照上面列出的1-19号 */
+ /**< Exception type. When exceptions occur, check the numbers 1 - 19 listed above */
UINT16 type;
- /**< 若为精确地址访问错误表示异常发生时的错误访问地址 */
+ /**< If the exact address access error indicates the wrong access address when the exception occurred */
UINT32 faultAddr;
- /**< 在中断中发生异常,表示中断号。在任务中发生异常,表示任务id,如果发生在初始化中,则为0xffffffff */
+ /**< An exception occurs in an interrupt, indicating the interrupt number. An exception occurs in the task, indicating the task ID, or 0xFFFFFFFF if it occurs during initialization */
UINT32 thrdPid;
- /**< 异常嵌套个数,目前仅支持第一次进入异常时执行注册的钩子函数 */
+ /**< Number of nested exceptions. Currently only registered hook functions are supported when an exception is entered for the first time */
UINT16 nestCnt;
- /**< 保留 */
+ /**< reserve */
UINT16 reserved;
- /**< 自动压栈浮点寄存器的异常发生时刻的硬件上下文 */
- EXC_CONTEXT_S * context;
+ /**< Hardware context at the time an exception to the automatic stack floating-point register occurs */
+ EXC_CONTEXT_S *context;
} ExcInfo;
extern UINT32 g_curNestCount;
diff --git a/kernel/arch/arm/cortex-m3/keil/los_context.c b/kernel/arch/arm/cortex-m3/keil/los_context.c
old mode 100755
new mode 100644
index 72e33a02..60ebb680
--- a/kernel/arch/arm/cortex-m3/keil/los_context.c
+++ b/kernel/arch/arm/cortex-m3/keil/los_context.c
@@ -28,14 +28,18 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include "los_config.h"
-#include "los_task.h"
+
+#include "los_context.h"
#include "securec.h"
-#include "los_interrupt.h"
+#include "ARMCM3.h"
#include "los_arch_context.h"
#include "los_arch_interrupt.h"
+#include "los_task.h"
+#include "los_sched.h"
+#include "los_interrupt.h"
#include "los_arch_timer.h"
-#include "ARMCM3.h"
+#include "los_timer.h"
+
#ifdef __cplusplus
#if __cplusplus
extern "C" {
@@ -56,7 +60,7 @@ LITE_OS_SEC_TEXT_INIT VOID HalArchInit()
/* ****************************************************************************
Function : HalSysExit
- Description : exit function
+ Description : Task exit function
Input : None
Output : None
Return : None
@@ -64,7 +68,8 @@ LITE_OS_SEC_TEXT_INIT VOID HalArchInit()
LITE_OS_SEC_TEXT_MINOR VOID HalSysExit(VOID)
{
LOS_IntLock();
- for(;;);
+ while (1) {
+ }
}
/* ****************************************************************************
@@ -151,11 +156,12 @@ LITE_OS_SEC_TEXT_INIT VOID *HalTskStackInit(UINT32 taskID, UINT32 stackSize, VOI
LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
{
- UINT32 ret;
- ret = HalTickStart(handler);
+ (VOID)LOS_IntLock();
+ UINT32 ret = HalTickStart(handler);
if (ret != LOS_OK) {
return ret;
}
+ OsSchedStart();
HalStartToRun();
return LOS_OK; /* never return */
}
@@ -165,5 +171,3 @@ LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
}
#endif /* __cplusplus */
#endif /* __cplusplus */
-
-
diff --git a/kernel/arch/arm/cortex-m3/keil/los_dispatch.S b/kernel/arch/arm/cortex-m3/keil/los_dispatch.S
index f6bb1088..b4d1c254 100644
--- a/kernel/arch/arm/cortex-m3/keil/los_dispatch.S
+++ b/kernel/arch/arm/cortex-m3/keil/los_dispatch.S
@@ -37,9 +37,8 @@
EXPORT HalStartToRun
EXPORT HalTaskSchedule
EXPORT HalPendSV
-
+ IMPORT OsSchedTaskSwitch
IMPORT g_losTask
- IMPORT g_taskScheduled
OS_NVIC_INT_CTRL EQU 0xE000ED04
OS_NVIC_SYSPRI2 EQU 0xE000ED20
@@ -56,26 +55,11 @@ HalStartToRun
LDR R5, =OS_NVIC_PENDSV_PRI
STR R5, [R4]
- LDR R0, =g_taskScheduled
- MOV R1, #1
- STR R1, [R0]
-
MOV R0, #2
MSR CONTROL, R0
-
- LDR R0, =g_losTask
- LDR R2, [R0, #4]
- LDR R0, =g_losTask
- STR R2, [R0]
-
- LDR R3, =g_losTask
- LDR R0, [R3]
- LDRH R7, [R0 , #4]
- MOV R8, #OS_TASK_STATUS_RUNNING
- ORR R7, R7, R8
- STRH R7, [R0 , #4]
-
+ LDR R1, =g_losTask
+ LDR R0, [R1, #4]
LDR R12, [R0]
;ADD R12, R12, #100
ADD R12, R12, #36
@@ -120,6 +104,17 @@ HalPendSV
CPSID I
HalTaskSwitch
+ PUSH {R12, LR}
+ BL OsSchedTaskSwitch
+ POP {R12, LR}
+ CMP R0, #0
+ MOV R0, LR
+ BNE TaskContextSwitch
+ MSR PRIMASK, R12
+ BX LR
+
+TaskContextSwitch
+ MOV LR, R0
MRS R0, PSP
STMFD R0!, {R4-R12}
@@ -129,23 +124,9 @@ HalTaskSwitch
LDR R6, [R5]
STR R0, [R6]
-
- LDRH R7, [R6 , #4]
- MOV R8,#OS_TASK_STATUS_RUNNING
- BIC R7, R7, R8
- STRH R7, [R6 , #4]
-
-
- LDR R0, =g_losTask
- LDR R0, [R0, #4]
+ LDR R0, [R5, #4]
STR R0, [R5]
-
- LDRH R7, [R0 , #4]
- MOV R8, #OS_TASK_STATUS_RUNNING
- ORR R7, R7, R8
- STRH R7, [R0 , #4]
-
LDR R1, [R0]
;VLDMIA R1!, {D8-D15}
LDMFD R1!, {R4-R12}
diff --git a/kernel/arch/arm/cortex-m3/keil/los_interrupt.c b/kernel/arch/arm/cortex-m3/keil/los_interrupt.c
old mode 100755
new mode 100644
index 54756f26..83ca2882
--- a/kernel/arch/arm/cortex-m3/keil/los_interrupt.c
+++ b/kernel/arch/arm/cortex-m3/keil/los_interrupt.c
@@ -36,6 +36,7 @@
#include "los_arch_interrupt.h"
#include "los_debug.h"
#include "los_task.h"
+#include "los_sched.h"
#include "los_memory.h"
#include "los_membox.h"
@@ -107,7 +108,7 @@ VOID OsSetVector(UINT32 num, HWI_PROC_FUNC vector)
}
#endif
-__weak VOID SysTick_Handler(VOID)
+WEAK VOID SysTick_Handler(VOID)
{
return;
}
@@ -170,11 +171,13 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID)
#endif
intSave = LOS_IntLock();
-
g_intCount++;
-
LOS_IntRestore(intSave);
+#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
+ OsSchedUpdateSleepTime();
+#endif
+
hwiIndex = HalIntNumGet();
HalPreInterruptHandler(hwiIndex);
diff --git a/kernel/arch/arm/cortex-m3/keil/los_timer.c b/kernel/arch/arm/cortex-m3/keil/los_timer.c
old mode 100755
new mode 100644
index dd0e4a46..a74bf0ac
--- a/kernel/arch/arm/cortex-m3/keil/los_timer.c
+++ b/kernel/arch/arm/cortex-m3/keil/los_timer.c
@@ -28,20 +28,22 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+
+#include "los_timer.h"
#include "los_config.h"
+#include "ARMCM3.h"
#include "los_tick.h"
#include "los_arch_interrupt.h"
-#include "ARMCM3.h"
-#include "los_timer.h"
#include "los_context.h"
+#include "los_sched.h"
+#include "los_debug.h"
+
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif /* __cpluscplus */
#endif /* __cpluscplus */
-
-
/* ****************************************************************************
Function : HalTickStart
Description : Configure Tick Interrupt Start
@@ -69,7 +71,6 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
g_sysClock = OS_SYS_CLOCK;
g_cyclesPerTick = OS_SYS_CLOCK / LOSCFG_BASE_CORE_TICK_PER_SECOND;
- g_ullTickCount = 0;
ret = SysTick_Config(g_cyclesPerTick);
if (ret == 1) {
@@ -79,153 +80,64 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
return LOS_OK;
}
-VOID HalSysTickReload(UINT32 cyclesPerTick)
+WEAK VOID HalSysTickReload(UINT64 nextResponseTime)
{
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
- NVIC_ClearPendingIRQ(SysTick_IRQn);
- SysTick->LOAD = (UINT32)(cyclesPerTick - 1UL); /* set reload register */
+ SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
+ NVIC_ClearPendingIRQ(SysTick_IRQn);
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
}
-/* ****************************************************************************
-Function : HalSysTickCurrCycleGet
-Description : Get System cycle count
-Input : none
-output : none
-return : hwCycle --- the system cycle count
-**************************************************************************** */
-LITE_OS_SEC_TEXT_MINOR UINT32 HalSysTickCurrCycleGet(VOID)
+WEAK UINT64 HalGetTickCycle(UINT32 *period)
{
UINT32 hwCycle;
- UINTPTR intSave;
-
- intSave = LOS_IntLock();
- hwCycle = SysTick->VAL;
-
- /* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
- if ((SCB->ICSR & TICK_CHECK) != 0) {
- hwCycle = SysTick->VAL;
- hwCycle += g_cyclesPerTick;
- }
-
+ UINTPTR intSave = LOS_IntLock();
+ *period = SysTick->LOAD;
+ hwCycle = *period - SysTick->VAL;
LOS_IntRestore(intSave);
-
- return hwCycle;
+ return (UINT64)hwCycle;
}
-/* ****************************************************************************
-Function : HalGetCpuCycle
-Description : Get System cycle count
-Input : none
-output : cntHi --- CpuTick High 4 byte
- cntLo --- CpuTick Low 4 byte
-return : none
-**************************************************************************** */
-LITE_OS_SEC_TEXT_MINOR VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
+WEAK VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
{
- UINT64 swTick;
UINT64 cycle;
- UINT32 hwCycle;
- UINTPTR intSave;
-
- intSave = LOS_IntLock();
-
- swTick = g_ullTickCount;
- hwCycle = SysTick->VAL;
-
- /* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
- if ((SCB->ICSR & TICK_CHECK) != 0) {
- hwCycle = SysTick->VAL;
- swTick++;
- }
-
- cycle = (((swTick) * g_cyclesPerTick) + (g_cyclesPerTick - hwCycle));
-
- *cntHi = cycle >> SHIFT_32_BIT;
- *cntLo = cycle & CYCLE_CHECK;
-
- LOS_IntRestore(intSave);
-
- return;
-}
-
-/* ****************************************************************************
-Function : HalGetSystickCycle
-Description : Get Sys tick cycle count
-Input : none
-output : cntHi --- SysTick count High 4 byte
- cntLo --- SysTick count Low 4 byte
-return : none
-**************************************************************************** */
-LITE_OS_SEC_TEXT_MINOR VOID HalGetSystickCycle(UINT32 *cntHi, UINT32 *cntLo)
-{
- UINT64 swTick;
- UINT64 cycle;
- UINT32 hwCycle;
- UINTPTR intSave;
- UINT32 systickLoad;
- UINT32 systickCur;
-
- intSave = LOS_IntLock();
-
- swTick = g_ullTickCount;
-
- systickLoad = SysTick->LOAD;
- systickCur = SysTick->VAL;
- if (systickLoad < systickCur) {
- LOS_IntRestore(intSave);
+ if ((cntHi == NULL) || (cntLo == NULL)) {
return;
}
- hwCycle = systickLoad - systickCur;
- /* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
- if ((SCB->ICSR & TICK_CHECK) != 0) {
- hwCycle = systickLoad - systickCur;
- swTick++;
- }
-
- cycle = hwCycle + swTick * systickLoad;
+ cycle = OsGetCurrSchedTimeCycle();
*cntHi = cycle >> SHIFT_32_BIT;
*cntLo = cycle & CYCLE_CHECK;
-
- LOS_IntRestore(intSave);
-
return;
}
-static BOOL g_sysSleepFlag = FALSE;
-
-VOID HalTickLock(VOID)
+WEAK VOID HalTickLock(VOID)
{
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
+ SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
-VOID HalTickUnlock(VOID)
+WEAK VOID HalTickUnlock(VOID)
{
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
-}
-
-BOOL HalGetSysSleepFlag(VOID)
-{
- return g_sysSleepFlag;
-}
-
-VOID HalClearSysSleepFlag(VOID)
-{
- g_sysSleepFlag = FALSE;
+ SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
}
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
{
- __DSB();
- __WFI();
- __ISB();
+#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
+ if (sleep == OS_SYS_DEEP_SLEEP) {
+ OsSchedToSleep();
+ }
+#endif
+
+ __DSB();
+ __WFI();
+ __ISB();
}
WEAK VOID HalDelay(UINT32 ticks)
{
-
+ return;
}
WEAK UINT64 HalGetExpandTick(VOID)
diff --git a/kernel/arch/arm/cortex-m33/gcc/los_arch_context.h b/kernel/arch/arm/cortex-m33/gcc/los_arch_context.h
index 972f2fde..afd1810a 100644
--- a/kernel/arch/arm/cortex-m33/gcc/los_arch_context.h
+++ b/kernel/arch/arm/cortex-m33/gcc/los_arch_context.h
@@ -41,7 +41,7 @@ extern "C" {
#endif /* __cpluscplus */
#endif /* __cpluscplus */
-typedef struct tagTskContext {
+typedef struct TagTskContext {
#if ((defined(__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined(__FPU_USED) && (__FPU_USED == 1U)))
UINT32 S16;
diff --git a/kernel/arch/arm/cortex-m33/gcc/los_arch_interrupt.h b/kernel/arch/arm/cortex-m33/gcc/los_arch_interrupt.h
old mode 100755
new mode 100644
index b3ab442f..445a7fe7
--- a/kernel/arch/arm/cortex-m33/gcc/los_arch_interrupt.h
+++ b/kernel/arch/arm/cortex-m33/gcc/los_arch_interrupt.h
@@ -449,15 +449,14 @@ extern VOID HalPendSV(VOID);
#define OS_EXC_EVENT 0x00000001
/**
- *@ingroup los_exc
+ * @ingroup los_exc
* the struct of register files
*
* description: the register files that saved when exception triggered
*
* notes:the following register with prefix 'uw' correspond to the registers in the cpu data sheet.
*/
-typedef struct tagExcContext {
- //handler save
+typedef struct TagExcContext {
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
UINT32 S16;
@@ -486,7 +485,7 @@ typedef struct tagExcContext {
UINT32 uwR10;
UINT32 uwR11;
UINT32 uwPriMask;
- //auto save
+ /* auto save */
UINT32 uwSP;
UINT32 uwR0;
UINT32 uwR1;
@@ -532,7 +531,7 @@ VOID HalExcHandleEntry(UINT32 excType, UINT32 faultAddr, UINT32 pid, EXC_CONTEXT
* @attention:
*
*
- *@param uwArraySize [IN] Memory size of exception.
+ * @param uwArraySize [IN] Memory size of exception.
*
* @retval: None
* @par Dependency:
@@ -551,155 +550,155 @@ VOID HalHwiInit();
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器入栈时发生错误
+ * @ingroup los_exc
+ * Cortex-M exception types: An error occurred while the bus status register was being pushed.
*/
#define OS_EXC_BF_STKERR 1
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器出栈时发生错误
+ * @ingroup los_exc
+ * Cortex-M exception types: An error occurred while the bus status register was out of the stack.
*/
#define OS_EXC_BF_UNSTKERR 2
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器不精确的数据访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Bus status register imprecise data access violation.
*/
#define OS_EXC_BF_IMPRECISERR 3
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器精确的数据访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Bus status register exact data access violation.
*/
#define OS_EXC_BF_PRECISERR 4
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器取指时的访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Bus status register access violation while pointing.
*/
#define OS_EXC_BF_IBUSERR 5
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:存储器管理状态寄存器入栈时发生错误
+ * @ingroup los_exc
+ * Cortex-M exception types: An error occurred while the memory management status register was being pushed.
*/
#define OS_EXC_MF_MSTKERR 6
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:存储器管理状态寄存器出栈时发生错误
+ * @ingroup los_exc
+ * Cortex-M exception types: An error occurred while the memory management status register was out of the stack.
*/
#define OS_EXC_MF_MUNSTKERR 7
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:存储器管理状态寄存器数据访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Memory management status register data access violation.
*/
#define OS_EXC_MF_DACCVIOL 8
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:存储器管理状态寄存器取指访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Memory management status register access violation.
*/
#define OS_EXC_MF_IACCVIOL 9
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,表示除法运算时除数为零
+ * @ingroup los_exc
+ * Cortex-M exception types: ncorrect usage indicating that the divisor is zero during the division operation.
*/
#define OS_EXC_UF_DIVBYZERO 10
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,未对齐访问导致的错误
+ * @ingroup los_exc
+ * Cortex-M exception types: Usage error, error caused by unaligned access.
*/
#define OS_EXC_UF_UNALIGNED 11
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,试图执行协处理器相关指令
+ * @ingroup los_exc
+ * Cortex-M exception types: Incorrect usage attempting to execute coprocessor related instruction.
*/
#define OS_EXC_UF_NOCP 12
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,在异常返回时试图非法地加载EXC_RETURN到PC
+ * @ingroup los_exc
+ * Cortex-M exception types: Usage error attempting to load EXC_RETURN to PC illegally on exception return.
*/
#define OS_EXC_UF_INVPC 13
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,试图切入ARM状态
+ * @ingroup los_exc
+ * Cortex-M exception types: Incorrect usage, attempting to cut to ARM state.
*/
#define OS_EXC_UF_INVSTATE 14
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,执行的指令其编码是未定义的——解码不能
+ * @ingroup los_exc
+ * Cortex-M exception types: Incorrect usage. Executed instruction whose code is undefined.
*/
#define OS_EXC_UF_UNDEFINSTR 15
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:NMI中断
+ * @ingroup los_exc
+ * Cortex-M exception types: NMI
*/
#define OS_EXC_CAUSE_NMI 16
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:硬fault
+ * @ingroup los_exc
+ * Cortex-M exception types: hard fault
*/
#define OS_EXC_CAUSE_HARDFAULT 17
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:任务处理函数退出
+ * @ingroup los_exc
+ * Cortex-M exception types: The task handler exits.
*/
#define OS_EXC_CAUSE_TASK_EXIT 18
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:致命错误
+ * @ingroup los_exc
+ * Cortex-M exception types: A fatal error.
*/
#define OS_EXC_CAUSE_FATAL_ERR 19
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:调试事件导致的硬fault
+ * @ingroup los_exc
+ * Cortex-M exception types: Hard Fault caused by a debug event.
*/
#define OS_EXC_CAUSE_DEBUGEVT 20
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:取向量时发生的硬fault
+ * @ingroup los_exc
+ * Cortex-M exception types: A hard fault that occurs when a quantity is oriented.
*/
#define OS_EXC_CAUSE_VECTBL 21
/**
- *@ingroup los_exc
- * 异常信息结构体
+ * @ingroup los_exc
+ * Exception information structure
*
- * 描述:M4平台下的异常触发时保存的异常信息
+ * Description: Exception information saved when an exception is triggered on the Cortex-M4 platform.
*
*/
-typedef struct tagExcInfo {
- /**< 异常发生阶段: 0表示异常发生在初始化中,1表示异常发生在任务中,2表示异常发生在中断中 */
+typedef struct TagExcInfo {
+ /**< Exception occurrence phase: 0 means that an exception occurs in initialization, 1 means that an exception occurs in a task, and 2 means that an exception occurs in an interrupt */
UINT16 phase;
- /**< 异常类型,出异常时对照上面列出的1-19号 */
+ /**< Exception type. When exceptions occur, check the numbers 1 - 19 listed above */
UINT16 type;
- /**< 若为精确地址访问错误表示异常发生时的错误访问地址 */
+ /**< If the exact address access error indicates the wrong access address when the exception occurred */
UINT32 faultAddr;
- /**< 在中断中发生异常,表示中断号。在任务中发生异常,表示任务id,如果发生在初始化中,则为0xffffffff */
+ /**< An exception occurs in an interrupt, indicating the interrupt number. An exception occurs in the task, indicating the task ID, or 0xFFFFFFFF if it occurs during initialization */
UINT32 thrdPid;
- /**< 异常嵌套个数,目前仅支持第一次进入异常时执行注册的钩子函数 */
+ /**< Number of nested exceptions. Currently only registered hook functions are supported when an exception is entered for the first time */
UINT16 nestCnt;
- /**< 保留 */
+ /**< reserve */
UINT16 reserved;
- /**< 自动压栈浮点寄存器的异常发生时刻的硬件上下文 */
- EXC_CONTEXT_S * context;
+ /**< Hardware context at the time an exception to the automatic stack floating-point register occurs */
+ EXC_CONTEXT_S *context;
} ExcInfo;
extern UINT32 g_curNestCount;
@@ -716,4 +715,3 @@ extern ExcInfo g_excInfo;
#endif /* __cpluscplus */
#endif /* _LOS_EXC_H */
-
diff --git a/kernel/arch/arm/cortex-m33/gcc/los_context.c b/kernel/arch/arm/cortex-m33/gcc/los_context.c
index a9f795b3..a7a881d0 100644
--- a/kernel/arch/arm/cortex-m33/gcc/los_context.c
+++ b/kernel/arch/arm/cortex-m33/gcc/los_context.c
@@ -28,13 +28,16 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include "los_config.h"
-#include "los_task.h"
+
+#include "los_context.h"
#include "securec.h"
-#include "los_interrupt.h"
#include "los_arch_context.h"
#include "los_arch_interrupt.h"
+#include "los_task.h"
+#include "los_sched.h"
+#include "los_interrupt.h"
#include "los_arch_timer.h"
+#include "los_timer.h"
#ifdef __cplusplus
#if __cplusplus
@@ -64,7 +67,8 @@ LITE_OS_SEC_TEXT_INIT VOID HalArchInit()
LITE_OS_SEC_TEXT_MINOR VOID HalSysExit(VOID)
{
LOS_IntLock();
- for(;;);
+ while (1) {
+ }
}
/* ****************************************************************************
@@ -149,18 +153,14 @@ LITE_OS_SEC_TEXT_INIT VOID *HalTskStackInit(UINT32 taskID, UINT32 stackSize, VOI
return (VOID *)context;
}
-void HalBackTrace()
-{
-
-}
-
LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
{
- UINT32 ret;
- ret = HalTickStart(handler);
+ (VOID)LOS_IntLock();
+ UINT32 ret = HalTickStart(handler);
if (ret != LOS_OK) {
return ret;
}
+ OsSchedStart();
HalStartToRun();
return LOS_OK; /* never return */
}
@@ -170,5 +170,3 @@ LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
}
#endif /* __cplusplus */
#endif /* __cplusplus */
-
-
diff --git a/kernel/arch/arm/cortex-m33/gcc/los_dispatch.S b/kernel/arch/arm/cortex-m33/gcc/los_dispatch.S
index 309fdde4..29291e80 100644
--- a/kernel/arch/arm/cortex-m33/gcc/los_dispatch.S
+++ b/kernel/arch/arm/cortex-m33/gcc/los_dispatch.S
@@ -56,26 +56,11 @@ HalStartToRun:
ldr r5, =OS_NVIC_PENDSV_PRI
str r5, [r4]
- ldr r0, =g_taskScheduled
- mov r1, #1
- str r1, [r0]
-
mov r0, #2
msr CONTROL, r0
-
- ldr r0, =g_losTask
- ldr r2, [r0, #4]
- ldr r0, =g_losTask
- str r2, [r0]
-
- ldr r3, =g_losTask
- ldr r0, [r3]
- ldrh r7, [r0 , #4]
- mov r8, #OS_TASK_STATUS_RUNNING
- orr r7, r7, r8
- strh r7, [r0 , #4]
-
+ ldr r1, =g_losTask
+ ldr r0, [r1, #4]
ldr r12, [r0]
#if ((defined(__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined(__FPU_USED) && (__FPU_USED == 1U)))
@@ -160,7 +145,17 @@ HalPendSV:
cpsid I
HalTaskSwitch:
+ push {r12, lr}
+ blx OsSchedTaskSwitch
+ pop {r12, lr}
+ cmp r0, #0
+ mov r0, lr
+ bne TaskContextSwitch
+ msr PRIMASK, r12
+ bx lr
+TaskContextSwitch:
+ mov lr, r0
mrs r0, psp
stmfd r0!, {r4-r12}
@@ -173,23 +168,9 @@ HalTaskSwitch:
ldr r6, [r5]
str r0, [r6]
-
- ldrh r7, [r6 , #4]
- mov r8,#OS_TASK_STATUS_RUNNING
- bic r7, r7, r8
- strh r7, [r6 , #4]
-
-
- ldr r0, =g_losTask
- ldr r0, [r0, #4]
+ ldr r0, [r5, #4]
str r0, [r5]
-
- ldrh r7, [r0 , #4]
- mov r8, #OS_TASK_STATUS_RUNNING
- orr r7, r7, r8
- strh r7, [r0 , #4]
-
ldr r1, [r0]
#if ((defined(__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
diff --git a/kernel/arch/arm/cortex-m33/gcc/los_interrupt.c b/kernel/arch/arm/cortex-m33/gcc/los_interrupt.c
old mode 100755
new mode 100644
index 42d1d414..9817ca8b
--- a/kernel/arch/arm/cortex-m33/gcc/los_interrupt.c
+++ b/kernel/arch/arm/cortex-m33/gcc/los_interrupt.c
@@ -35,6 +35,7 @@
#include "los_arch_interrupt.h"
#include "los_debug.h"
#include "los_task.h"
+#include "los_sched.h"
#include "los_memory.h"
#include "los_membox.h"
@@ -159,11 +160,13 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID)
#endif
intSave = LOS_IntLock();
-
g_intCount++;
-
LOS_IntRestore(intSave);
+#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
+ OsSchedUpdateSleepTime();
+#endif
+
hwiIndex = HalIntNumGet();
HalPreInterruptHandler(hwiIndex);
diff --git a/kernel/arch/arm/cortex-m33/gcc/los_timer.c b/kernel/arch/arm/cortex-m33/gcc/los_timer.c
index 5e7cffa1..6fae2dd1 100644
--- a/kernel/arch/arm/cortex-m33/gcc/los_timer.c
+++ b/kernel/arch/arm/cortex-m33/gcc/los_timer.c
@@ -28,19 +28,21 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+
+#include "los_timer.h"
#include "los_config.h"
#include "los_tick.h"
#include "los_arch_interrupt.h"
-#include "los_timer.h"
#include "los_context.h"
+#include "los_sched.h"
+#include "los_debug.h"
+
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif /* __cpluscplus */
#endif /* __cpluscplus */
-
-
/* ****************************************************************************
Function : HalTickStart
Description : Configure Tick Interrupt Start
@@ -68,7 +70,6 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
g_sysClock = OS_SYS_CLOCK;
g_cyclesPerTick = OS_SYS_CLOCK / LOSCFG_BASE_CORE_TICK_PER_SECOND;
- g_ullTickCount = 0;
ret = SysTick_Config(g_cyclesPerTick);
if (ret == 1) {
@@ -78,144 +79,64 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
return LOS_OK;
}
-/* ****************************************************************************
-Function : HalSysTickCurrCycleGet
-Description : Get System cycle count
-Input : none
-output : none
-return : hwCycle --- the system cycle count
-**************************************************************************** */
-LITE_OS_SEC_TEXT_MINOR UINT32 HalSysTickCurrCycleGet(VOID)
+WEAK VOID HalSysTickReload(UINT64 nextResponseTime)
{
- UINT32 hwCycle;
- UINTPTR intSave;
-
- intSave = LOS_IntLock();
- hwCycle = SysTick->VAL;
-
- /* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
- if ((SCB->ICSR & TICK_CHECK) != 0) {
- hwCycle = SysTick->VAL;
- hwCycle += g_cyclesPerTick;
- }
-
- LOS_IntRestore(intSave);
-
- return hwCycle;
+ SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
+ SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */
+ SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
+ NVIC_ClearPendingIRQ(SysTick_IRQn);
+ SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
}
-/* ****************************************************************************
-Function : HalGetCpuCycle
-Description : Get System cycle count
-Input : none
-output : cntHi --- CpuTick High 4 byte
- cntLo --- CpuTick Low 4 byte
-return : none
-**************************************************************************** */
-LITE_OS_SEC_TEXT_MINOR VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
+WEAK UINT64 HalGetTickCycle(UINT32 *period)
{
- UINT64 swTick;
- UINT64 cycle;
UINT32 hwCycle;
- UINTPTR intSave;
-
- intSave = LOS_IntLock();
-
- swTick = g_ullTickCount;
- hwCycle = SysTick->VAL;
-
- /* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
- if ((SCB->ICSR & TICK_CHECK) != 0) {
- hwCycle = SysTick->VAL;
- swTick++;
- }
-
- cycle = (((swTick) * g_cyclesPerTick) + (g_cyclesPerTick - hwCycle));
-
- *cntHi = cycle >> SHIFT_32_BIT;
- *cntLo = cycle & CYCLE_CHECK;
-
+ UINTPTR intSave = LOS_IntLock();
+ *period = SysTick->LOAD;
+ hwCycle = *period - SysTick->VAL;
LOS_IntRestore(intSave);
-
- return;
+ return (UINT64)hwCycle;
}
-/* ****************************************************************************
-Function : HalGetSystickCycle
-Description : Get Sys tick cycle count
-Input : none
-output : cntHi --- SysTick count High 4 byte
- cntLo --- SysTick count Low 4 byte
-return : none
-**************************************************************************** */
-LITE_OS_SEC_TEXT_MINOR VOID HalGetSystickCycle(UINT32 *cntHi, UINT32 *cntLo)
+WEAK VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
{
- UINT64 swTick;
UINT64 cycle;
- UINT32 hwCycle;
- UINTPTR intSave;
- UINT32 systickLoad;
- UINT32 systickCur;
-
- intSave = LOS_IntLock();
-
- swTick = g_ullTickCount;
-
- systickLoad = SysTick->LOAD;
- systickCur = SysTick->VAL;
- if (systickLoad < systickCur) {
- LOS_IntRestore(intSave);
+ if ((cntHi == NULL) || (cntLo == NULL)) {
return;
}
- hwCycle = systickLoad - systickCur;
- /* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
- if ((SCB->ICSR & TICK_CHECK) != 0) {
- hwCycle = systickLoad - systickCur;
- swTick++;
- }
-
- cycle = hwCycle + swTick * systickLoad;
+ cycle = OsGetCurrSchedTimeCycle();
*cntHi = cycle >> SHIFT_32_BIT;
*cntLo = cycle & CYCLE_CHECK;
-
- LOS_IntRestore(intSave);
-
return;
}
-static BOOL g_sysSleepFlag = FALSE;
-
-VOID HalTickLock(VOID)
+WEAK VOID HalTickLock(VOID)
{
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
+ SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
-VOID HalTickUnlock(VOID)
+WEAK VOID HalTickUnlock(VOID)
{
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
-}
-
-BOOL HalGetSysSleepFlag(VOID)
-{
- return g_sysSleepFlag;
-}
-
-VOID HalClearSysSleepFlag(VOID)
-{
- g_sysSleepFlag = FALSE;
+ SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
}
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
{
- __DSB();
- __WFI();
- __ISB();
+#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
+ if (sleep == OS_SYS_DEEP_SLEEP) {
+ OsSchedToSleep();
+ }
+#endif
+
+ __DSB();
+ __WFI();
+ __ISB();
}
WEAK VOID HalDelay(UINT32 ticks)
{
-
+ return;
}
#ifdef __cplusplus
diff --git a/kernel/arch/arm/cortex-m4/gcc/los_arch_context.h b/kernel/arch/arm/cortex-m4/gcc/los_arch_context.h
index 9dd2a874..afd1810a 100644
--- a/kernel/arch/arm/cortex-m4/gcc/los_arch_context.h
+++ b/kernel/arch/arm/cortex-m4/gcc/los_arch_context.h
@@ -128,3 +128,4 @@ extern VOID HalStartToRun(VOID);
#endif /* __cpluscplus */
#endif /* _LOS_ARCH_CONTEXT_H */
+
diff --git a/kernel/arch/arm/cortex-m4/gcc/los_arch_interrupt.h b/kernel/arch/arm/cortex-m4/gcc/los_arch_interrupt.h
index 7582b28f..445a7fe7 100644
--- a/kernel/arch/arm/cortex-m4/gcc/los_arch_interrupt.h
+++ b/kernel/arch/arm/cortex-m4/gcc/los_arch_interrupt.h
@@ -551,129 +551,129 @@ VOID HalHwiInit();
/**
* @ingroup los_exc
- * Cortex-M4 exception types: An error occurred while the bus status register was being pushed.
+ * Cortex-M exception types: An error occurred while the bus status register was being pushed.
*/
#define OS_EXC_BF_STKERR 1
/**
* @ingroup los_exc
- * Cortex-M4 exception types: An error occurred while the bus status register was out of the stack.
+ * Cortex-M exception types: An error occurred while the bus status register was out of the stack.
*/
#define OS_EXC_BF_UNSTKERR 2
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Bus status register imprecise data access violation.
+ * Cortex-M exception types: Bus status register imprecise data access violation.
*/
#define OS_EXC_BF_IMPRECISERR 3
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Bus status register exact data access violation.
+ * Cortex-M exception types: Bus status register exact data access violation.
*/
#define OS_EXC_BF_PRECISERR 4
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Bus status register access violation while pointing.
+ * Cortex-M exception types: Bus status register access violation while pointing.
*/
#define OS_EXC_BF_IBUSERR 5
/**
* @ingroup los_exc
- * Cortex-M4 exception types: An error occurred while the memory management status register was being pushed.
+ * Cortex-M exception types: An error occurred while the memory management status register was being pushed.
*/
#define OS_EXC_MF_MSTKERR 6
/**
* @ingroup los_exc
- * Cortex-M4 exception types: An error occurred while the memory management status register was out of the stack.
+ * Cortex-M exception types: An error occurred while the memory management status register was out of the stack.
*/
#define OS_EXC_MF_MUNSTKERR 7
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Memory management status register data access violation.
+ * Cortex-M exception types: Memory management status register data access violation.
*/
#define OS_EXC_MF_DACCVIOL 8
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Memory management status register access violation.
+ * Cortex-M exception types: Memory management status register access violation.
*/
#define OS_EXC_MF_IACCVIOL 9
/**
* @ingroup los_exc
- * Cortex-M4 exception types: ncorrect usage indicating that the divisor is zero during the division operation.
+ * Cortex-M exception types: ncorrect usage indicating that the divisor is zero during the division operation.
*/
#define OS_EXC_UF_DIVBYZERO 10
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Usage error, error caused by unaligned access.
+ * Cortex-M exception types: Usage error, error caused by unaligned access.
*/
#define OS_EXC_UF_UNALIGNED 11
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Incorrect usage attempting to execute coprocessor related instruction.
+ * Cortex-M exception types: Incorrect usage attempting to execute coprocessor related instruction.
*/
#define OS_EXC_UF_NOCP 12
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Usage error attempting to load EXC_RETURN to PC illegally on exception return.
+ * Cortex-M exception types: Usage error attempting to load EXC_RETURN to PC illegally on exception return.
*/
#define OS_EXC_UF_INVPC 13
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Incorrect usage, attempting to cut to ARM state.
+ * Cortex-M exception types: Incorrect usage, attempting to cut to ARM state.
*/
#define OS_EXC_UF_INVSTATE 14
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Incorrect usage. Executed instruction whose code is undefined.
+ * Cortex-M exception types: Incorrect usage. Executed instruction whose code is undefined.
*/
#define OS_EXC_UF_UNDEFINSTR 15
/**
* @ingroup los_exc
- * Cortex-M4 exception types: NMI
+ * Cortex-M exception types: NMI
*/
#define OS_EXC_CAUSE_NMI 16
/**
* @ingroup los_exc
- * Cortex-M4 exception types: hard fault
+ * Cortex-M exception types: hard fault
*/
#define OS_EXC_CAUSE_HARDFAULT 17
/**
* @ingroup los_exc
- * Cortex-M4 exception types: The task handler exits.
+ * Cortex-M exception types: The task handler exits.
*/
#define OS_EXC_CAUSE_TASK_EXIT 18
/**
* @ingroup los_exc
- * Cortex-M4 exception types: A fatal error.
+ * Cortex-M exception types: A fatal error.
*/
#define OS_EXC_CAUSE_FATAL_ERR 19
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Hard Fault caused by a debug event.
+ * Cortex-M exception types: Hard Fault caused by a debug event.
*/
#define OS_EXC_CAUSE_DEBUGEVT 20
/**
* @ingroup los_exc
- * Cortex-M4 exception types: A hard fault that occurs when a quantity is oriented.
+ * Cortex-M exception types: A hard fault that occurs when a quantity is oriented.
*/
#define OS_EXC_CAUSE_VECTBL 21
diff --git a/kernel/arch/arm/cortex-m4/gcc/los_context.c b/kernel/arch/arm/cortex-m4/gcc/los_context.c
index 52dd0013..a7a881d0 100644
--- a/kernel/arch/arm/cortex-m4/gcc/los_context.c
+++ b/kernel/arch/arm/cortex-m4/gcc/los_context.c
@@ -32,10 +32,12 @@
#include "los_context.h"
#include "securec.h"
#include "los_arch_context.h"
-#include "los_task.h"
-#include "los_interrupt.h"
#include "los_arch_interrupt.h"
+#include "los_task.h"
+#include "los_sched.h"
+#include "los_interrupt.h"
#include "los_arch_timer.h"
+#include "los_timer.h"
#ifdef __cplusplus
#if __cplusplus
@@ -153,11 +155,12 @@ LITE_OS_SEC_TEXT_INIT VOID *HalTskStackInit(UINT32 taskID, UINT32 stackSize, VOI
LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
{
- UINT32 ret;
- ret = HalTickStart(handler);
+ (VOID)LOS_IntLock();
+ UINT32 ret = HalTickStart(handler);
if (ret != LOS_OK) {
return ret;
}
+ OsSchedStart();
HalStartToRun();
return LOS_OK; /* never return */
}
diff --git a/kernel/arch/arm/cortex-m4/gcc/los_dispatch.S b/kernel/arch/arm/cortex-m4/gcc/los_dispatch.S
index 5116cd9c..409b3040 100644
--- a/kernel/arch/arm/cortex-m4/gcc/los_dispatch.S
+++ b/kernel/arch/arm/cortex-m4/gcc/los_dispatch.S
@@ -54,26 +54,11 @@ HalStartToRun:
ldr r5, =OS_NVIC_PENDSV_PRI
str r5, [r4]
- ldr r0, =g_taskScheduled
- mov r1, #1
- str r1, [r0]
-
mov r0, #2
msr CONTROL, r0
-
- ldr r0, =g_losTask
- ldr r2, [r0, #4]
- ldr r0, =g_losTask
- str r2, [r0]
-
- ldr r3, =g_losTask
- ldr r0, [r3]
- ldrh r7, [r0 , #4]
- mov r8, #OS_TASK_STATUS_RUNNING
- orr r7, r7, r8
- strh r7, [r0 , #4]
-
+ ldr r1, =g_losTask
+ ldr r0, [r1, #4]
ldr r12, [r0]
ldr.w r1, =OS_FPU_CPACR
@@ -100,6 +85,7 @@ __DisabledFPU:
mov lr, r5
cpsie I
bx r6
+
.fnend
@@ -162,6 +148,17 @@ HalPendSV:
cpsid I
HalTaskSwitch:
+ push {r12, lr}
+ blx OsSchedTaskSwitch
+ pop {r12, lr}
+ cmp r0, #0
+ mov r0, lr
+ bne TaskContextSwitch
+ msr PRIMASK, r12
+ bx lr
+
+TaskContextSwitch:
+ mov lr, r0
mrs r0, psp
stmfd r0!, {r4-r12}
@@ -177,23 +174,9 @@ __DisabledFPU1:
ldr r6, [r5]
str r0, [r6]
-
- ldrh r7, [r6 , #4]
- mov r8,#OS_TASK_STATUS_RUNNING
- bic r7, r7, r8
- strh r7, [r6 , #4]
-
-
- ldr r0, =g_losTask
- ldr r0, [r0, #4]
+ ldr r0, [r5, #4]
str r0, [r5]
-
- ldrh r7, [r0 , #4]
- mov r8, #OS_TASK_STATUS_RUNNING
- orr r7, r7, r8
- strh r7, [r0 , #4]
-
ldr r1, [r0]
and r3, r3, #OS_FPU_CPACR_ENABLE
cmp r3, #OS_FPU_CPACR_ENABLE
@@ -205,5 +188,6 @@ __DisabledFPU2:
msr psp, r1
msr PRIMASK, r12
+
bx lr
.fnend
diff --git a/kernel/arch/arm/cortex-m4/gcc/los_interrupt.c b/kernel/arch/arm/cortex-m4/gcc/los_interrupt.c
index d4d48132..159eba03 100644
--- a/kernel/arch/arm/cortex-m4/gcc/los_interrupt.c
+++ b/kernel/arch/arm/cortex-m4/gcc/los_interrupt.c
@@ -35,6 +35,7 @@
#include "los_arch_interrupt.h"
#include "los_debug.h"
#include "los_task.h"
+#include "los_sched.h"
#include "los_memory.h"
#include "los_membox.h"
@@ -169,11 +170,13 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID)
#endif
intSave = LOS_IntLock();
-
g_intCount++;
-
LOS_IntRestore(intSave);
+#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
+ OsSchedUpdateSleepTime();
+#endif
+
hwiIndex = HalIntNumGet();
HalPreInterruptHandler(hwiIndex);
diff --git a/kernel/arch/arm/cortex-m4/gcc/los_timer.c b/kernel/arch/arm/cortex-m4/gcc/los_timer.c
index 1a75deb0..e9a75e1a 100644
--- a/kernel/arch/arm/cortex-m4/gcc/los_timer.c
+++ b/kernel/arch/arm/cortex-m4/gcc/los_timer.c
@@ -34,6 +34,8 @@
#include "los_tick.h"
#include "los_arch_interrupt.h"
#include "los_context.h"
+#include "los_sched.h"
+#include "los_debug.h"
#ifdef __cplusplus
#if __cplusplus
@@ -68,7 +70,6 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
g_sysClock = OS_SYS_CLOCK;
g_cyclesPerTick = OS_SYS_CLOCK / LOSCFG_BASE_CORE_TICK_PER_SECOND;
- g_ullTickCount = 0;
ret = SysTick_Config(g_cyclesPerTick);
if (ret == 1) {
@@ -78,145 +79,56 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
return LOS_OK;
}
-VOID HalSysTickReload(UINT32 cyclesPerTick)
+WEAK VOID HalSysTickReload(UINT64 nextResponseTime)
{
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
- NVIC_ClearPendingIRQ(SysTick_IRQn);
- SysTick->LOAD = (UINT32)(cyclesPerTick - 1UL); /* set reload register */
+ SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
+ NVIC_ClearPendingIRQ(SysTick_IRQn);
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
}
-/* ****************************************************************************
-Function : HalSysTickCurrCycleGet
-Description : Get System cycle count
-Input : none
-output : none
-return : hwCycle --- the system cycle count
-**************************************************************************** */
-LITE_OS_SEC_TEXT_MINOR UINT32 HalSysTickCurrCycleGet(VOID)
+WEAK UINT64 HalGetTickCycle(UINT32 *period)
{
UINT32 hwCycle;
- UINTPTR intSave;
-
- intSave = LOS_IntLock();
- hwCycle = SysTick->VAL;
-
- /* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
- if ((SCB->ICSR & TICK_CHECK) != 0) {
- hwCycle = SysTick->VAL;
- hwCycle += g_cyclesPerTick;
- }
-
+ UINTPTR intSave = LOS_IntLock();
+ *period = SysTick->LOAD;
+ hwCycle = *period - SysTick->VAL;
LOS_IntRestore(intSave);
-
- return hwCycle;
+ return (UINT64)hwCycle;
}
-/* ****************************************************************************
-Function : HalGetCpuCycle
-Description : Get System cycle count
-Input : none
-output : cntHi --- CpuTick High 4 byte
- cntLo --- CpuTick Low 4 byte
-return : none
-**************************************************************************** */
-LITE_OS_SEC_TEXT_MINOR VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
+WEAK VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
{
- UINT64 swTick;
UINT64 cycle;
- UINT32 hwCycle;
- UINTPTR intSave;
-
- intSave = LOS_IntLock();
-
- swTick = g_ullTickCount;
- hwCycle = SysTick->VAL;
-
- /* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
- if ((SCB->ICSR & TICK_CHECK) != 0) {
- hwCycle = SysTick->VAL;
- swTick++;
- }
-
- cycle = (((swTick) * g_cyclesPerTick) + (g_cyclesPerTick - hwCycle));
-
- *cntHi = cycle >> SHIFT_32_BIT;
- *cntLo = cycle & CYCLE_CHECK;
-
- LOS_IntRestore(intSave);
-
- return;
-}
-
-/* ****************************************************************************
-Function : HalGetSystickCycle
-Description : Get Sys tick cycle count
-Input : none
-output : cntHi --- SysTick count High 4 byte
- cntLo --- SysTick count Low 4 byte
-return : none
-**************************************************************************** */
-LITE_OS_SEC_TEXT_MINOR VOID HalGetSystickCycle(UINT32 *cntHi, UINT32 *cntLo)
-{
- UINT64 swTick;
- UINT64 cycle;
- UINT32 hwCycle;
- UINTPTR intSave;
- UINT32 systickLoad;
- UINT32 systickCur;
-
- intSave = LOS_IntLock();
-
- swTick = g_ullTickCount;
-
- systickLoad = SysTick->LOAD;
- systickCur = SysTick->VAL;
- if (systickLoad < systickCur) {
- LOS_IntRestore(intSave);
+ if ((cntHi == NULL) || (cntLo == NULL)) {
return;
}
- hwCycle = systickLoad - systickCur;
- /* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
- if ((SCB->ICSR & TICK_CHECK) != 0) {
- hwCycle = systickLoad - systickCur;
- swTick++;
- }
-
- cycle = hwCycle + swTick * systickLoad;
+ cycle = OsGetCurrSchedTimeCycle();
*cntHi = cycle >> SHIFT_32_BIT;
*cntLo = cycle & CYCLE_CHECK;
-
- LOS_IntRestore(intSave);
-
return;
}
-static BOOL g_sysSleepFlag = FALSE;
-
-VOID HalTickLock(VOID)
+WEAK VOID HalTickLock(VOID)
{
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
-VOID HalTickUnlock(VOID)
+WEAK VOID HalTickUnlock(VOID)
{
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
}
-BOOL HalGetSysSleepFlag(VOID)
-{
- return g_sysSleepFlag;
-}
-
-VOID HalClearSysSleepFlag(VOID)
-{
- g_sysSleepFlag = FALSE;
-}
-
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
{
+#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
+ if (sleep == OS_SYS_DEEP_SLEEP) {
+ OsSchedToSleep();
+ }
+#endif
+
__DSB();
__WFI();
__ISB();
diff --git a/kernel/arch/arm/cortex-m4/iar/los_arch_interrupt.h b/kernel/arch/arm/cortex-m4/iar/los_arch_interrupt.h
old mode 100755
new mode 100644
index 8353a4e0..445a7fe7
--- a/kernel/arch/arm/cortex-m4/iar/los_arch_interrupt.h
+++ b/kernel/arch/arm/cortex-m4/iar/los_arch_interrupt.h
@@ -551,129 +551,129 @@ VOID HalHwiInit();
/**
* @ingroup los_exc
- * Cortex-M4 exception types: An error occurred while the bus status register was being pushed.
+ * Cortex-M exception types: An error occurred while the bus status register was being pushed.
*/
#define OS_EXC_BF_STKERR 1
/**
* @ingroup los_exc
- * Cortex-M4 exception types: An error occurred while the bus status register was out of the stack.
+ * Cortex-M exception types: An error occurred while the bus status register was out of the stack.
*/
#define OS_EXC_BF_UNSTKERR 2
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Bus status register imprecise data access violation.
+ * Cortex-M exception types: Bus status register imprecise data access violation.
*/
#define OS_EXC_BF_IMPRECISERR 3
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Bus status register exact data access violation.
+ * Cortex-M exception types: Bus status register exact data access violation.
*/
#define OS_EXC_BF_PRECISERR 4
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Bus status register access violation while pointing.
+ * Cortex-M exception types: Bus status register access violation while pointing.
*/
#define OS_EXC_BF_IBUSERR 5
/**
* @ingroup los_exc
- * Cortex-M4 exception types: An error occurred while the memory management status register was being pushed.
+ * Cortex-M exception types: An error occurred while the memory management status register was being pushed.
*/
#define OS_EXC_MF_MSTKERR 6
/**
* @ingroup los_exc
- * Cortex-M4 exception types: An error occurred while the memory management status register was out of the stack.
+ * Cortex-M exception types: An error occurred while the memory management status register was out of the stack.
*/
#define OS_EXC_MF_MUNSTKERR 7
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Memory management status register data access violation.
+ * Cortex-M exception types: Memory management status register data access violation.
*/
#define OS_EXC_MF_DACCVIOL 8
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Memory management status register access violation.
+ * Cortex-M exception types: Memory management status register access violation.
*/
#define OS_EXC_MF_IACCVIOL 9
/**
* @ingroup los_exc
- * Cortex-M4 exception types: ncorrect usage indicating that the divisor is zero during the division operation.
+ * Cortex-M exception types: ncorrect usage indicating that the divisor is zero during the division operation.
*/
#define OS_EXC_UF_DIVBYZERO 10
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Usage error, error caused by unaligned access.
+ * Cortex-M exception types: Usage error, error caused by unaligned access.
*/
#define OS_EXC_UF_UNALIGNED 11
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Incorrect usage attempting to execute coprocessor related instruction.
+ * Cortex-M exception types: Incorrect usage attempting to execute coprocessor related instruction.
*/
#define OS_EXC_UF_NOCP 12
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Usage error attempting to load EXC_RETURN to PC illegally on exception return.
+ * Cortex-M exception types: Usage error attempting to load EXC_RETURN to PC illegally on exception return.
*/
#define OS_EXC_UF_INVPC 13
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Incorrect usage, attempting to cut to ARM state.
+ * Cortex-M exception types: Incorrect usage, attempting to cut to ARM state.
*/
#define OS_EXC_UF_INVSTATE 14
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Incorrect usage. Executed instruction whose code is undefined.
+ * Cortex-M exception types: Incorrect usage. Executed instruction whose code is undefined.
*/
#define OS_EXC_UF_UNDEFINSTR 15
/**
* @ingroup los_exc
- * Cortex-M4 exception types: NMI
+ * Cortex-M exception types: NMI
*/
#define OS_EXC_CAUSE_NMI 16
/**
* @ingroup los_exc
- * Cortex-M4 exception types: hard fault
+ * Cortex-M exception types: hard fault
*/
#define OS_EXC_CAUSE_HARDFAULT 17
/**
* @ingroup los_exc
- * Cortex-M4 exception types: The task handler exits.
+ * Cortex-M exception types: The task handler exits.
*/
#define OS_EXC_CAUSE_TASK_EXIT 18
/**
* @ingroup los_exc
- * Cortex-M4 exception types: A fatal error.
+ * Cortex-M exception types: A fatal error.
*/
#define OS_EXC_CAUSE_FATAL_ERR 19
/**
* @ingroup los_exc
- * Cortex-M4 exception types: Hard Fault caused by a debug event.
+ * Cortex-M exception types: Hard Fault caused by a debug event.
*/
#define OS_EXC_CAUSE_DEBUGEVT 20
/**
* @ingroup los_exc
- * Cortex-M4 exception types: A hard fault that occurs when a quantity is oriented.
+ * Cortex-M exception types: A hard fault that occurs when a quantity is oriented.
*/
#define OS_EXC_CAUSE_VECTBL 21
@@ -715,4 +715,3 @@ extern ExcInfo g_excInfo;
#endif /* __cpluscplus */
#endif /* _LOS_EXC_H */
-
diff --git a/kernel/arch/arm/cortex-m4/iar/los_context.c b/kernel/arch/arm/cortex-m4/iar/los_context.c
old mode 100755
new mode 100644
index 52dd0013..a7a881d0
--- a/kernel/arch/arm/cortex-m4/iar/los_context.c
+++ b/kernel/arch/arm/cortex-m4/iar/los_context.c
@@ -32,10 +32,12 @@
#include "los_context.h"
#include "securec.h"
#include "los_arch_context.h"
-#include "los_task.h"
-#include "los_interrupt.h"
#include "los_arch_interrupt.h"
+#include "los_task.h"
+#include "los_sched.h"
+#include "los_interrupt.h"
#include "los_arch_timer.h"
+#include "los_timer.h"
#ifdef __cplusplus
#if __cplusplus
@@ -153,11 +155,12 @@ LITE_OS_SEC_TEXT_INIT VOID *HalTskStackInit(UINT32 taskID, UINT32 stackSize, VOI
LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
{
- UINT32 ret;
- ret = HalTickStart(handler);
+ (VOID)LOS_IntLock();
+ UINT32 ret = HalTickStart(handler);
if (ret != LOS_OK) {
return ret;
}
+ OsSchedStart();
HalStartToRun();
return LOS_OK; /* never return */
}
diff --git a/kernel/arch/arm/cortex-m4/iar/los_dispatch.S b/kernel/arch/arm/cortex-m4/iar/los_dispatch.S
old mode 100755
new mode 100644
index dac97f6e..14198f9f
--- a/kernel/arch/arm/cortex-m4/iar/los_dispatch.S
+++ b/kernel/arch/arm/cortex-m4/iar/los_dispatch.S
@@ -29,17 +29,16 @@
; ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;
- PRESERVE8
+ PRESERVE8
- EXPORT HalIntLock
- EXPORT HalIntUnLock
- EXPORT HalIntRestore
- EXPORT HalStartToRun
- EXPORT HalTaskSchedule
- EXPORT HalPendSV
-
- IMPORT g_losTask
- IMPORT g_taskScheduled
+ EXPORT HalIntLock
+ EXPORT HalIntUnLock
+ EXPORT HalIntRestore
+ EXPORT HalStartToRun
+ EXPORT HalTaskSchedule
+ EXPORT HalPendSV
+ IMPORT OsSchedTaskSwitch
+ IMPORT g_losTask
OS_FPU_CPACR EQU 0xE000ED88
OS_FPU_CPACR_ENABLE EQU 0x00F00000
@@ -58,26 +57,11 @@ HalStartToRun
LDR R5, =OS_NVIC_PENDSV_PRI
STR R5, [R4]
- LDR R0, =g_taskScheduled
- MOV R1, #1
- STR R1, [R0]
-
MOV R0, #2
MSR CONTROL, R0
-
- LDR R0, =g_losTask
- LDR R2, [R0, #4]
- LDR R0, =g_losTask
- STR R2, [R0]
-
- LDR R3, =g_losTask
- LDR R0, [R3]
- LDRH R7, [R0 , #4]
- MOV R8, #OS_TASK_STATUS_RUNNING
- ORR R7, R7, R8
- STRH R7, [R0 , #4]
-
+ LDR R1, =g_losTask
+ LDR R0, [R1, #4]
LDR R12, [R0]
LDR.W R1, =OS_FPU_CPACR
@@ -133,6 +117,17 @@ HalPendSV
CPSID I
HalTaskSwitch
+ PUSH {R12, LR}
+ BLX OsSchedTaskSwitch
+ POP {R12, LR}
+ CMP R0, #0
+ MOV R0, LR
+ BNE TaskContextSwitch
+ MSR PRIMASK, R12
+ BX LR
+
+TaskContextSwitch
+ MOV LR, R0
MRS R0, PSP
STMFD R0!, {R4-R12}
@@ -148,24 +143,10 @@ __DisabledFPU1
LDR R6, [R5]
STR R0, [R6]
-
- LDRH R7, [R6 , #4]
- MOV R8,#OS_TASK_STATUS_RUNNING
- BIC R7, R7, R8
- STRH R7, [R6 , #4]
-
-
- LDR R0, =g_losTask
- LDR R0, [R0, #4]
+ LDR R0, [R5, #4]
STR R0, [R5]
-
- LDRH R7, [R0 , #4]
- MOV R8, #OS_TASK_STATUS_RUNNING
- ORR R7, R7, R8
- STRH R7, [R0 , #4]
-
- LDR R1, [R0]
+ LDR R1, [R0]
AND R3, R3, #OS_FPU_CPACR_ENABLE
CMP R3, #OS_FPU_CPACR_ENABLE
BNE __DisabledFPU2
diff --git a/kernel/arch/arm/cortex-m4/iar/los_interrupt.c b/kernel/arch/arm/cortex-m4/iar/los_interrupt.c
old mode 100755
new mode 100644
index 35b41b71..35f5f1bc
--- a/kernel/arch/arm/cortex-m4/iar/los_interrupt.c
+++ b/kernel/arch/arm/cortex-m4/iar/los_interrupt.c
@@ -37,6 +37,7 @@
#include "los_debug.h"
#include "los_hook.h"
#include "los_task.h"
+#include "los_sched.h"
#include "los_memory.h"
#include "los_membox.h"
@@ -176,6 +177,10 @@ 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);
diff --git a/kernel/arch/arm/cortex-m4/iar/los_mpu.c b/kernel/arch/arm/cortex-m4/iar/los_mpu.c
old mode 100755
new mode 100644
diff --git a/kernel/arch/arm/cortex-m4/iar/los_timer.c b/kernel/arch/arm/cortex-m4/iar/los_timer.c
old mode 100755
new mode 100644
index 1a75deb0..e9a75e1a
--- a/kernel/arch/arm/cortex-m4/iar/los_timer.c
+++ b/kernel/arch/arm/cortex-m4/iar/los_timer.c
@@ -34,6 +34,8 @@
#include "los_tick.h"
#include "los_arch_interrupt.h"
#include "los_context.h"
+#include "los_sched.h"
+#include "los_debug.h"
#ifdef __cplusplus
#if __cplusplus
@@ -68,7 +70,6 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
g_sysClock = OS_SYS_CLOCK;
g_cyclesPerTick = OS_SYS_CLOCK / LOSCFG_BASE_CORE_TICK_PER_SECOND;
- g_ullTickCount = 0;
ret = SysTick_Config(g_cyclesPerTick);
if (ret == 1) {
@@ -78,145 +79,56 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
return LOS_OK;
}
-VOID HalSysTickReload(UINT32 cyclesPerTick)
+WEAK VOID HalSysTickReload(UINT64 nextResponseTime)
{
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
- NVIC_ClearPendingIRQ(SysTick_IRQn);
- SysTick->LOAD = (UINT32)(cyclesPerTick - 1UL); /* set reload register */
+ SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
+ NVIC_ClearPendingIRQ(SysTick_IRQn);
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
}
-/* ****************************************************************************
-Function : HalSysTickCurrCycleGet
-Description : Get System cycle count
-Input : none
-output : none
-return : hwCycle --- the system cycle count
-**************************************************************************** */
-LITE_OS_SEC_TEXT_MINOR UINT32 HalSysTickCurrCycleGet(VOID)
+WEAK UINT64 HalGetTickCycle(UINT32 *period)
{
UINT32 hwCycle;
- UINTPTR intSave;
-
- intSave = LOS_IntLock();
- hwCycle = SysTick->VAL;
-
- /* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
- if ((SCB->ICSR & TICK_CHECK) != 0) {
- hwCycle = SysTick->VAL;
- hwCycle += g_cyclesPerTick;
- }
-
+ UINTPTR intSave = LOS_IntLock();
+ *period = SysTick->LOAD;
+ hwCycle = *period - SysTick->VAL;
LOS_IntRestore(intSave);
-
- return hwCycle;
+ return (UINT64)hwCycle;
}
-/* ****************************************************************************
-Function : HalGetCpuCycle
-Description : Get System cycle count
-Input : none
-output : cntHi --- CpuTick High 4 byte
- cntLo --- CpuTick Low 4 byte
-return : none
-**************************************************************************** */
-LITE_OS_SEC_TEXT_MINOR VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
+WEAK VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
{
- UINT64 swTick;
UINT64 cycle;
- UINT32 hwCycle;
- UINTPTR intSave;
-
- intSave = LOS_IntLock();
-
- swTick = g_ullTickCount;
- hwCycle = SysTick->VAL;
-
- /* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
- if ((SCB->ICSR & TICK_CHECK) != 0) {
- hwCycle = SysTick->VAL;
- swTick++;
- }
-
- cycle = (((swTick) * g_cyclesPerTick) + (g_cyclesPerTick - hwCycle));
-
- *cntHi = cycle >> SHIFT_32_BIT;
- *cntLo = cycle & CYCLE_CHECK;
-
- LOS_IntRestore(intSave);
-
- return;
-}
-
-/* ****************************************************************************
-Function : HalGetSystickCycle
-Description : Get Sys tick cycle count
-Input : none
-output : cntHi --- SysTick count High 4 byte
- cntLo --- SysTick count Low 4 byte
-return : none
-**************************************************************************** */
-LITE_OS_SEC_TEXT_MINOR VOID HalGetSystickCycle(UINT32 *cntHi, UINT32 *cntLo)
-{
- UINT64 swTick;
- UINT64 cycle;
- UINT32 hwCycle;
- UINTPTR intSave;
- UINT32 systickLoad;
- UINT32 systickCur;
-
- intSave = LOS_IntLock();
-
- swTick = g_ullTickCount;
-
- systickLoad = SysTick->LOAD;
- systickCur = SysTick->VAL;
- if (systickLoad < systickCur) {
- LOS_IntRestore(intSave);
+ if ((cntHi == NULL) || (cntLo == NULL)) {
return;
}
- hwCycle = systickLoad - systickCur;
- /* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
- if ((SCB->ICSR & TICK_CHECK) != 0) {
- hwCycle = systickLoad - systickCur;
- swTick++;
- }
-
- cycle = hwCycle + swTick * systickLoad;
+ cycle = OsGetCurrSchedTimeCycle();
*cntHi = cycle >> SHIFT_32_BIT;
*cntLo = cycle & CYCLE_CHECK;
-
- LOS_IntRestore(intSave);
-
return;
}
-static BOOL g_sysSleepFlag = FALSE;
-
-VOID HalTickLock(VOID)
+WEAK VOID HalTickLock(VOID)
{
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
-VOID HalTickUnlock(VOID)
+WEAK VOID HalTickUnlock(VOID)
{
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
}
-BOOL HalGetSysSleepFlag(VOID)
-{
- return g_sysSleepFlag;
-}
-
-VOID HalClearSysSleepFlag(VOID)
-{
- g_sysSleepFlag = FALSE;
-}
-
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
{
+#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
+ if (sleep == OS_SYS_DEEP_SLEEP) {
+ OsSchedToSleep();
+ }
+#endif
+
__DSB();
__WFI();
__ISB();
diff --git a/kernel/arch/arm/cortex-m7/gcc/los_arch_context.h b/kernel/arch/arm/cortex-m7/gcc/los_arch_context.h
index 972f2fde..afd1810a 100644
--- a/kernel/arch/arm/cortex-m7/gcc/los_arch_context.h
+++ b/kernel/arch/arm/cortex-m7/gcc/los_arch_context.h
@@ -41,7 +41,7 @@ extern "C" {
#endif /* __cpluscplus */
#endif /* __cpluscplus */
-typedef struct tagTskContext {
+typedef struct TagTskContext {
#if ((defined(__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined(__FPU_USED) && (__FPU_USED == 1U)))
UINT32 S16;
diff --git a/kernel/arch/arm/cortex-m7/gcc/los_arch_interrupt.h b/kernel/arch/arm/cortex-m7/gcc/los_arch_interrupt.h
old mode 100755
new mode 100644
index b3ab442f..165f9346
--- a/kernel/arch/arm/cortex-m7/gcc/los_arch_interrupt.h
+++ b/kernel/arch/arm/cortex-m7/gcc/los_arch_interrupt.h
@@ -449,15 +449,14 @@ extern VOID HalPendSV(VOID);
#define OS_EXC_EVENT 0x00000001
/**
- *@ingroup los_exc
+ * @ingroup los_exc
* the struct of register files
*
* description: the register files that saved when exception triggered
*
* notes:the following register with prefix 'uw' correspond to the registers in the cpu data sheet.
*/
-typedef struct tagExcContext {
- //handler save
+typedef struct TagExcContext {
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
UINT32 S16;
@@ -486,7 +485,7 @@ typedef struct tagExcContext {
UINT32 uwR10;
UINT32 uwR11;
UINT32 uwPriMask;
- //auto save
+ /* auto save */
UINT32 uwSP;
UINT32 uwR0;
UINT32 uwR1;
@@ -532,7 +531,7 @@ VOID HalExcHandleEntry(UINT32 excType, UINT32 faultAddr, UINT32 pid, EXC_CONTEXT
* @attention:
*
*
- *@param uwArraySize [IN] Memory size of exception.
+ * @param uwArraySize [IN] Memory size of exception.
*
* @retval: None
* @par Dependency:
@@ -551,155 +550,155 @@ VOID HalHwiInit();
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器入栈时发生错误
+ * @ingroup los_exc
+ * Cortex-M exception types: An error occurred while the bus status register was being pushed.
*/
#define OS_EXC_BF_STKERR 1
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器出栈时发生错误
+ * @ingroup los_exc
+ * Cortex-M exception types: An error occurred while the bus status register was out of the stack.
*/
#define OS_EXC_BF_UNSTKERR 2
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器不精确的数据访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Bus status register imprecise data access violation.
*/
#define OS_EXC_BF_IMPRECISERR 3
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器精确的数据访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Bus status register exact data access violation.
*/
#define OS_EXC_BF_PRECISERR 4
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器取指时的访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Bus status register access violation while pointing.
*/
#define OS_EXC_BF_IBUSERR 5
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:存储器管理状态寄存器入栈时发生错误
+ * @ingroup los_exc
+ * Cortex-M exception types: An error occurred while the memory management status register was being pushed.
*/
#define OS_EXC_MF_MSTKERR 6
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:存储器管理状态寄存器出栈时发生错误
+ * @ingroup los_exc
+ * Cortex-M exception types: An error occurred while the memory management status register was out of the stack.
*/
#define OS_EXC_MF_MUNSTKERR 7
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:存储器管理状态寄存器数据访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Memory management status register data access violation.
*/
#define OS_EXC_MF_DACCVIOL 8
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:存储器管理状态寄存器取指访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Memory management status register access violation.
*/
#define OS_EXC_MF_IACCVIOL 9
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,表示除法运算时除数为零
+ * @ingroup los_exc
+ * Cortex-M exception types: ncorrect usage indicating that the divisor is zero during the division operation.
*/
#define OS_EXC_UF_DIVBYZERO 10
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,未对齐访问导致的错误
+ * @ingroup los_exc
+ * Cortex-M exception types: Usage error, error caused by unaligned access.
*/
#define OS_EXC_UF_UNALIGNED 11
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,试图执行协处理器相关指令
+ * @ingroup los_exc
+ * Cortex-M exception types: Incorrect usage attempting to execute coprocessor related instruction.
*/
#define OS_EXC_UF_NOCP 12
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,在异常返回时试图非法地加载EXC_RETURN到PC
+ * @ingroup los_exc
+ * Cortex-M exception types: Usage error attempting to load EXC_RETURN to PC illegally on exception return.
*/
#define OS_EXC_UF_INVPC 13
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,试图切入ARM状态
+ * @ingroup los_exc
+ * Cortex-M exception types: Incorrect usage, attempting to cut to ARM state.
*/
#define OS_EXC_UF_INVSTATE 14
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,执行的指令其编码是未定义的——解码不能
+ * @ingroup los_exc
+ * Cortex-M exception types: Incorrect usage. Executed instruction whose code is undefined.
*/
#define OS_EXC_UF_UNDEFINSTR 15
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:NMI中断
+ * @ingroup los_exc
+ * Cortex-M exception types: NMI
*/
#define OS_EXC_CAUSE_NMI 16
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:硬fault
+ * @ingroup los_exc
+ * Cortex-M exception types: hard fault
*/
#define OS_EXC_CAUSE_HARDFAULT 17
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:任务处理函数退出
+ * @ingroup los_exc
+ * Cortex-M exception types: The task handler exits.
*/
#define OS_EXC_CAUSE_TASK_EXIT 18
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:致命错误
+ * @ingroup los_exc
+ * Cortex-M exception types: A fatal error.
*/
#define OS_EXC_CAUSE_FATAL_ERR 19
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:调试事件导致的硬fault
+ * @ingroup los_exc
+ * Cortex-M exception types: Hard Fault caused by a debug event.
*/
#define OS_EXC_CAUSE_DEBUGEVT 20
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:取向量时发生的硬fault
+ * @ingroup los_exc
+ * Cortex-M exception types: A hard fault that occurs when a quantity is oriented.
*/
#define OS_EXC_CAUSE_VECTBL 21
/**
- *@ingroup los_exc
- * 异常信息结构体
+ * @ingroup los_exc
+ * Exception information structure
*
- * 描述:M4平台下的异常触发时保存的异常信息
+ * Description: Exception information saved when an exception is triggered on the Cortex-M4 platform.
*
*/
-typedef struct tagExcInfo {
- /**< 异常发生阶段: 0表示异常发生在初始化中,1表示异常发生在任务中,2表示异常发生在中断中 */
+typedef struct TagExcInfo {
+ /**< Exception occurrence phase: 0 means that an exception occurs in initialization, 1 means that an exception occurs in a task, and 2 means that an exception occurs in an interrupt */
UINT16 phase;
- /**< 异常类型,出异常时对照上面列出的1-19号 */
+ /**< Exception type. When exceptions occur, check the numbers 1 - 19 listed above */
UINT16 type;
- /**< 若为精确地址访问错误表示异常发生时的错误访问地址 */
+ /**< If the exact address access error indicates the wrong access address when the exception occurred */
UINT32 faultAddr;
- /**< 在中断中发生异常,表示中断号。在任务中发生异常,表示任务id,如果发生在初始化中,则为0xffffffff */
+ /**< An exception occurs in an interrupt, indicating the interrupt number. An exception occurs in the task, indicating the task ID, or 0xFFFFFFFF if it occurs during initialization */
UINT32 thrdPid;
- /**< 异常嵌套个数,目前仅支持第一次进入异常时执行注册的钩子函数 */
+ /**< Number of nested exceptions. Currently only registered hook functions are supported when an exception is entered for the first time */
UINT16 nestCnt;
- /**< 保留 */
+ /**< reserve */
UINT16 reserved;
- /**< 自动压栈浮点寄存器的异常发生时刻的硬件上下文 */
- EXC_CONTEXT_S * context;
+ /**< Hardware context at the time an exception to the automatic stack floating-point register occurs */
+ EXC_CONTEXT_S *context;
} ExcInfo;
extern UINT32 g_curNestCount;
diff --git a/kernel/arch/arm/cortex-m7/gcc/los_context.c b/kernel/arch/arm/cortex-m7/gcc/los_context.c
index e4da9f80..a7a881d0 100644
--- a/kernel/arch/arm/cortex-m7/gcc/los_context.c
+++ b/kernel/arch/arm/cortex-m7/gcc/los_context.c
@@ -28,13 +28,16 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include "los_config.h"
-#include "los_task.h"
+
+#include "los_context.h"
#include "securec.h"
-#include "los_interrupt.h"
#include "los_arch_context.h"
#include "los_arch_interrupt.h"
+#include "los_task.h"
+#include "los_sched.h"
+#include "los_interrupt.h"
#include "los_arch_timer.h"
+#include "los_timer.h"
#ifdef __cplusplus
#if __cplusplus
@@ -64,7 +67,8 @@ LITE_OS_SEC_TEXT_INIT VOID HalArchInit()
LITE_OS_SEC_TEXT_MINOR VOID HalSysExit(VOID)
{
LOS_IntLock();
- for(;;);
+ while (1) {
+ }
}
/* ****************************************************************************
@@ -151,11 +155,12 @@ LITE_OS_SEC_TEXT_INIT VOID *HalTskStackInit(UINT32 taskID, UINT32 stackSize, VOI
LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
{
- UINT32 ret;
- ret = HalTickStart(handler);
+ (VOID)LOS_IntLock();
+ UINT32 ret = HalTickStart(handler);
if (ret != LOS_OK) {
return ret;
}
+ OsSchedStart();
HalStartToRun();
return LOS_OK; /* never return */
}
@@ -165,5 +170,3 @@ LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
}
#endif /* __cplusplus */
#endif /* __cplusplus */
-
-
diff --git a/kernel/arch/arm/cortex-m7/gcc/los_dispatch.S b/kernel/arch/arm/cortex-m7/gcc/los_dispatch.S
index 309fdde4..8f99bc8c 100644
--- a/kernel/arch/arm/cortex-m7/gcc/los_dispatch.S
+++ b/kernel/arch/arm/cortex-m7/gcc/los_dispatch.S
@@ -56,26 +56,11 @@ HalStartToRun:
ldr r5, =OS_NVIC_PENDSV_PRI
str r5, [r4]
- ldr r0, =g_taskScheduled
- mov r1, #1
- str r1, [r0]
-
mov r0, #2
msr CONTROL, r0
-
- ldr r0, =g_losTask
- ldr r2, [r0, #4]
- ldr r0, =g_losTask
- str r2, [r0]
-
- ldr r3, =g_losTask
- ldr r0, [r3]
- ldrh r7, [r0 , #4]
- mov r8, #OS_TASK_STATUS_RUNNING
- orr r7, r7, r8
- strh r7, [r0 , #4]
-
+ ldr r1, =g_losTask
+ ldr r0, [r1, #4]
ldr r12, [r0]
#if ((defined(__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined(__FPU_USED) && (__FPU_USED == 1U)))
@@ -147,9 +132,6 @@ HalTaskSchedule:
bx lr
.fnend
-
-
-
.type HalPendSV, %function
.global HalPendSV
HalPendSV:
@@ -160,7 +142,17 @@ HalPendSV:
cpsid I
HalTaskSwitch:
+ push {r12, lr}
+ blx OsSchedTaskSwitch
+ pop {r12, lr}
+ cmp r0, #0
+ mov r0, lr
+ bne TaskContextSwitch
+ msr PRIMASK, r12
+ bx lr
+TaskContextSwitch:
+ mov lr, r0
mrs r0, psp
stmfd r0!, {r4-r12}
@@ -173,24 +165,10 @@ HalTaskSwitch:
ldr r6, [r5]
str r0, [r6]
-
- ldrh r7, [r6 , #4]
- mov r8,#OS_TASK_STATUS_RUNNING
- bic r7, r7, r8
- strh r7, [r6 , #4]
-
-
- ldr r0, =g_losTask
- ldr r0, [r0, #4]
+ ldr r0, [r5, #4]
str r0, [r5]
-
- ldrh r7, [r0 , #4]
- mov r8, #OS_TASK_STATUS_RUNNING
- orr r7, r7, r8
- strh r7, [r0 , #4]
-
- ldr r1, [r0]
+ ldr r1, [r0]
#if ((defined(__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined(__FPU_USED) && (__FPU_USED == 1U)))
@@ -201,6 +179,5 @@ HalTaskSwitch:
msr PRIMASK, r12
-
bx lr
.fnend
diff --git a/kernel/arch/arm/cortex-m7/gcc/los_interrupt.c b/kernel/arch/arm/cortex-m7/gcc/los_interrupt.c
old mode 100755
new mode 100644
index 582e7eec..d3454940
--- a/kernel/arch/arm/cortex-m7/gcc/los_interrupt.c
+++ b/kernel/arch/arm/cortex-m7/gcc/los_interrupt.c
@@ -35,6 +35,7 @@
#include "los_arch_interrupt.h"
#include "los_debug.h"
#include "los_task.h"
+#include "los_sched.h"
#include "los_memory.h"
#include "los_membox.h"
@@ -159,11 +160,13 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID)
#endif
intSave = LOS_IntLock();
-
g_intCount++;
-
LOS_IntRestore(intSave);
+#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
+ OsSchedUpdateSleepTime();
+#endif
+
hwiIndex = HalIntNumGet();
HalPreInterruptHandler(hwiIndex);
diff --git a/kernel/arch/arm/cortex-m7/gcc/los_timer.c b/kernel/arch/arm/cortex-m7/gcc/los_timer.c
old mode 100755
new mode 100644
index dfbf29bf..e9a75e1a
--- a/kernel/arch/arm/cortex-m7/gcc/los_timer.c
+++ b/kernel/arch/arm/cortex-m7/gcc/los_timer.c
@@ -28,19 +28,21 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+
+#include "los_timer.h"
#include "los_config.h"
#include "los_tick.h"
#include "los_arch_interrupt.h"
-#include "los_timer.h"
#include "los_context.h"
+#include "los_sched.h"
+#include "los_debug.h"
+
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif /* __cpluscplus */
#endif /* __cpluscplus */
-
-
/* ****************************************************************************
Function : HalTickStart
Description : Configure Tick Interrupt Start
@@ -68,7 +70,6 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
g_sysClock = OS_SYS_CLOCK;
g_cyclesPerTick = OS_SYS_CLOCK / LOSCFG_BASE_CORE_TICK_PER_SECOND;
- g_ullTickCount = 0;
ret = SysTick_Config(g_cyclesPerTick);
if (ret == 1) {
@@ -78,153 +79,64 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
return LOS_OK;
}
-VOID HalSysTickReload(UINT32 cyclesPerTick)
+WEAK VOID HalSysTickReload(UINT64 nextResponseTime)
{
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
- NVIC_ClearPendingIRQ(SysTick_IRQn);
- SysTick->LOAD = (UINT32)(cyclesPerTick - 1UL); /* set reload register */
+ SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
+ NVIC_ClearPendingIRQ(SysTick_IRQn);
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
}
-/* ****************************************************************************
-Function : HalSysTickCurrCycleGet
-Description : Get System cycle count
-Input : none
-output : none
-return : hwCycle --- the system cycle count
-**************************************************************************** */
-LITE_OS_SEC_TEXT_MINOR UINT32 HalSysTickCurrCycleGet(VOID)
+WEAK UINT64 HalGetTickCycle(UINT32 *period)
{
UINT32 hwCycle;
- UINTPTR intSave;
-
- intSave = LOS_IntLock();
- hwCycle = SysTick->VAL;
-
- /* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
- if ((SCB->ICSR & TICK_CHECK) != 0) {
- hwCycle = SysTick->VAL;
- hwCycle += g_cyclesPerTick;
- }
-
+ UINTPTR intSave = LOS_IntLock();
+ *period = SysTick->LOAD;
+ hwCycle = *period - SysTick->VAL;
LOS_IntRestore(intSave);
-
- return hwCycle;
+ return (UINT64)hwCycle;
}
-/* ****************************************************************************
-Function : HalGetCpuCycle
-Description : Get System cycle count
-Input : none
-output : cntHi --- CpuTick High 4 byte
- cntLo --- CpuTick Low 4 byte
-return : none
-**************************************************************************** */
-LITE_OS_SEC_TEXT_MINOR VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
+WEAK VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
{
- UINT64 swTick;
UINT64 cycle;
- UINT32 hwCycle;
- UINTPTR intSave;
-
- intSave = LOS_IntLock();
-
- swTick = g_ullTickCount;
- hwCycle = SysTick->VAL;
-
- /* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
- if ((SCB->ICSR & TICK_CHECK) != 0) {
- hwCycle = SysTick->VAL;
- swTick++;
- }
-
- cycle = (((swTick) * g_cyclesPerTick) + (g_cyclesPerTick - hwCycle));
-
- *cntHi = cycle >> SHIFT_32_BIT;
- *cntLo = cycle & CYCLE_CHECK;
-
- LOS_IntRestore(intSave);
-
- return;
-}
-
-/* ****************************************************************************
-Function : HalGetSystickCycle
-Description : Get Sys tick cycle count
-Input : none
-output : cntHi --- SysTick count High 4 byte
- cntLo --- SysTick count Low 4 byte
-return : none
-**************************************************************************** */
-LITE_OS_SEC_TEXT_MINOR VOID HalGetSystickCycle(UINT32 *cntHi, UINT32 *cntLo)
-{
- UINT64 swTick;
- UINT64 cycle;
- UINT32 hwCycle;
- UINTPTR intSave;
- UINT32 systickLoad;
- UINT32 systickCur;
-
- intSave = LOS_IntLock();
-
- swTick = g_ullTickCount;
-
- systickLoad = SysTick->LOAD;
- systickCur = SysTick->VAL;
- if (systickLoad < systickCur) {
- LOS_IntRestore(intSave);
+ if ((cntHi == NULL) || (cntLo == NULL)) {
return;
}
- hwCycle = systickLoad - systickCur;
- /* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
- if ((SCB->ICSR & TICK_CHECK) != 0) {
- hwCycle = systickLoad - systickCur;
- swTick++;
- }
-
- cycle = hwCycle + swTick * systickLoad;
+ cycle = OsGetCurrSchedTimeCycle();
*cntHi = cycle >> SHIFT_32_BIT;
*cntLo = cycle & CYCLE_CHECK;
-
- LOS_IntRestore(intSave);
-
return;
}
-static BOOL g_sysSleepFlag = FALSE;
-
-VOID HalTickLock(VOID)
+WEAK VOID HalTickLock(VOID)
{
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
+ SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
-VOID HalTickUnlock(VOID)
+WEAK VOID HalTickUnlock(VOID)
{
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
-}
-
-BOOL HalGetSysSleepFlag(VOID)
-{
- return g_sysSleepFlag;
-}
-
-VOID HalClearSysSleepFlag(VOID)
-{
- g_sysSleepFlag = FALSE;
+ SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
}
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
{
- __DSB();
- __WFI();
- __ISB();
+#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
+ if (sleep == OS_SYS_DEEP_SLEEP) {
+ OsSchedToSleep();
+ }
+#endif
+
+ __DSB();
+ __WFI();
+ __ISB();
}
WEAK VOID HalDelay(UINT32 ticks)
{
-
+ return;
}
WEAK UINT64 HalGetExpandTick(VOID)
diff --git a/kernel/arch/arm/cortex-m7/iar/los_arch_context.h b/kernel/arch/arm/cortex-m7/iar/los_arch_context.h
index 972f2fde..afd1810a 100644
--- a/kernel/arch/arm/cortex-m7/iar/los_arch_context.h
+++ b/kernel/arch/arm/cortex-m7/iar/los_arch_context.h
@@ -41,7 +41,7 @@ extern "C" {
#endif /* __cpluscplus */
#endif /* __cpluscplus */
-typedef struct tagTskContext {
+typedef struct TagTskContext {
#if ((defined(__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined(__FPU_USED) && (__FPU_USED == 1U)))
UINT32 S16;
diff --git a/kernel/arch/arm/cortex-m7/iar/los_arch_interrupt.h b/kernel/arch/arm/cortex-m7/iar/los_arch_interrupt.h
old mode 100755
new mode 100644
index b3ab442f..445a7fe7
--- a/kernel/arch/arm/cortex-m7/iar/los_arch_interrupt.h
+++ b/kernel/arch/arm/cortex-m7/iar/los_arch_interrupt.h
@@ -449,15 +449,14 @@ extern VOID HalPendSV(VOID);
#define OS_EXC_EVENT 0x00000001
/**
- *@ingroup los_exc
+ * @ingroup los_exc
* the struct of register files
*
* description: the register files that saved when exception triggered
*
* notes:the following register with prefix 'uw' correspond to the registers in the cpu data sheet.
*/
-typedef struct tagExcContext {
- //handler save
+typedef struct TagExcContext {
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
UINT32 S16;
@@ -486,7 +485,7 @@ typedef struct tagExcContext {
UINT32 uwR10;
UINT32 uwR11;
UINT32 uwPriMask;
- //auto save
+ /* auto save */
UINT32 uwSP;
UINT32 uwR0;
UINT32 uwR1;
@@ -532,7 +531,7 @@ VOID HalExcHandleEntry(UINT32 excType, UINT32 faultAddr, UINT32 pid, EXC_CONTEXT
* @attention:
*
*
- *@param uwArraySize [IN] Memory size of exception.
+ * @param uwArraySize [IN] Memory size of exception.
*
* @retval: None
* @par Dependency:
@@ -551,155 +550,155 @@ VOID HalHwiInit();
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器入栈时发生错误
+ * @ingroup los_exc
+ * Cortex-M exception types: An error occurred while the bus status register was being pushed.
*/
#define OS_EXC_BF_STKERR 1
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器出栈时发生错误
+ * @ingroup los_exc
+ * Cortex-M exception types: An error occurred while the bus status register was out of the stack.
*/
#define OS_EXC_BF_UNSTKERR 2
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器不精确的数据访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Bus status register imprecise data access violation.
*/
#define OS_EXC_BF_IMPRECISERR 3
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器精确的数据访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Bus status register exact data access violation.
*/
#define OS_EXC_BF_PRECISERR 4
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:总线状态寄存器取指时的访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Bus status register access violation while pointing.
*/
#define OS_EXC_BF_IBUSERR 5
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:存储器管理状态寄存器入栈时发生错误
+ * @ingroup los_exc
+ * Cortex-M exception types: An error occurred while the memory management status register was being pushed.
*/
#define OS_EXC_MF_MSTKERR 6
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:存储器管理状态寄存器出栈时发生错误
+ * @ingroup los_exc
+ * Cortex-M exception types: An error occurred while the memory management status register was out of the stack.
*/
#define OS_EXC_MF_MUNSTKERR 7
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:存储器管理状态寄存器数据访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Memory management status register data access violation.
*/
#define OS_EXC_MF_DACCVIOL 8
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:存储器管理状态寄存器取指访问违例
+ * @ingroup los_exc
+ * Cortex-M exception types: Memory management status register access violation.
*/
#define OS_EXC_MF_IACCVIOL 9
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,表示除法运算时除数为零
+ * @ingroup los_exc
+ * Cortex-M exception types: ncorrect usage indicating that the divisor is zero during the division operation.
*/
#define OS_EXC_UF_DIVBYZERO 10
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,未对齐访问导致的错误
+ * @ingroup los_exc
+ * Cortex-M exception types: Usage error, error caused by unaligned access.
*/
#define OS_EXC_UF_UNALIGNED 11
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,试图执行协处理器相关指令
+ * @ingroup los_exc
+ * Cortex-M exception types: Incorrect usage attempting to execute coprocessor related instruction.
*/
#define OS_EXC_UF_NOCP 12
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,在异常返回时试图非法地加载EXC_RETURN到PC
+ * @ingroup los_exc
+ * Cortex-M exception types: Usage error attempting to load EXC_RETURN to PC illegally on exception return.
*/
#define OS_EXC_UF_INVPC 13
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,试图切入ARM状态
+ * @ingroup los_exc
+ * Cortex-M exception types: Incorrect usage, attempting to cut to ARM state.
*/
#define OS_EXC_UF_INVSTATE 14
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:用法错误,执行的指令其编码是未定义的——解码不能
+ * @ingroup los_exc
+ * Cortex-M exception types: Incorrect usage. Executed instruction whose code is undefined.
*/
#define OS_EXC_UF_UNDEFINSTR 15
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:NMI中断
+ * @ingroup los_exc
+ * Cortex-M exception types: NMI
*/
#define OS_EXC_CAUSE_NMI 16
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:硬fault
+ * @ingroup los_exc
+ * Cortex-M exception types: hard fault
*/
#define OS_EXC_CAUSE_HARDFAULT 17
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:任务处理函数退出
+ * @ingroup los_exc
+ * Cortex-M exception types: The task handler exits.
*/
#define OS_EXC_CAUSE_TASK_EXIT 18
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:致命错误
+ * @ingroup los_exc
+ * Cortex-M exception types: A fatal error.
*/
#define OS_EXC_CAUSE_FATAL_ERR 19
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:调试事件导致的硬fault
+ * @ingroup los_exc
+ * Cortex-M exception types: Hard Fault caused by a debug event.
*/
#define OS_EXC_CAUSE_DEBUGEVT 20
/**
- *@ingroup los_exc
- *Cortex-M3异常具体类型:取向量时发生的硬fault
+ * @ingroup los_exc
+ * Cortex-M exception types: A hard fault that occurs when a quantity is oriented.
*/
#define OS_EXC_CAUSE_VECTBL 21
/**
- *@ingroup los_exc
- * 异常信息结构体
+ * @ingroup los_exc
+ * Exception information structure
*
- * 描述:M4平台下的异常触发时保存的异常信息
+ * Description: Exception information saved when an exception is triggered on the Cortex-M4 platform.
*
*/
-typedef struct tagExcInfo {
- /**< 异常发生阶段: 0表示异常发生在初始化中,1表示异常发生在任务中,2表示异常发生在中断中 */
+typedef struct TagExcInfo {
+ /**< Exception occurrence phase: 0 means that an exception occurs in initialization, 1 means that an exception occurs in a task, and 2 means that an exception occurs in an interrupt */
UINT16 phase;
- /**< 异常类型,出异常时对照上面列出的1-19号 */
+ /**< Exception type. When exceptions occur, check the numbers 1 - 19 listed above */
UINT16 type;
- /**< 若为精确地址访问错误表示异常发生时的错误访问地址 */
+ /**< If the exact address access error indicates the wrong access address when the exception occurred */
UINT32 faultAddr;
- /**< 在中断中发生异常,表示中断号。在任务中发生异常,表示任务id,如果发生在初始化中,则为0xffffffff */
+ /**< An exception occurs in an interrupt, indicating the interrupt number. An exception occurs in the task, indicating the task ID, or 0xFFFFFFFF if it occurs during initialization */
UINT32 thrdPid;
- /**< 异常嵌套个数,目前仅支持第一次进入异常时执行注册的钩子函数 */
+ /**< Number of nested exceptions. Currently only registered hook functions are supported when an exception is entered for the first time */
UINT16 nestCnt;
- /**< 保留 */
+ /**< reserve */
UINT16 reserved;
- /**< 自动压栈浮点寄存器的异常发生时刻的硬件上下文 */
- EXC_CONTEXT_S * context;
+ /**< Hardware context at the time an exception to the automatic stack floating-point register occurs */
+ EXC_CONTEXT_S *context;
} ExcInfo;
extern UINT32 g_curNestCount;
@@ -716,4 +715,3 @@ extern ExcInfo g_excInfo;
#endif /* __cpluscplus */
#endif /* _LOS_EXC_H */
-
diff --git a/kernel/arch/arm/cortex-m7/iar/los_context.c b/kernel/arch/arm/cortex-m7/iar/los_context.c
index e4da9f80..a7a881d0 100644
--- a/kernel/arch/arm/cortex-m7/iar/los_context.c
+++ b/kernel/arch/arm/cortex-m7/iar/los_context.c
@@ -28,13 +28,16 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include "los_config.h"
-#include "los_task.h"
+
+#include "los_context.h"
#include "securec.h"
-#include "los_interrupt.h"
#include "los_arch_context.h"
#include "los_arch_interrupt.h"
+#include "los_task.h"
+#include "los_sched.h"
+#include "los_interrupt.h"
#include "los_arch_timer.h"
+#include "los_timer.h"
#ifdef __cplusplus
#if __cplusplus
@@ -64,7 +67,8 @@ LITE_OS_SEC_TEXT_INIT VOID HalArchInit()
LITE_OS_SEC_TEXT_MINOR VOID HalSysExit(VOID)
{
LOS_IntLock();
- for(;;);
+ while (1) {
+ }
}
/* ****************************************************************************
@@ -151,11 +155,12 @@ LITE_OS_SEC_TEXT_INIT VOID *HalTskStackInit(UINT32 taskID, UINT32 stackSize, VOI
LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
{
- UINT32 ret;
- ret = HalTickStart(handler);
+ (VOID)LOS_IntLock();
+ UINT32 ret = HalTickStart(handler);
if (ret != LOS_OK) {
return ret;
}
+ OsSchedStart();
HalStartToRun();
return LOS_OK; /* never return */
}
@@ -165,5 +170,3 @@ LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
}
#endif /* __cplusplus */
#endif /* __cplusplus */
-
-
diff --git a/kernel/arch/arm/cortex-m7/iar/los_dispatch.S b/kernel/arch/arm/cortex-m7/iar/los_dispatch.S
old mode 100755
new mode 100644
index dac97f6e..14198f9f
--- a/kernel/arch/arm/cortex-m7/iar/los_dispatch.S
+++ b/kernel/arch/arm/cortex-m7/iar/los_dispatch.S
@@ -29,17 +29,16 @@
; ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;
- PRESERVE8
+ PRESERVE8
- EXPORT HalIntLock
- EXPORT HalIntUnLock
- EXPORT HalIntRestore
- EXPORT HalStartToRun
- EXPORT HalTaskSchedule
- EXPORT HalPendSV
-
- IMPORT g_losTask
- IMPORT g_taskScheduled
+ EXPORT HalIntLock
+ EXPORT HalIntUnLock
+ EXPORT HalIntRestore
+ EXPORT HalStartToRun
+ EXPORT HalTaskSchedule
+ EXPORT HalPendSV
+ IMPORT OsSchedTaskSwitch
+ IMPORT g_losTask
OS_FPU_CPACR EQU 0xE000ED88
OS_FPU_CPACR_ENABLE EQU 0x00F00000
@@ -58,26 +57,11 @@ HalStartToRun
LDR R5, =OS_NVIC_PENDSV_PRI
STR R5, [R4]
- LDR R0, =g_taskScheduled
- MOV R1, #1
- STR R1, [R0]
-
MOV R0, #2
MSR CONTROL, R0
-
- LDR R0, =g_losTask
- LDR R2, [R0, #4]
- LDR R0, =g_losTask
- STR R2, [R0]
-
- LDR R3, =g_losTask
- LDR R0, [R3]
- LDRH R7, [R0 , #4]
- MOV R8, #OS_TASK_STATUS_RUNNING
- ORR R7, R7, R8
- STRH R7, [R0 , #4]
-
+ LDR R1, =g_losTask
+ LDR R0, [R1, #4]
LDR R12, [R0]
LDR.W R1, =OS_FPU_CPACR
@@ -133,6 +117,17 @@ HalPendSV
CPSID I
HalTaskSwitch
+ PUSH {R12, LR}
+ BLX OsSchedTaskSwitch
+ POP {R12, LR}
+ CMP R0, #0
+ MOV R0, LR
+ BNE TaskContextSwitch
+ MSR PRIMASK, R12
+ BX LR
+
+TaskContextSwitch
+ MOV LR, R0
MRS R0, PSP
STMFD R0!, {R4-R12}
@@ -148,24 +143,10 @@ __DisabledFPU1
LDR R6, [R5]
STR R0, [R6]
-
- LDRH R7, [R6 , #4]
- MOV R8,#OS_TASK_STATUS_RUNNING
- BIC R7, R7, R8
- STRH R7, [R6 , #4]
-
-
- LDR R0, =g_losTask
- LDR R0, [R0, #4]
+ LDR R0, [R5, #4]
STR R0, [R5]
-
- LDRH R7, [R0 , #4]
- MOV R8, #OS_TASK_STATUS_RUNNING
- ORR R7, R7, R8
- STRH R7, [R0 , #4]
-
- LDR R1, [R0]
+ LDR R1, [R0]
AND R3, R3, #OS_FPU_CPACR_ENABLE
CMP R3, #OS_FPU_CPACR_ENABLE
BNE __DisabledFPU2
diff --git a/kernel/arch/arm/cortex-m7/iar/los_interrupt.c b/kernel/arch/arm/cortex-m7/iar/los_interrupt.c
old mode 100755
new mode 100644
index 2a40bea1..fb05b4db
--- a/kernel/arch/arm/cortex-m7/iar/los_interrupt.c
+++ b/kernel/arch/arm/cortex-m7/iar/los_interrupt.c
@@ -37,6 +37,7 @@
#include "los_debug.h"
#include "los_hook.h"
#include "los_task.h"
+#include "los_sched.h"
#include "los_memory.h"
#include "los_membox.h"
@@ -172,6 +173,10 @@ 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);
diff --git a/kernel/arch/arm/cortex-m7/iar/los_mpu.c b/kernel/arch/arm/cortex-m7/iar/los_mpu.c
old mode 100755
new mode 100644
diff --git a/kernel/arch/arm/cortex-m7/iar/los_timer.c b/kernel/arch/arm/cortex-m7/iar/los_timer.c
old mode 100755
new mode 100644
index dfbf29bf..e9a75e1a
--- a/kernel/arch/arm/cortex-m7/iar/los_timer.c
+++ b/kernel/arch/arm/cortex-m7/iar/los_timer.c
@@ -28,19 +28,21 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+
+#include "los_timer.h"
#include "los_config.h"
#include "los_tick.h"
#include "los_arch_interrupt.h"
-#include "los_timer.h"
#include "los_context.h"
+#include "los_sched.h"
+#include "los_debug.h"
+
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif /* __cpluscplus */
#endif /* __cpluscplus */
-
-
/* ****************************************************************************
Function : HalTickStart
Description : Configure Tick Interrupt Start
@@ -68,7 +70,6 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
g_sysClock = OS_SYS_CLOCK;
g_cyclesPerTick = OS_SYS_CLOCK / LOSCFG_BASE_CORE_TICK_PER_SECOND;
- g_ullTickCount = 0;
ret = SysTick_Config(g_cyclesPerTick);
if (ret == 1) {
@@ -78,153 +79,64 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler)
return LOS_OK;
}
-VOID HalSysTickReload(UINT32 cyclesPerTick)
+WEAK VOID HalSysTickReload(UINT64 nextResponseTime)
{
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
- NVIC_ClearPendingIRQ(SysTick_IRQn);
- SysTick->LOAD = (UINT32)(cyclesPerTick - 1UL); /* set reload register */
+ SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
+ NVIC_ClearPendingIRQ(SysTick_IRQn);
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
}
-/* ****************************************************************************
-Function : HalSysTickCurrCycleGet
-Description : Get System cycle count
-Input : none
-output : none
-return : hwCycle --- the system cycle count
-**************************************************************************** */
-LITE_OS_SEC_TEXT_MINOR UINT32 HalSysTickCurrCycleGet(VOID)
+WEAK UINT64 HalGetTickCycle(UINT32 *period)
{
UINT32 hwCycle;
- UINTPTR intSave;
-
- intSave = LOS_IntLock();
- hwCycle = SysTick->VAL;
-
- /* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
- if ((SCB->ICSR & TICK_CHECK) != 0) {
- hwCycle = SysTick->VAL;
- hwCycle += g_cyclesPerTick;
- }
-
+ UINTPTR intSave = LOS_IntLock();
+ *period = SysTick->LOAD;
+ hwCycle = *period - SysTick->VAL;
LOS_IntRestore(intSave);
-
- return hwCycle;
+ return (UINT64)hwCycle;
}
-/* ****************************************************************************
-Function : HalGetCpuCycle
-Description : Get System cycle count
-Input : none
-output : cntHi --- CpuTick High 4 byte
- cntLo --- CpuTick Low 4 byte
-return : none
-**************************************************************************** */
-LITE_OS_SEC_TEXT_MINOR VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
+WEAK VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
{
- UINT64 swTick;
UINT64 cycle;
- UINT32 hwCycle;
- UINTPTR intSave;
-
- intSave = LOS_IntLock();
-
- swTick = g_ullTickCount;
- hwCycle = SysTick->VAL;
-
- /* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
- if ((SCB->ICSR & TICK_CHECK) != 0) {
- hwCycle = SysTick->VAL;
- swTick++;
- }
-
- cycle = (((swTick) * g_cyclesPerTick) + (g_cyclesPerTick - hwCycle));
-
- *cntHi = cycle >> SHIFT_32_BIT;
- *cntLo = cycle & CYCLE_CHECK;
-
- LOS_IntRestore(intSave);
-
- return;
-}
-
-/* ****************************************************************************
-Function : HalGetSystickCycle
-Description : Get Sys tick cycle count
-Input : none
-output : cntHi --- SysTick count High 4 byte
- cntLo --- SysTick count Low 4 byte
-return : none
-**************************************************************************** */
-LITE_OS_SEC_TEXT_MINOR VOID HalGetSystickCycle(UINT32 *cntHi, UINT32 *cntLo)
-{
- UINT64 swTick;
- UINT64 cycle;
- UINT32 hwCycle;
- UINTPTR intSave;
- UINT32 systickLoad;
- UINT32 systickCur;
-
- intSave = LOS_IntLock();
-
- swTick = g_ullTickCount;
-
- systickLoad = SysTick->LOAD;
- systickCur = SysTick->VAL;
- if (systickLoad < systickCur) {
- LOS_IntRestore(intSave);
+ if ((cntHi == NULL) || (cntLo == NULL)) {
return;
}
- hwCycle = systickLoad - systickCur;
- /* tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */
- if ((SCB->ICSR & TICK_CHECK) != 0) {
- hwCycle = systickLoad - systickCur;
- swTick++;
- }
-
- cycle = hwCycle + swTick * systickLoad;
+ cycle = OsGetCurrSchedTimeCycle();
*cntHi = cycle >> SHIFT_32_BIT;
*cntLo = cycle & CYCLE_CHECK;
-
- LOS_IntRestore(intSave);
-
return;
}
-static BOOL g_sysSleepFlag = FALSE;
-
-VOID HalTickLock(VOID)
+WEAK VOID HalTickLock(VOID)
{
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
+ SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
-VOID HalTickUnlock(VOID)
+WEAK VOID HalTickUnlock(VOID)
{
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
-}
-
-BOOL HalGetSysSleepFlag(VOID)
-{
- return g_sysSleepFlag;
-}
-
-VOID HalClearSysSleepFlag(VOID)
-{
- g_sysSleepFlag = FALSE;
+ SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
}
VOID HalEnterSleep(LOS_SysSleepEnum sleep)
{
- __DSB();
- __WFI();
- __ISB();
+#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
+ if (sleep == OS_SYS_DEEP_SLEEP) {
+ OsSchedToSleep();
+ }
+#endif
+
+ __DSB();
+ __WFI();
+ __ISB();
}
WEAK VOID HalDelay(UINT32 ticks)
{
-
+ return;
}
WEAK UINT64 HalGetExpandTick(VOID)
diff --git a/kernel/arch/include/los_atomic.h b/kernel/arch/include/los_atomic.h
old mode 100644
new mode 100755
diff --git a/kernel/arch/include/los_context.h b/kernel/arch/include/los_context.h
old mode 100644
new mode 100755
diff --git a/kernel/arch/include/los_timer.h b/kernel/arch/include/los_timer.h
index e216c3f4..0021ef2a 100755
--- a/kernel/arch/include/los_timer.h
+++ b/kernel/arch/include/los_timer.h
@@ -81,25 +81,25 @@ INT32 HalSetRtcTimeZone(INT32 timeZone);
/**
* @ingroup los_timer
- * @brief Configure Tick Interrupt Start.
+ * @brief Get systick cycle.
*
* @par Description:
- * This API is used to configure Tick Interrupt Start while macro LOSCFG_BASE_CORE_TICK_HW_TIME is No.
+ * This API is used to get systick cycle and return current tick period.
*
* @attention
*
*
- * @param: None.
+ * @param: period [OUT] current tick period.
*
- * @retval #LOS_OK 0:configure Tick Interrupt success.
- * @retval #LOS_ERRNO_TICK_CFG_INVALID 0x02000400:configure Tick Interrupt failed.
+ * @retval current tick count.
*
* @par Dependency:
- * los_config.h: the header file that contains the API declaration.
+ * los_timer.h: the header file that contains the API declaration.
* @see
*/
+UINT64 HalGetTickCycle(UINT32 *period);
/**
* @ingroup los_hwi
@@ -114,37 +114,14 @@ INT32 HalSetRtcTimeZone(INT32 timeZone);
* None.
*
*
- * @param cyclesPerTick [IN] Cycles Per Tick
+ * @param nextResponseTime [IN] tick period
*
* @retval None.
* @par Dependency:
* los_hwi.h: the header file that contains the API declaration.
* @see None
*/
-extern VOID HalSysTickReload(UINT32 cyclesPerTick);
-
-/**
- * @ingroup los_hwi
- * @brief Get System cycle count.
- *
- * @par Description:
- *
- * This API is used to Get System cycle count.
- *
- * @attention
- *
- *
- * @param None.
- *
- * @retval: The value of the system cycle count.
- * @par Dependency:
- * los_hwi.h: the header file that contains the API declaration.
- * @see LOS_IntRestore
- */
-extern UINT32 HalSysTickCurrCycleGet(VOID);
-
+extern VOID HalSysTickReload(UINT64 nextResponseTime);
/* *
* @ingroup los_hwi
@@ -169,53 +146,10 @@ extern UINT32 HalSysTickCurrCycleGet(VOID);
*/
extern VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo);
-
-
-extern VOID HalGetSystickCycle(UINT32 *puwCntHi, UINT32 *puwCntLo);
-
-/**
- * @ingroup los_tickless
- * @brief enable the tickless mode.
- *
- * @par Description:
- * This API is used to enable the tickless mode. System can change from periodic clock mode to dynamic clock mode.
- *
- * @attention
- *
- *
- * @param None.
- *
- * @retval None.
- * @par Dependency:
- * los_tickless.h: the header file that contains the API declaration.
- * @see LOS_TicklessDisable
- */
-extern VOID HalTicklessEnable(VOID);
-/**
- * @ingroup los_tickless
- * @brief disable the tickless mode.
- *
- * @par Description:
- * This API is used to diable the tickless mode. System will not change from periodic clock mode to dynamic clock mode.
- *
- * @attention
- *
- *
- * @param None.
- *
- * @retval None.
- * @par Dependency:
- * los_tickless.h: the header file that contains the API declaration.
- * @see LOS_TicklessEnable
- */
-extern VOID HalTicklessDisable(VOID);
-
#ifdef __cplusplus
#if __cplusplus
}
#endif /* __cplusplus */
#endif /* __cplusplus */
-#endif
\ No newline at end of file
+#endif
diff --git a/kernel/arch/risc-v/riscv32/gcc/los_arch_context.h b/kernel/arch/risc-v/riscv32/gcc/los_arch_context.h
index 5eb0ee0e..c9379868 100644
--- a/kernel/arch/risc-v/riscv32/gcc/los_arch_context.h
+++ b/kernel/arch/risc-v/riscv32/gcc/los_arch_context.h
@@ -131,6 +131,8 @@ STATIC INLINE UINTPTR GetFp(VOID)
extern VOID HalStartToRun(VOID);
+extern VOID HalTaskContextSwitch(UINTPTR intSave);
+
/**
* @ingroup los_hw
* @brief Wait for interrupt.
diff --git a/kernel/arch/risc-v/riscv32/gcc/los_arch_interrupt.h b/kernel/arch/risc-v/riscv32/gcc/los_arch_interrupt.h
old mode 100755
new mode 100644
diff --git a/kernel/arch/risc-v/riscv32/gcc/los_arch_timer.h b/kernel/arch/risc-v/riscv32/gcc/los_arch_timer.h
index 59159c0c..268f64ff 100644
--- a/kernel/arch/risc-v/riscv32/gcc/los_arch_timer.h
+++ b/kernel/arch/risc-v/riscv32/gcc/los_arch_timer.h
@@ -42,6 +42,9 @@ extern "C" {
#endif /* __cpluscplus */
#endif /* __cpluscplus */
+#define MTIMER_HI_OFFSET 4
+#define OS_COMBINED_64(hi, ho) (((UINT64)(hi) << 32) | (ho))
+
UINT32 HalTickStart(OS_TICK_HANDLER handler);
#ifdef __cplusplus
diff --git a/kernel/arch/risc-v/riscv32/gcc/los_context.c b/kernel/arch/risc-v/riscv32/gcc/los_context.c
index ed79418d..763ddd8b 100644
--- a/kernel/arch/risc-v/riscv32/gcc/los_context.c
+++ b/kernel/arch/risc-v/riscv32/gcc/los_context.c
@@ -33,6 +33,7 @@
#include "los_arch_interrupt.h"
#include "los_arch_timer.h"
#include "los_task.h"
+#include "los_sched.h"
#include "los_memory.h"
#include "los_timer.h"
#include "soc.h"
@@ -43,11 +44,41 @@ extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
+STATIC UINT32 g_sysNeedSched = FALSE;
+
LITE_OS_SEC_TEXT_INIT VOID HalArchInit(VOID)
{
HalHwiInit();
}
+VOID HalIrqEndCheckNeedSched(VOID)
+{
+ if (g_sysNeedSched) {
+ LOS_Schedule();
+ }
+}
+
+VOID HalTaskSchedule(VOID)
+{
+ UINT32 intSave;
+
+ if (OS_INT_ACTIVE) {
+ g_sysNeedSched = TRUE;
+ return;
+ }
+
+ intSave = LOS_IntLock();
+ g_sysNeedSched = FALSE;
+ BOOL isSwitch = OsSchedTaskSwitch();
+ if (isSwitch) {
+ HalTaskContextSwitch(intSave);
+ return;
+ }
+
+ LOS_IntRestore(intSave);
+ return;
+}
+
LITE_OS_SEC_TEXT_MINOR VOID HalSysExit(VOID)
{
HalIntLock();
@@ -105,23 +136,17 @@ LITE_OS_SEC_TEXT_INIT VOID *HalTskStackInit(UINT32 taskID, UINT32 stackSize, VOI
LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
{
- UINT32 ret;
- ret = HalTickStart(handler);
+ (VOID)LOS_IntLock();
+ UINT32 ret = HalTickStart(handler);
if (ret != LOS_OK) {
return ret;
}
+
+ OsSchedStart();
HalStartToRun();
return LOS_OK; /* never return */
}
-LITE_OS_SEC_TEXT VOID HalTaskScheduleCheck(VOID)
-{
-#if (LOSCFG_BASE_CORE_TSK_MONITOR == 1)
- OsTaskSwitchCheck();
-#endif
- return;
-}
-
LITE_OS_SEC_TEXT VOID wfi(VOID)
{
__asm__ __volatile__("wfi");
@@ -137,11 +162,6 @@ LITE_OS_SEC_TEXT VOID dsb(VOID)
__asm__ __volatile__("fence":::"memory");
}
-VOID HalEnterSleep(LOS_SysSleepEnum sleep)
-{
- wfi();
-}
-
#ifdef __cplusplus
#if __cplusplus
}
diff --git a/kernel/arch/risc-v/riscv32/gcc/los_dispatch.S b/kernel/arch/risc-v/riscv32/gcc/los_dispatch.S
index cf49ae8b..7c4292e9 100644
--- a/kernel/arch/risc-v/riscv32/gcc/los_dispatch.S
+++ b/kernel/arch/risc-v/riscv32/gcc/los_dispatch.S
@@ -37,56 +37,19 @@
.global HalIntUnLock
.global HalIntRestore
.global HalStartToRun
-.global HalTaskSchedule
-.global HalTaskSwitch
+.global HalTaskContextSwitch
.extern __irq_stack_top
-.extern HalTaskScheduleCheck
-.extern printk
-.equ OS_TASK_STATUS_RUNNING, 0x0010
-.equ OS_TASK_STATUS_NOT_RUNNING, 0xFFEF
.section .interrupt.text
-.macro PUSH_CALLER_REG
- addi sp, sp, -(32 * REGBYTES)
- SREG t6, 2 * REGBYTES(sp)
- SREG t5, 3 * REGBYTES(sp)
- SREG t4, 4 * REGBYTES(sp)
- SREG t3, 5 * REGBYTES(sp)
- SREG t2, 6 * REGBYTES(sp)
- SREG t1, 7 * REGBYTES(sp)
- SREG t0, 8 * REGBYTES(sp)
- SREG a7, 18 * REGBYTES(sp)
- SREG a6, 19 * REGBYTES(sp)
- SREG a5, 20 * REGBYTES(sp)
- SREG a4, 21 * REGBYTES(sp)
- SREG a3, 22 * REGBYTES(sp)
- SREG a2, 23 * REGBYTES(sp)
- SREG a1, 24 * REGBYTES(sp)
- SREG a0, 25 * REGBYTES(sp)
- SREG ra, 31 * REGBYTES(sp)
-.endm
-
-.macro POP_CALLER_REG
- LREG t6, 2 * REGBYTES(sp)
- LREG t5, 3 * REGBYTES(sp)
- LREG t4, 4 * REGBYTES(sp)
- LREG t3, 5 * REGBYTES(sp)
- LREG t2, 6 * REGBYTES(sp)
- LREG t1, 7 * REGBYTES(sp)
- LREG t0, 8 * REGBYTES(sp)
- LREG a7, 18 * REGBYTES(sp)
- LREG a6, 19 * REGBYTES(sp)
- LREG a5, 20 * REGBYTES(sp)
- LREG a4, 21 * REGBYTES(sp)
- LREG a3, 22 * REGBYTES(sp)
- LREG a2, 23 * REGBYTES(sp)
- LREG a1, 24 * REGBYTES(sp)
- LREG a0, 25 * REGBYTES(sp)
- LREG ra, 31 * REGBYTES(sp)
- addi sp, sp, 32 * REGBYTES
-.endm
-
-.macro PUSH_CALLEE_REG
+.macro PUSH_ALL_REG
+ addi sp, sp, -(32 * REGBYTES)
+ SREG t6, 2 * REGBYTES(sp)
+ SREG t5, 3 * REGBYTES(sp)
+ SREG t4, 4 * REGBYTES(sp)
+ SREG t3, 5 * REGBYTES(sp)
+ SREG t2, 6 * REGBYTES(sp)
+ SREG t1, 7 * REGBYTES(sp)
+ SREG t0, 8 * REGBYTES(sp)
SREG s11, 9 * REGBYTES(sp)
SREG s10, 10 * REGBYTES(sp)
SREG s9, 11 * REGBYTES(sp)
@@ -94,11 +57,20 @@
SREG s7, 13 * REGBYTES(sp)
SREG s6, 14 * REGBYTES(sp)
SREG s5, 15 * REGBYTES(sp)
+ SREG a7, 18 * REGBYTES(sp)
+ SREG a6, 19 * REGBYTES(sp)
+ SREG a5, 20 * REGBYTES(sp)
+ SREG a4, 21 * REGBYTES(sp)
+ SREG a3, 22 * REGBYTES(sp)
+ SREG a2, 23 * REGBYTES(sp)
+ SREG a1, 24 * REGBYTES(sp)
+ SREG a0, 25 * REGBYTES(sp)
SREG s4, 26 * REGBYTES(sp)
SREG s3, 27 * REGBYTES(sp)
SREG s2, 28 * REGBYTES(sp)
SREG s1, 29 * REGBYTES(sp)
SREG s0, 30 * REGBYTES(sp)
+ SREG ra, 31 * REGBYTES(sp)
.endm
.macro POP_ALL_REG
@@ -133,85 +105,32 @@
addi sp, sp, 32 * REGBYTES
.endm
+HalTaskContextSwitch:
+ PUSH_ALL_REG
+ andi a1, a0, RISCV_MSTATUS_MIE
+
+ // must be in machine mode
+ ori a1, a1, 0x180
+ slli a1, a1, 0x4
+ or a0, a0, a1
+ li a1, ~RISCV_MSTATUS_MIE
+ and a0, a0, a1
+ SREG a0, 16 * REGBYTES(sp)
+ SREG ra, 17 * REGBYTES(sp)
+
+ la a1, g_losTask
+ lw a0, 0(a1)
+ sw sp, TASK_CB_KERNEL_SP(a0)
+
+ lw a0, 4(a1)
+ sw a0, 0(a1)
+
HalStartToRun:
-// disable interrupts
- csrci mstatus, RISCV_MSTATUS_MIE
-
-// indicate that sheduler is ON by setting g_taskScheduled=1
- la t0, g_taskScheduled
- li t1, 0x1
- sw t1, 0x0(t0)
-
- j SwitchNewTask
-
-HalTaskSchedule:
- la t0, g_intCount
- lw t1, 0(t0)
- bne t1, zero, 1f
-
- li t0, RISCV_MSTATUS_MIE | RISCV_MSTATUS_MPIE
- csrrc a1, mstatus, t0
-
- la t0, g_losTask
- lw t1, 0(t0)
- lw t2, 4(t0)
- bne t1, t2, 2f
-
- csrw mstatus, a1
-1:
- ret
-2:
- addi sp, sp, -(32 * REGBYTES)
- andi a1, a1, RISCV_MSTATUS_MIE
- ori a1, a1, 0x180
- slli a1, a1, 0x4
- csrs mstatus, a1
- csrw mepc, ra
-
- j SaveContextAndSwitchTask
-
-HalTaskSwitch:
- la t0, g_losTaskLock
- lw t1, 0(t0)
- bgtz t1, NotSwitch
-
- la t0, g_losTask
- lw t1, 0(t0)
- lw t2, 4(t0)
- beq t1, t2, NotSwitch
-
-// stack pointer was passed by entry.s in register a2. store it in runTask structure
- csrr sp, mscratch
-
-SaveContextAndSwitchTask:
- csrr t0, mstatus
- SREG t0, 16 * REGBYTES(sp)
- csrr t0, mepc
- SREG t0, 17 * REGBYTES(sp)
- PUSH_CALLEE_REG
-
-// Clear the task running bit of runTask.
- lh t2, TASK_CB_STATUS(t1)
- li t0, OS_TASK_STATUS_NOT_RUNNING
- and t2, t2, t0
- sh t2, TASK_CB_STATUS(t1)
- sw sp, TASK_CB_KERNEL_SP(t1)
-
- call HalTaskScheduleCheck
-
-SwitchNewTask:
-// copy newTask into runTask
- la t0, g_losTask
- lw t1, 0x4(t0)
- sw t1, 0x0(t0)
-
-// set the task running bit=1
- lh t2, TASK_CB_STATUS(t1)
- ori t2, t2, OS_TASK_STATUS_RUNNING
- sh t2, TASK_CB_STATUS(t1)
+ la a1, g_losTask
+ lw a0, 4(a1)
// retireve stack pointer
- lw sp, TASK_CB_KERNEL_SP(t1)
+ lw sp, TASK_CB_KERNEL_SP(a0)
// enable global interrupts
lw t0, 16 * REGBYTES(sp)
@@ -226,12 +145,6 @@ SwitchNewTask:
mret
-NotSwitch:
- csrr sp, mscratch
-// retrieve the registers
- POP_CALLER_REG
- mret
-
.section .text
HalDisableIRQ:
li t0, (RISCV_MSTATUS_MPIE | RISCV_MSTATUS_MIE) // mpie | mie
diff --git a/kernel/arch/risc-v/riscv32/gcc/los_exc.S b/kernel/arch/risc-v/riscv32/gcc/los_exc.S
old mode 100755
new mode 100644
index 70703a41..61cda429
--- a/kernel/arch/risc-v/riscv32/gcc/los_exc.S
+++ b/kernel/arch/risc-v/riscv32/gcc/los_exc.S
@@ -34,26 +34,34 @@
#include "soc.h"
.macro PUSH_CALLER_REG
- addi sp, sp, -(32 * REGBYTES)
- SREG t6, 2 * REGBYTES(sp)
- SREG t5, 3 * REGBYTES(sp)
- SREG t4, 4 * REGBYTES(sp)
- SREG t3, 5 * REGBYTES(sp)
- SREG t2, 6 * REGBYTES(sp)
- SREG t1, 7 * REGBYTES(sp)
- SREG t0, 8 * REGBYTES(sp)
- SREG a7, 18 * REGBYTES(sp)
- SREG a6, 19 * REGBYTES(sp)
- SREG a5, 20 * REGBYTES(sp)
- SREG a4, 21 * REGBYTES(sp)
- SREG a3, 22 * REGBYTES(sp)
- SREG a2, 23 * REGBYTES(sp)
- SREG a1, 24 * REGBYTES(sp)
- SREG a0, 25 * REGBYTES(sp)
- SREG ra, 31 * REGBYTES(sp)
+ addi sp, sp, -(32 * REGBYTES)
+ SREG t6, 2 * REGBYTES(sp)
+ SREG t5, 3 * REGBYTES(sp)
+ SREG t4, 4 * REGBYTES(sp)
+ SREG t3, 5 * REGBYTES(sp)
+ SREG t2, 6 * REGBYTES(sp)
+ SREG t1, 7 * REGBYTES(sp)
+ SREG t0, 8 * REGBYTES(sp)
+ SREG a7, 18 * REGBYTES(sp)
+ SREG a6, 19 * REGBYTES(sp)
+ SREG a5, 20 * REGBYTES(sp)
+ SREG a4, 21 * REGBYTES(sp)
+ SREG a3, 22 * REGBYTES(sp)
+ SREG a2, 23 * REGBYTES(sp)
+ SREG a1, 24 * REGBYTES(sp)
+ SREG a0, 25 * REGBYTES(sp)
+ SREG ra, 31 * REGBYTES(sp)
+ csrr t0, mstatus
+ SREG t0, 16 * REGBYTES(sp)
+ csrr t0, mepc
+ SREG t0, 17 * REGBYTES(sp)
.endm
.macro POP_CALLER_REG
+ LREG t0, 16 * REGBYTES(sp)
+ csrw mstatus, t0
+ LREG t0, 17 * REGBYTES(sp)
+ csrw mepc, t0
LREG t6, 2 * REGBYTES(sp)
LREG t5, 3 * REGBYTES(sp)
LREG t4, 4 * REGBYTES(sp)
@@ -127,14 +135,7 @@
.align 4
HalTrapEntry:
PUSH_CALLEE_REG
- csrr t0, mstatus
- sw t0, 16 * REGBYTES(sp)
- csrr t0, mepc
- sw t0, 17 * REGBYTES(sp)
- sw tp, 1 * REGBYTES(sp)
- sw sp, 0 * REGBYTES(sp)
addi sp, sp, -(4 * REGBYTES)
- csrr a0, mcause
sw a0, 0 * REGBYTES(sp)
csrr t0, mtval
sw t0, 1 * REGBYTES(sp)
@@ -165,6 +166,7 @@ HalTrapEntry:
.section .interrupt.HalTrapVector.text
.extern HalTrapEntry
+.extern HalIrqEndCheckNeedSched
.global HalTrapVector
.equ TRAP_INTERRUPT_MODE_MASK, 0x80000000
.align 4
@@ -179,6 +181,9 @@ HalTrapVector:
csrw mscratch, sp
la sp, __start_and_irq_stack_top
jal HalHwiInterruptDone
- j HalTaskSwitch
+ csrr sp, mscratch
+ call HalIrqEndCheckNeedSched
+ POP_CALLER_REG
+ mret
#endif /* _LOS_TRAP_S */
diff --git a/kernel/arch/risc-v/riscv32/gcc/los_interrupt.c b/kernel/arch/risc-v/riscv32/gcc/los_interrupt.c
old mode 100755
new mode 100644
index 8ad07867..524b0193
--- a/kernel/arch/risc-v/riscv32/gcc/los_interrupt.c
+++ b/kernel/arch/risc-v/riscv32/gcc/los_interrupt.c
@@ -35,6 +35,7 @@
#include "los_arch_interrupt.h"
#include "los_arch_context.h"
#include "los_task.h"
+#include "los_sched.h"
#include "los_debug.h"
#include "riscv_hal.h"
diff --git a/kernel/arch/risc-v/riscv32/gcc/los_timer.c b/kernel/arch/risc-v/riscv32/gcc/los_timer.c
old mode 100755
new mode 100644
index 9c6e4585..e1ce4c77
--- a/kernel/arch/risc-v/riscv32/gcc/los_timer.c
+++ b/kernel/arch/risc-v/riscv32/gcc/los_timer.c
@@ -29,11 +29,14 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include "los_tick.h"
-#include "los_config.h"
-#include "los_arch_interrupt.h"
-#include "riscv_hal.h"
#include "los_timer.h"
+#include "los_config.h"
+#include "los_tick.h"
+#include "los_reg.h"
+#include "los_arch_interrupt.h"
+#include "los_sched.h"
+#include "los_arch_timer.h"
+#include "riscv_hal.h"
#ifdef __cplusplus
#if __cplusplus
@@ -53,20 +56,58 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER handler)
return LOS_OK; /* never return */
}
-/* ****************************************************************************
-Function : HalGetCpuCycle
-Description : Get System cycle count
-Input : none
-output : cntHi --- CpuTick High 4 byte
- cntLo --- CpuTick Low 4 byte
-return : none
-**************************************************************************** */
-LITE_OS_SEC_TEXT_MINOR VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
+
+WEAK VOID HalSysTickReload(UINT64 nextResponseTime)
{
- HalGetSysCpuCycle(cntHi, cntLo);
+ UINT64 timer;
+ UINT32 timerL, timerH;
+ READ_UINT32(timerL, MTIMER);
+ READ_UINT32(timerH, MTIMER + MTIMER_HI_OFFSET);
+ timer = OS_COMBINED_64(timerH, timerL);
+ timer += nextResponseTime;
+
+ HalIrqDisable(RISCV_MACH_TIMER_IRQ);
+ WRITE_UINT32(0xffffffff, MTIMERCMP + MTIMER_HI_OFFSET);
+ WRITE_UINT32((UINT32)timer, MTIMERCMP);
+ WRITE_UINT32((UINT32)(timer >> SHIFT_32_BIT), MTIMERCMP + MTIMER_HI_OFFSET);
+ HalIrqEnable(RISCV_MACH_TIMER_IRQ);
+}
+
+WEAK UINT64 HalGetTickCycle(UINT32 *period)
+{
+ (VOID)period;
+ UINT32 timerL, timerH;
+
+ READ_UINT32(timerL, MTIMER);
+ READ_UINT32(timerH, MTIMER + MTIMER_HI_OFFSET);
+ return OS_COMBINED_64(timerH, timerL);
+}
+
+WEAK VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)
+{
+ UINT64 cycle;
+
+ if ((cntHi == NULL) || (cntLo == NULL)) {
+ return;
+ }
+
+ cycle = OsGetCurrSchedTimeCycle();
+ *cntHi = cycle >> SHIFT_32_BIT;
+ *cntLo = cycle & CYCLE_CHECK;
return;
}
+VOID HalEnterSleep(LOS_SysSleepEnum sleep)
+{
+#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
+ if (sleep == OS_SYS_DEEP_SLEEP) {
+ OsSchedToSleep();
+ }
+#endif
+
+ wfi();
+}
+
WEAK VOID HalDelay(UINT32 ticks)
{
diff --git a/kernel/include/los_config.h b/kernel/include/los_config.h
old mode 100755
new mode 100644
index d3909f7f..052c90e7
--- a/kernel/include/los_config.h
+++ b/kernel/include/los_config.h
@@ -103,6 +103,22 @@ extern "C" {
#define LOSCFG_BASE_CORE_TICK_HW_TIME 0
#endif
+/**
+ * @ingroup los_config
+ * System timer is a 64/128 bit timer
+ */
+#ifndef LOSCFG_BASE_CORE_TICK_WTIMER
+#define LOSCFG_BASE_CORE_TICK_WTIMER 0
+#endif
+
+/**
+ * @ingroup los_config
+ * System timer count maximum
+ */
+#ifndef LOSCFG_BASE_CORE_TICK_RESPONSE_MAX
+#define LOSCFG_BASE_CORE_TICK_RESPONSE_MAX 0
+#endif
+
/* =============================================================================
Hardware interrupt module configuration
============================================================================= */
@@ -190,7 +206,7 @@ extern "C" {
* Configuration item for task Robin tailoring
*/
#ifndef LOSCFG_BASE_CORE_TIMESLICE
-#define LOSCFG_BASE_CORE_TIMESLICE 1
+#define LOSCFG_BASE_CORE_TIMESLICE 1
#endif
/**
@@ -198,7 +214,7 @@ extern "C" {
* Longest execution time of tasks with the same priorities
*/
#ifndef LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT
-#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 10
+#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 20000 /* 20ms */
#endif
/**
@@ -609,6 +625,14 @@ extern UINT8 *m_aucSysMem0;
#define LOSCFG_BACKTRACE_DEPTH 15
#endif
+/**
+ * @ingroup los_config
+ * When the tick timer is a non-64/128-bit timer, it has ultra-low power compensation.
+ */
+#ifndef LOSCFG_BASE_CORE_SCHED_SLEEP
+#define LOSCFG_BASE_CORE_SCHED_SLEEP 0
+#endif
+
#ifdef __cplusplus
#if __cplusplus
}
diff --git a/kernel/include/los_sched.h b/kernel/include/los_sched.h
new file mode 100644
index 00000000..d3f75780
--- /dev/null
+++ b/kernel/include/los_sched.h
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
+ * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _LOS_SCHED_H
+#define _LOS_SCHED_H
+
+#include "los_task.h"
+#include "los_interrupt.h"
+#include "los_timer.h"
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+extern UINT32 g_taskScheduled;
+typedef BOOL (*SchedScan)(VOID);
+
+VOID OsSchedUpdateTimeBase(VOID);
+
+UINT64 OsGetCurrTimeCycle(VOID);
+
+UINT64 OsGetCurrSchedTimeCycle(VOID);
+
+VOID OsSchedSetIdleTaskSchedPartam(LosTaskCB *idleTask);
+
+UINT32 OsSchedSwtmrScanRegister(SchedScan func);
+
+VOID OsSchedUpdateExpireTime(UINT64 startTime);
+
+VOID OsSchedTaskDeQueue(LosTaskCB *taskCB);
+
+VOID OsSchedTaskEnQueue(LosTaskCB *taskCB);
+
+VOID OsSchedTaskWait(LOS_DL_LIST *list, UINT32 timeout);
+
+VOID OsSchedTaskWake(LosTaskCB *resumedTask);
+
+BOOL OsSchedModifyTaskSchedParam(LosTaskCB *taskCB, UINT16 priority);
+
+VOID OsSchedDelay(LosTaskCB *runTask, UINT32 tick);
+
+VOID OsSchedYield(VOID);
+
+VOID OsSchedTaskExit(LosTaskCB *taskCB);
+
+VOID OsSchedTick(VOID);
+
+UINT32 OsSchedInit(VOID);
+
+VOID OsSchedStart(VOID);
+
+BOOL OsSchedTaskSwitch(VOID);
+
+LosTaskCB *OsGetTopTask(VOID);
+
+extern VOID LOS_SchedTickHandler(VOID);
+
+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
+}
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+#endif /* _LOS_SCHED_H */
diff --git a/kernel/include/los_sortlink.h b/kernel/include/los_sortlink.h
new file mode 100644
index 00000000..2e0c5a85
--- /dev/null
+++ b/kernel/include/los_sortlink.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
+ * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _LOS_SORTLINK_H
+#define _LOS_SORTLINK_H
+
+#include "los_compiler.h"
+#include "los_list.h"
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+typedef enum {
+ OS_SORT_LINK_TASK = 1,
+ OS_SORT_LINK_SWTMR = 2,
+} SortLinkType;
+
+typedef struct {
+ LOS_DL_LIST sortLinkNode;
+ UINT64 responseTime;
+} SortLinkList;
+
+typedef struct {
+ LOS_DL_LIST sortLink;
+} SortLinkAttribute;
+
+#define OS_SORT_LINK_INVALID_TIME ((UINT64)-1)
+#define SET_SORTLIST_VALUE(sortList, value) (((SortLinkList *)(sortList))->responseTime = (value))
+
+SortLinkAttribute *OsGetSortLinkAttribute(SortLinkType type);
+UINT64 OsGetNextExpireTime(UINT64 startTime);
+UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader);
+VOID OsDeleteNodeSortLink(SortLinkAttribute *sortLinkHeader, SortLinkList *sortList);
+VOID OsAdd2SortLink(SortLinkList *node, UINT64 startTime, UINT32 waitTicks, SortLinkType type);
+VOID OsDeleteSortLink(SortLinkList *node, SortLinkType type);
+UINT32 OsSortLinkGetTargetExpireTime(UINT64 currTime, const SortLinkList *targetSortList);
+UINT32 OsSortLinkGetNextExpireTime(const SortLinkAttribute *sortLinkHeader);
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+#endif /* _LOS_SORTLINK_H */
diff --git a/kernel/include/los_swtmr.h b/kernel/include/los_swtmr.h
index 9842e48f..d0317f4b 100644
--- a/kernel/include/los_swtmr.h
+++ b/kernel/include/los_swtmr.h
@@ -37,6 +37,7 @@
#ifndef _LOS_SWTMR_H
#define _LOS_SWTMR_H
+#include "los_sortlink.h"
#ifdef __cplusplus
#if __cplusplus
@@ -279,6 +280,7 @@ typedef struct tagSwTmrCtrl {
UINT32 uwArg; /* Parameter passed in when the callback function
that handles software timer timeout is called */
SWTMR_PROC_FUNC pfnHandler; /* Callback function that handles software timer timeout */
+ SortLinkList stSortList;
} SWTMR_CTRL_S;
@@ -451,29 +453,6 @@ extern SWTMR_CTRL_S *g_swtmrCBArray;
#define OS_SWT_FROM_SID(swtmrId) ((SWTMR_CTRL_S *)g_swtmrCBArray + ((swtmrId) % LOSCFG_BASE_CORE_SWTMR_LIMIT))
-/**
- * @ingroup los_swtmr
- * @brief Scan a software timer.
- *
- * @par Description:
- *
- * This API is used to scan a software timer when a Tick interrupt occurs and determine whether the software timer
- expires.
- *
- * @attention
- *
- *
- * @param None.
- *
- * @retval None.
- * @par Dependency:
- * los_swtmr_pri.h: the header file that contains the API declaration.
- * @see LOS_SwtmrStop
- */
-extern UINT32 OsSwtmrScan(VOID);
-
/**
* @ingroup los_swtmr
* @brief Initialization software timer.
diff --git a/kernel/include/los_task.h b/kernel/include/los_task.h
index 73fb1b12..402f5636 100644
--- a/kernel/include/los_task.h
+++ b/kernel/include/los_task.h
@@ -41,6 +41,7 @@
#include "los_context.h"
#include "los_event.h"
#include "los_tick.h"
+#include "los_sortlink.h"
#ifdef __cplusplus
#if __cplusplus
@@ -368,6 +369,8 @@ extern "C" {
*/
#define LOS_ERRNO_TSK_OPERATE_SWTMR LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x22)
+#define LOS_ERRNO_TSK_TIMEOUT LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x23)
+
/**
* @ingroup los_task
* Define the type of the task switching hook function.
@@ -1105,10 +1108,6 @@ extern CHAR* LOS_TaskNameGet(UINT32 taskID);
*/
extern VOID LOS_Schedule(VOID);
-extern UINT32 OsTaskNextSwitchTimeGet(VOID);
-
-
-
/**
* @ingroup los_cpup
* CPU usage error code: The request for memory fails.
@@ -1442,33 +1441,9 @@ extern UINT32 LOS_CpupUsageMonitor(CPUP_TYPE_E type, CPUP_MODE_E mode, UINT32 ta
* @ingroup los_task
* Flag that indicates the task or task control block status.
*
- * The task is waiting for an event to occur.
+ * The task is blocked on a time.
*/
-#define OS_TASK_STATUS_EVENT 0x0400
-
-/**
- * @ingroup los_task
- * Flag that indicates the task or task control block status.
- *
- * The task is reading an event.
- */
-#define OS_TASK_STATUS_EVENT_READ 0x0800
-
-/**
- * @ingroup los_task
- * Flag that indicates the task or task control block status.
- *
- * A software timer is waiting for an event to occur.
- */
-#define OS_TASK_STATUS_SWTMR_WAIT 0x1000
-
-/**
- * @ingroup los_task
- * Flag that indicates the task or task control block status.
- *
- * The task is blocked on a queue.
- */
-#define OS_TASK_STATUS_PEND_QUEUE 0x2000
+#define OS_TASK_STATUS_PEND_TIME 0x0080
/**
* @ingroup los_task
@@ -1627,6 +1602,10 @@ typedef struct {
VOID *stackPointer; /**< Task stack pointer */
UINT16 taskStatus;
UINT16 priority;
+ INT32 timeSlice;
+ UINT32 waitTimes;
+ SortLinkList sortList;
+ UINT64 startTime;
UINT32 stackSize; /**< Task stack size */
UINT32 topOfStack; /**< Task stack top */
UINT32 taskID; /**< Task ID */
@@ -1637,7 +1616,6 @@ typedef struct {
CHAR *taskName; /**< Task name */
LOS_DL_LIST pendList;
LOS_DL_LIST timerList;
- UINT32 idxRollNum;
EVENT_CB_S event;
UINT32 eventMask; /**< Event mask */
UINT32 eventMode; /**< Event mode */
@@ -1700,8 +1678,7 @@ extern UINT16 g_losTaskLock;
* @ingroup los_hw
* Check task schedule.
*/
-#define LOS_CHECK_SCHEDULE ((!g_losTaskLock))
-
+#define LOS_CHECK_SCHEDULE (!g_losTaskLock)
/**
* @ingroup los_task
@@ -1745,50 +1722,6 @@ extern LOS_DL_LIST g_losFreeTask;
*/
extern LOS_DL_LIST g_taskRecyleList;
-/**
- * @ingroup los_task
- * @brief Modify the priority of task.
- *
- * @par Description:
- * This API is used to modify the priority of task.
- *
- * @attention
- *
- * The taskCB should be a correct pointer to task control block structure.
- * the priority should be in [0, OS_TASK_PRIORITY_LOWEST].
- *
- *
- * @param taskCB [IN] Type #LosTaskCB * pointer to task control block structure.
- * @param priority [IN] Type #UINT16 the priority of task.
- *
- * @retval None.
- * @par Dependency:
- * los_task_pri.h: the header file that contains the API declaration.
- * @see
- */
-extern VOID OsTaskPriModify(LosTaskCB *taskCB, UINT16 priority);
-
-/**
- * @ingroup los_task
- * @brief Scan a task.
- *
- * @par Description:
- * This API is used to scan a task.
- *
- * @attention
- *
- *
- * @param None.
- *
- * @retval None.
- * @par Dependency:
- * los_task_pri.h: the header file that contains the API declaration.
- * @see
- */
-extern VOID OsTaskScan(VOID);
-
/**
* @ingroup los_task
* @brief Initialization a task.
@@ -1894,52 +1827,6 @@ extern VOID OsTaskMonInit(VOID);
*/
extern VOID OsTaskEntry(UINT32 taskID);
-/**
- * @ingroup los_task
- * @brief pend running task to pendlist
- *
- * @par Description:
- * This API is used to pend task to pendlist and add to sorted delay list.
- *
- * @attention
- *
- * The pstList should be a vaild pointer to pendlist.
- *
- *
- * @param list [IN] Type #LOS_DL_LIST * pointer to list which running task will be pended.
- * @param taskStatus [IN] Type #UINT32 Task Status.
- * @param timeOut [IN] Type #UINT32 Expiry time. The value range is [0,LOS_WAIT_FOREVER].
- *
- * @retval LOS_OK wait success
- * @retval LOS_NOK pend out
- * @par Dependency:
- * los_task_pri.h: the header file that contains the API declaration.
- * @see OsTaskWake
- */
-extern VOID OsTaskWait(LOS_DL_LIST *list, UINT32 taskStatus, UINT32 timeOut);
-
-/**
- * @ingroup los_task
- * @brief delete task from pendlist.
- *
- * @par Description:
- * This API is used to delete task from pendlist and also add to the priqueue.
- *
- * @attention
- *
- * The pstList should be a vaild pointer to pend list.
- *
- *
- * @param resumedTask [IN] Type #LosTaskCB * pointer to the task which will be add to priqueue.
- * @param taskStatus [IN] Type #UINT32 Task Status.
- *
- * @retval None.
- * @par Dependency:
- * los_task_pri.h: the header file that contains the API declaration.
- * @see OsTaskWait
- */
-extern VOID OsTaskWake(LosTaskCB *resumedTask, UINT32 taskStatus);
-
/**
* @ingroup los_task
* @brief Get the task water line.
@@ -1982,49 +1869,6 @@ extern UINT32 OsGetTaskWaterLine(UINT32 taskID);
*/
extern UINT8 *OsConvertTskStatus(UINT16 taskStatus);
-/**
- * @ingroup los_task
- * @brief Add task to sorted delay list.
- *
- * @par Description:
- * This API is used to add task to sorted delay list.
- *
- * @attention
- *
- * The taskCB should be a correct pointer to task control block structure.
- *
- *
- * @param taskCB [IN] Type #LosTaskCB * pointer to task control block structure.
- * @param timeout [IN] Type #UINT32 wait time, ticks.
- *
- * @retval None.
- * @par Dependency:
- * los_task_pri.h: the header file that contains the API declaration.
- * @see OsTimerListDelete
- */
-extern VOID OsTaskAdd2TimerList(LosTaskCB *taskCB, UINT32 timeout);
-
-/**
- * @ingroup los_task
- * @brief delete task from sorted delay list.
- *
- * @par Description:
- * This API is used to delete task from sorted delay list.
- *
- * @attention
- *
- * The taskCB should be a correct pointer to task control block structure.
- *
- *
- * @param taskCB [IN] Type #LosTaskCB * pointer to task control block structure.
- *
- * @retval None.
- * @par Dependency:
- * los_task_pri.h: the header file that contains the API declaration.
- * @see OsTaskAdd2TimerList
- */
-extern VOID OsTimerListDelete(LosTaskCB *taskCB);
-
/**
* @ingroup los_task
* @brief Get all task information.
@@ -2048,51 +1892,6 @@ extern UINT32 OsGetAllTskInfo(VOID);
extern VOID *OsTskUserStackInit(VOID* stackPtr, VOID* userSP, UINT32 userStackSize);
-/**
- * @ingroup los_timeslice
- * @brief Initialize time slices.
- *
- * @par Description:
- *
- * This API is used to initialize time slices that defines the cycle of time slices according to
- LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT.
- *
- * @attention
- *
- *
- * @param None.
- *
- * @retval None.
- * @par Dependency:
- * los_timeslice_pri.h: the header file that contains the API declaration.
- * @see None.
- */
-extern VOID OsTimesliceInit(VOID);
-
-/**
- * @ingroup los_timeslice
- * @brief Check time slices.
- *
- * @par Description:
- *
- * This API is used to check time slices. If the number of Ticks equals to the time for task switch, tasks are switched. Otherwise, the Tick counting continues.
- *
- * @attention
- *
- *
- * @param None.
- *
- * @retval None.
- * @par Dependency:
- * los_timeslice_pri.h: the header file that contains the API declaration.
- * @see None.
- */
-extern VOID OsTimesliceCheck(VOID);
-
#ifdef __cplusplus
#if __cplusplus
}
diff --git a/kernel/include/los_tick.h b/kernel/include/los_tick.h
index ea8f51d1..89220f4a 100644
--- a/kernel/include/los_tick.h
+++ b/kernel/include/los_tick.h
@@ -112,6 +112,18 @@ extern UINT32 LOS_SysClockGet(VOID);
*/
#define OS_SYS_US_PER_SECOND 1000000
+#define OS_SYS_NS_PER_SECOND 1000000000
+
+#define OS_SYS_NS_PER_US 1000
+
+#define OS_CYCLE_PER_TICK (OS_SYS_CLOCK / LOSCFG_BASE_CORE_TICK_PER_SECOND)
+
+#define OS_NS_PER_CYCLE (OS_SYS_NS_PER_SECOND / OS_SYS_CLOCK)
+
+#define OS_US_PER_TICK (OS_SYS_US_PER_SECOND / LOSCFG_BASE_CORE_TICK_PER_SECOND)
+
+#define OS_NS_PER_TICK (OS_SYS_NS_PER_SECOND / LOSCFG_BASE_CORE_TICK_PER_SECOND)
+
/**
* @ingroup los_sys
* System time basic function error code: Null pointer.
diff --git a/kernel/src/los_event.c b/kernel/src/los_event.c
index b0d1335d..e2fe3dc1 100644
--- a/kernel/src/los_event.c
+++ b/kernel/src/los_event.c
@@ -33,6 +33,7 @@
#include "los_hook.h"
#include "los_interrupt.h"
#include "los_task.h"
+#include "los_sched.h"
#ifdef __cplusplus
#if __cplusplus
@@ -128,22 +129,21 @@ LITE_OS_SEC_TEXT UINT32 LOS_EventRead(PEVENT_CB_S eventCB, UINT32 eventMask, UIN
runTsk = g_losTask.runTask;
runTsk->eventMask = eventMask;
runTsk->eventMode = mode;
- OsTaskWait(&eventCB->stEventList, OS_TASK_STATUS_PEND, timeOut);
+ OsSchedTaskWait(&eventCB->stEventList, timeOut);
LOS_IntRestore(intSave);
LOS_Schedule();
+ intSave = LOS_IntLock();
if (runTsk->taskStatus & OS_TASK_STATUS_TIMEOUT) {
- intSave = LOS_IntLock();
- runTsk->taskStatus &= (~OS_TASK_STATUS_TIMEOUT);
+ runTsk->taskStatus &= ~OS_TASK_STATUS_TIMEOUT;
LOS_IntRestore(intSave);
return LOS_ERRNO_EVENT_READ_TIMEOUT;
}
- intSave = LOS_IntLock();
+
ret = LOS_EventPoll(&eventCB->uwEventID, eventMask, mode);
- LOS_IntRestore(intSave);
- } else {
- LOS_IntRestore(intSave);
}
+
+ LOS_IntRestore(intSave);
return ret;
}
@@ -175,7 +175,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_EventWrite(PEVENT_CB_S eventCB, UINT32 events)
((resumedTask->eventMask & eventCB->uwEventID) == resumedTask->eventMask))) {
exitFlag = 1;
- OsTaskWake(resumedTask, OS_TASK_STATUS_PEND);
+ OsSchedTaskWake(resumedTask);
}
resumedTask = nextTask;
}
diff --git a/kernel/src/los_init.c b/kernel/src/los_init.c
old mode 100755
new mode 100644
index 7962a892..5488d952
--- a/kernel/src/los_init.c
+++ b/kernel/src/los_init.c
@@ -175,10 +175,6 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_KernelInit(VOID)
}
#endif
-#if (LOSCFG_BASE_CORE_TIMESLICE == 1)
- OsTimesliceInit();
-#endif
-
ret = OsIdleTaskCreate();
if (ret != LOS_OK) {
return ret;
diff --git a/kernel/src/los_mux.c b/kernel/src/los_mux.c
index fc7457fa..088c5b86 100644
--- a/kernel/src/los_mux.c
+++ b/kernel/src/los_mux.c
@@ -35,6 +35,7 @@
#include "los_hook.h"
#include "los_interrupt.h"
#include "los_memory.h"
+#include "los_sched.h"
#ifdef __cplusplus
#if __cplusplus
@@ -228,22 +229,23 @@ LITE_OS_SEC_TEXT UINT32 LOS_MuxPend(UINT32 muxHandle, UINT32 timeout)
runningTask->taskMux = (VOID *)muxPended;
if (muxPended->owner->priority > runningTask->priority) {
- OsTaskPriModify(muxPended->owner, runningTask->priority);
+ (VOID)OsSchedModifyTaskSchedParam(muxPended->owner, runningTask->priority);
}
- OsTaskWait(&muxPended->muxList, OS_TASK_STATUS_PEND, timeout);
+ OsSchedTaskWait(&muxPended->muxList, timeout);
LOS_IntRestore(intSave);
OsHookCall(LOS_HOOK_TYPE_MUX_PEND, muxPended);
LOS_Schedule();
+ intSave = LOS_IntLock();
if (runningTask->taskStatus & OS_TASK_STATUS_TIMEOUT) {
- intSave = LOS_IntLock();
runningTask->taskStatus &= (~OS_TASK_STATUS_TIMEOUT);
retErr = LOS_ERRNO_MUX_TIMEOUT;
goto ERROR_MUX_PEND;
}
+ LOS_IntRestore(intSave);
return LOS_OK;
HOOK:
@@ -290,7 +292,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_MuxPost(UINT32 muxHandle)
}
if ((muxPosted->owner->priority) != muxPosted->priority) {
- OsTaskPriModify(muxPosted->owner, muxPosted->priority);
+ (VOID)OsSchedModifyTaskSchedParam(muxPosted->owner, muxPosted->priority);
}
if (!LOS_ListEmpty(&muxPosted->muxList)) {
@@ -301,7 +303,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_MuxPost(UINT32 muxHandle)
muxPosted->priority = resumedTask->priority;
resumedTask->taskMux = NULL;
- OsTaskWake(resumedTask, OS_TASK_STATUS_PEND);
+ OsSchedTaskWake(resumedTask);
LOS_IntRestore(intSave);
OsHookCall(LOS_HOOK_TYPE_MUX_POST, muxPosted);
diff --git a/kernel/src/los_queue.c b/kernel/src/los_queue.c
old mode 100755
new mode 100644
index cdba4671..dce06d4f
--- a/kernel/src/los_queue.c
+++ b/kernel/src/los_queue.c
@@ -38,6 +38,7 @@
#include "los_membox.h"
#include "los_memory.h"
#include "los_task.h"
+#include "los_sched.h"
#ifdef __cplusplus
#if __cplusplus
@@ -281,7 +282,6 @@ static INLINE UINT32 OsQueueOperateParamCheck(const LosQueueCB *queueCB, UINT32
UINT32 OsQueueOperate(UINT32 queueID, UINT32 operateType, VOID *bufferAddr, UINT32 *bufferSize, UINT32 timeOut)
{
LosQueueCB *queueCB = NULL;
- LosTaskCB *runTsk = NULL;
LosTaskCB *resumedTask = NULL;
UINT32 ret;
UINT32 readWrite = OS_QUEUE_READ_WRITE_GET(operateType);
@@ -306,14 +306,14 @@ UINT32 OsQueueOperate(UINT32 queueID, UINT32 operateType, VOID *bufferAddr, UINT
goto QUEUE_END;
}
- runTsk = (LosTaskCB *)g_losTask.runTask;
- OsTaskWait(&queueCB->readWriteList[readWrite], OS_TASK_STATUS_PEND_QUEUE, timeOut);
+ LosTaskCB *runTsk = (LosTaskCB *)g_losTask.runTask;
+ OsSchedTaskWait(&queueCB->readWriteList[readWrite], timeOut);
LOS_IntRestore(intSave);
LOS_Schedule();
intSave = LOS_IntLock();
if (runTsk->taskStatus & OS_TASK_STATUS_TIMEOUT) {
- runTsk->taskStatus &= (~OS_TASK_STATUS_TIMEOUT);
+ runTsk->taskStatus &= ~OS_TASK_STATUS_TIMEOUT;
ret = LOS_ERRNO_QUEUE_TIMEOUT;
goto QUEUE_END;
}
@@ -326,7 +326,7 @@ UINT32 OsQueueOperate(UINT32 queueID, UINT32 operateType, VOID *bufferAddr, UINT
if (!LOS_ListEmpty(&queueCB->readWriteList[readWriteTmp])) {
resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&queueCB->readWriteList[readWriteTmp]));
- OsTaskWake(resumedTask, OS_TASK_STATUS_PEND_QUEUE);
+ OsSchedTaskWake(resumedTask);
LOS_IntRestore(intSave);
LOS_Schedule();
return LOS_OK;
@@ -484,7 +484,7 @@ LITE_OS_SEC_TEXT VOID *OsQueueMailAlloc(UINT32 queueID, VOID *mailPool, UINT32 t
}
runTsk = (LosTaskCB *)g_losTask.runTask;
- OsTaskWait(&queueCB->memList, OS_TASK_STATUS_PEND_QUEUE, timeOut);
+ OsSchedTaskWait(&queueCB->memList, timeOut);
LOS_IntRestore(intSave);
LOS_Schedule();
@@ -545,7 +545,7 @@ LITE_OS_SEC_TEXT UINT32 OsQueueMailFree(UINT32 queueID, VOID *mailPool, VOID *ma
if (!LOS_ListEmpty(&queueCB->memList)) {
resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&queueCB->memList));
- OsTaskWake(resumedTask, OS_TASK_STATUS_PEND_QUEUE);
+ OsSchedTaskWake(resumedTask);
mem = LOS_MemboxAlloc(mailPool);
if (mem == NULL) {
LOS_IntRestore(intSave);
diff --git a/kernel/src/los_sched.c b/kernel/src/los_sched.c
new file mode 100644
index 00000000..00867fc7
--- /dev/null
+++ b/kernel/src/los_sched.c
@@ -0,0 +1,638 @@
+/*
+ * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
+ * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "los_sched.h"
+#include "los_task.h"
+#include "los_tick.h"
+#include "los_debug.h"
+#include "los_hook.h"
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+#define OS_64BIT_MAX 0xFFFFFFFFFFFFFFFFULL
+#define OS_PRIORITY_QUEUE_NUM 32
+#define PRIQUEUE_PRIOR0_BIT 0x80000000U
+#define OS_SCHED_TIME_SLICES ((LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT * OS_SYS_NS_PER_US) / OS_NS_PER_CYCLE)
+#define OS_TIME_SLICE_MIN (INT32)((50 * OS_SYS_NS_PER_US) / OS_NS_PER_CYCLE) /* 50us */
+#define OS_SCHED_MAX_RESPONSE_TIME (UINT64)(OS_64BIT_MAX - 1U)
+#define OS_TICK_RESPONSE_TIME_MAX LOSCFG_BASE_CORE_TICK_RESPONSE_MAX
+#if (LOSCFG_BASE_CORE_TICK_RESPONSE_MAX == 0)
+#error "Must specify the maximum value that tick timer counter supports!"
+#endif
+
+STATIC SchedScan g_swtmrScan = NULL;
+STATIC SortLinkAttribute *g_taskSortLinkList = NULL;
+STATIC LOS_DL_LIST g_priQueueList[OS_PRIORITY_QUEUE_NUM];
+STATIC UINT32 g_queueBitmap;
+
+STATIC UINT32 g_schedResponseID = 0;
+STATIC UINT64 g_schedResponseTime = OS_SCHED_MAX_RESPONSE_TIME;
+STATIC UINT64 g_schedStartTime;
+#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
+typedef struct {
+ SchedSleepInit init;
+ SchedSleepStart start;
+ SchedSleepStop stop;
+ SchedSleepGetSleepTimeNs getTimeNs;
+ BOOL ready;
+} SchedSleep;
+
+STATIC BOOL g_schedSleepFlags = FALSE;
+STATIC UINT64 g_schedSleepTime;
+STATIC UINT64 g_schedEntrySleepTime;
+STATIC SchedSleep g_schedSleepCB;
+#endif
+
+#if (LOSCFG_BASE_CORE_TICK_WTIMER == 0)
+STATIC UINT64 g_schedTimerBase;
+
+VOID OsSchedUpdateTimeBase(VOID)
+{
+ UINT32 period = 0;
+
+ (VOID)HalGetTickCycle(&period);
+ g_schedTimerBase += period;
+}
+#endif
+
+UINT64 OsGetCurrTimeCycle(VOID)
+{
+#if (LOSCFG_BASE_CORE_TICK_WTIMER == 1)
+ return HalGetTickCycle(NULL);
+#else
+ STATIC UINT64 oldSchedTime = 0;
+ UINT32 period = 0;
+ UINT32 intSave = LOS_IntLock();
+ UINT64 time = HalGetTickCycle(&period);
+ UINT64 schedTime = g_schedTimerBase + time;
+ if (schedTime < oldSchedTime) {
+ /* Turn the timer count */
+ g_schedTimerBase += period;
+ schedTime = g_schedTimerBase + time;
+ }
+
+ LOS_ASSERT(schedTime >= oldSchedTime);
+
+ oldSchedTime = schedTime;
+ LOS_IntRestore(intSave);
+ return schedTime;
+#endif
+}
+
+UINT64 OsGetCurrSchedTimeCycle(VOID)
+{
+ if (!g_taskScheduled) {
+ return 0;
+ }
+
+ return OsGetCurrTimeCycle() - g_schedStartTime;
+}
+
+STATIC INLINE VOID OsTimeSliceUpdate(LosTaskCB *taskCB, UINT64 currTime)
+{
+ LOS_ASSERT(currTime >= taskCB->startTime);
+
+ INT32 incTime = currTime - taskCB->startTime;
+ if (taskCB->taskID != g_idleTaskID) {
+ taskCB->timeSlice -= incTime;
+ }
+ taskCB->startTime = currTime;
+}
+
+STATIC INLINE VOID OsSchedSetNextExpireTime(UINT64 startTime, UINT32 responseID, UINT64 taskEndTime)
+{
+ UINT64 nextExpireTime = OsGetNextExpireTime(startTime);
+ UINT64 nextResponseTime;
+ BOOL isTimeSlice = FALSE;
+
+ /* The current thread's time slice has been consumed, but the current system lock task cannot
+ * trigger the schedule to release the CPU
+ */
+ if (taskEndTime < nextExpireTime) {
+ nextExpireTime = taskEndTime;
+ isTimeSlice = TRUE;
+ }
+
+ 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
+ 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
+ nextResponseTime = OS_CYCLE_PER_TICK;
+ nextExpireTime = startTime + nextResponseTime;
+ if (nextExpireTime >= g_schedResponseTime) {
+ return;
+ }
+ }
+ } else {
+ /* There is no point earlier than the current expiration date */
+ return;
+ }
+
+ if (isTimeSlice) {
+ /* The expiration time of the current system is the thread's slice expiration time */
+ g_schedResponseID = responseID;
+ } else {
+ g_schedResponseID = OS_INVALID;
+ }
+
+ g_schedResponseTime = nextExpireTime;
+#if (LOSCFG_BASE_CORE_TICK_WTIMER == 0)
+ g_schedTimerBase = OsGetCurrTimeCycle();
+#endif
+ HalSysTickReload(nextResponseTime);
+}
+
+VOID OsSchedUpdateExpireTime(UINT64 startTime)
+{
+ UINT64 endTime;
+ LosTaskCB *runTask = g_losTask.runTask;
+
+ if (runTask->taskID != g_idleTaskID) {
+ INT32 timeSlice = (runTask->timeSlice <= OS_TIME_SLICE_MIN) ? OS_SCHED_TIME_SLICES : runTask->timeSlice;
+ endTime = startTime + timeSlice;
+ } else {
+ endTime = OS_SCHED_MAX_RESPONSE_TIME;
+ }
+ OsSchedSetNextExpireTime(startTime, runTask->taskID, endTime);
+}
+
+STATIC INLINE VOID OsSchedPriQueueEnHead(LOS_DL_LIST *priqueueItem, UINT32 priority)
+{
+ /*
+ * Task control blocks are inited as zero. And when task is deleted,
+ * and at the same time would be deleted from priority queue or
+ * other lists, task pend node will restored as zero.
+ */
+ if (LOS_ListEmpty(&g_priQueueList[priority])) {
+ g_queueBitmap |= PRIQUEUE_PRIOR0_BIT >> priority;
+ }
+
+ LOS_ListAdd(&g_priQueueList[priority], priqueueItem);
+}
+
+STATIC INLINE VOID OsSchedPriQueueEnTail(LOS_DL_LIST *priqueueItem, UINT32 priority)
+{
+ if (LOS_ListEmpty(&g_priQueueList[priority])) {
+ g_queueBitmap |= PRIQUEUE_PRIOR0_BIT >> priority;
+ }
+
+ LOS_ListTailInsert(&g_priQueueList[priority], priqueueItem);
+}
+
+STATIC INLINE VOID OsSchedPriQueueDelete(LOS_DL_LIST *priqueueItem, UINT32 priority)
+{
+ LOS_ListDelete(priqueueItem);
+ if (LOS_ListEmpty(&g_priQueueList[priority])) {
+ g_queueBitmap &= ~(PRIQUEUE_PRIOR0_BIT >> priority);
+ }
+}
+
+STATIC INLINE VOID OsSchedWakePendTimeTask(UINT64 currTime, LosTaskCB *taskCB, BOOL *needSchedule)
+{
+ UINT16 tempStatus = taskCB->taskStatus;
+ if (tempStatus & (OS_TASK_STATUS_PEND | OS_TASK_STATUS_DELAY)) {
+ taskCB->taskStatus &= ~(OS_TASK_STATUS_PEND | OS_TASK_STATUS_PEND_TIME | OS_TASK_STATUS_DELAY);
+ if (tempStatus & OS_TASK_STATUS_PEND) {
+ taskCB->taskStatus |= OS_TASK_STATUS_TIMEOUT;
+ LOS_ListDelete(&taskCB->pendList);
+ taskCB->taskMux = NULL;
+ taskCB->taskSem = NULL;
+ }
+
+ if (!(tempStatus & OS_TASK_STATUS_SUSPEND)) {
+ OsSchedTaskEnQueue(taskCB);
+ *needSchedule = TRUE;
+ }
+ }
+}
+
+STATIC INLINE BOOL OsSchedScanTimerList(VOID)
+{
+ BOOL needSchedule = FALSE;
+ LOS_DL_LIST *listObject = &g_taskSortLinkList->sortLink;
+ /*
+ * When task is pended with timeout, the task block is on the timeout sortlink
+ * (per cpu) and ipc(mutex,sem and etc.)'s block at the same time, it can be waken
+ * up by either timeout or corresponding ipc it's waiting.
+ *
+ * Now synchronize sortlink preocedure is used, therefore the whole task scan needs
+ * to be protected, preventing another core from doing sortlink deletion at same time.
+ */
+
+ if (LOS_ListEmpty(listObject)) {
+ return needSchedule;
+ }
+
+ SortLinkList *sortList = LOS_DL_LIST_ENTRY(listObject->pstNext, SortLinkList, sortLinkNode);
+ UINT64 currTime = OsGetCurrSchedTimeCycle();
+ while (sortList->responseTime <= currTime) {
+ LosTaskCB *taskCB = LOS_DL_LIST_ENTRY(sortList, LosTaskCB, sortList);
+ OsDeleteNodeSortLink(g_taskSortLinkList, &taskCB->sortList);
+
+ OsSchedWakePendTimeTask(currTime, taskCB, &needSchedule);
+
+ if (LOS_ListEmpty(listObject)) {
+ break;
+ }
+
+ sortList = LOS_DL_LIST_ENTRY(listObject->pstNext, SortLinkList, sortLinkNode);
+ }
+
+ return needSchedule;
+}
+
+VOID OsSchedTaskEnQueue(LosTaskCB *taskCB)
+{
+ LOS_ASSERT(!(taskCB->taskStatus & OS_TASK_STATUS_READY));
+
+ if (taskCB->taskID != g_idleTaskID) {
+ if (taskCB->timeSlice > OS_TIME_SLICE_MIN) {
+ OsSchedPriQueueEnHead(&taskCB->pendList, taskCB->priority);
+ } else {
+ taskCB->timeSlice = OS_SCHED_TIME_SLICES;
+ OsSchedPriQueueEnTail(&taskCB->pendList, taskCB->priority);
+ }
+ OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, taskCB);
+ }
+
+ taskCB->taskStatus &= ~(OS_TASK_STATUS_PEND | OS_TASK_STATUS_SUSPEND |
+ OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND_TIME);
+
+ taskCB->taskStatus |= OS_TASK_STATUS_READY;
+}
+
+VOID OsSchedTaskDeQueue(LosTaskCB *taskCB)
+{
+ if (taskCB->taskStatus & OS_TASK_STATUS_READY) {
+ if (taskCB->taskID != g_idleTaskID) {
+ OsSchedPriQueueDelete(&taskCB->pendList, taskCB->priority);
+ }
+
+ taskCB->taskStatus &= ~OS_TASK_STATUS_READY;
+ }
+}
+
+VOID OsSchedTaskExit(LosTaskCB *taskCB)
+{
+ if (taskCB->taskStatus & OS_TASK_STATUS_READY) {
+ OsSchedTaskDeQueue(taskCB);
+ } else if (taskCB->taskStatus & OS_TASK_STATUS_PEND) {
+ LOS_ListDelete(&taskCB->pendList);
+ taskCB->taskStatus &= ~OS_TASK_STATUS_PEND;
+ }
+
+ if (taskCB->taskStatus & (OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND_TIME)) {
+ OsDeleteSortLink(&taskCB->sortList, OS_SORT_LINK_TASK);
+ taskCB->taskStatus &= ~(OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND_TIME);
+ }
+}
+
+VOID OsSchedYield(VOID)
+{
+ LosTaskCB *runTask = g_losTask.runTask;
+
+ runTask->timeSlice = 0;
+}
+
+VOID OsSchedDelay(LosTaskCB *runTask, UINT32 tick)
+{
+ runTask->taskStatus |= OS_TASK_STATUS_DELAY;
+ runTask->waitTimes = tick;
+}
+
+VOID OsSchedTaskWait(LOS_DL_LIST *list, UINT32 ticks)
+{
+ LosTaskCB *runTask = g_losTask.runTask;
+
+ runTask->taskStatus |= OS_TASK_STATUS_PEND;
+ LOS_ListTailInsert(list, &runTask->pendList);
+
+ if (ticks != LOS_WAIT_FOREVER) {
+ runTask->taskStatus |= OS_TASK_STATUS_PEND_TIME;
+ runTask->waitTimes = ticks;
+ }
+}
+
+VOID OsSchedTaskWake(LosTaskCB *resumedTask)
+{
+ LOS_ListDelete(&resumedTask->pendList);
+ resumedTask->taskStatus &= ~OS_TASK_STATUS_PEND;
+
+ if (resumedTask->taskStatus & OS_TASK_STATUS_PEND_TIME) {
+ OsDeleteSortLink(&resumedTask->sortList, OS_SORT_LINK_TASK);
+ resumedTask->taskStatus &= ~OS_TASK_STATUS_PEND_TIME;
+ }
+
+ if (!(resumedTask->taskStatus & OS_TASK_STATUS_SUSPEND)) {
+ OsSchedTaskEnQueue(resumedTask);
+ }
+}
+
+BOOL OsSchedModifyTaskSchedParam(LosTaskCB *taskCB, UINT16 priority)
+{
+ if (taskCB->taskStatus & OS_TASK_STATUS_READY) {
+ OsSchedTaskDeQueue(taskCB);
+ taskCB->priority = priority;
+ OsSchedTaskEnQueue(taskCB);
+ return TRUE;
+ }
+
+ taskCB->priority = priority;
+ OsHookCall(LOS_HOOK_TYPE_TASK_PRIMODIFY, taskCB, taskCB->priority);
+ if (taskCB->taskStatus & OS_TASK_STATUS_RUNNING) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+VOID OsSchedSetIdleTaskSchedPartam(LosTaskCB *idleTask)
+{
+ OsSchedTaskEnQueue(idleTask);
+}
+
+UINT32 OsSchedSwtmrScanRegister(SchedScan func)
+{
+ if (func == NULL) {
+ return LOS_NOK;
+ }
+
+ g_swtmrScan = func;
+ return LOS_OK;
+}
+
+UINT32 OsTaskNextSwitchTimeGet(VOID)
+{
+ UINT32 intSave = LOS_IntLock();
+ UINT32 ticks = OsSortLinkGetNextExpireTime(g_taskSortLinkList);
+ LOS_IntRestore(intSave);
+ return ticks;
+}
+
+UINT32 OsSchedInit(VOID)
+{
+ UINT16 pri;
+ for (pri = 0; pri < OS_PRIORITY_QUEUE_NUM; pri++) {
+ LOS_ListInit(&g_priQueueList[pri]);
+ }
+ g_queueBitmap = 0;
+
+ g_taskSortLinkList = OsGetSortLinkAttribute(OS_SORT_LINK_TASK);
+ if (g_taskSortLinkList == NULL) {
+ return LOS_NOK;
+ }
+
+ OsSortLinkInit(g_taskSortLinkList);
+ g_schedResponseTime = OS_SCHED_MAX_RESPONSE_TIME;
+
+ return LOS_OK;
+}
+
+LosTaskCB *OsGetTopTask(VOID)
+{
+ UINT32 priority;
+ LosTaskCB *newTask = NULL;
+ if (g_queueBitmap) {
+ priority = CLZ(g_queueBitmap);
+ newTask = LOS_DL_LIST_ENTRY(((LOS_DL_LIST *)&g_priQueueList[priority])->pstNext, LosTaskCB, pendList);
+ } else {
+ newTask = OS_TCB_FROM_TID(g_idleTaskID);
+ }
+
+ return newTask;
+}
+
+VOID OsSchedStart(VOID)
+{
+ (VOID)LOS_IntLock();
+ LosTaskCB *newTask = OsGetTopTask();
+
+ newTask->taskStatus |= OS_TASK_STATUS_RUNNING;
+ g_losTask.newTask = newTask;
+ g_losTask.runTask = g_losTask.newTask;
+
+ newTask->startTime = OsGetCurrSchedTimeCycle();
+ OsSchedTaskDeQueue(newTask);
+
+ g_schedResponseTime = OS_SCHED_MAX_RESPONSE_TIME;
+ g_schedResponseID = OS_INVALID;
+ OsSchedSetNextExpireTime(newTask->startTime, newTask->taskID, newTask->startTime + newTask->timeSlice);
+
+ PRINTK("Entering scheduler\n");
+ g_schedStartTime = OsGetCurrTimeCycle();
+ g_taskScheduled = 1;
+}
+
+BOOL OsSchedTaskSwitch(VOID)
+{
+ UINT64 endTime;
+ BOOL isTaskSwitch = FALSE;
+ LosTaskCB *runTask = g_losTask.runTask;
+ OsTimeSliceUpdate(runTask, OsGetCurrSchedTimeCycle());
+
+ if (runTask->taskStatus & (OS_TASK_STATUS_PEND_TIME | OS_TASK_STATUS_DELAY)) {
+ OsAdd2SortLink(&runTask->sortList, runTask->startTime, runTask->waitTimes, OS_SORT_LINK_TASK);
+ } else if (!(runTask->taskStatus & (OS_TASK_STATUS_PEND | OS_TASK_STATUS_SUSPEND | OS_TASK_STATUS_UNUSED))) {
+ OsSchedTaskEnQueue(runTask);
+ }
+
+ LosTaskCB *newTask = OsGetTopTask();
+ g_losTask.newTask = newTask;
+
+ if (runTask != newTask) {
+#if (LOSCFG_BASE_CORE_TSK_MONITOR == 1)
+ OsTaskSwitchCheck();
+#endif
+ runTask->taskStatus &= ~OS_TASK_STATUS_RUNNING;
+ newTask->taskStatus |= OS_TASK_STATUS_RUNNING;
+ newTask->startTime = runTask->startTime;
+ isTaskSwitch = TRUE;
+
+ OsHookCall(LOS_HOOK_TYPE_TASK_SWITCHEDIN);
+ }
+
+ OsSchedTaskDeQueue(newTask);
+
+ if (newTask->taskID != g_idleTaskID) {
+ endTime = newTask->startTime + newTask->timeSlice;
+ } else {
+ endTime = OS_SCHED_MAX_RESPONSE_TIME;
+ }
+ OsSchedSetNextExpireTime(newTask->startTime, newTask->taskID, endTime);
+
+ return isTaskSwitch;
+}
+
+VOID LOS_SchedTickHandler(VOID)
+{
+ UINT64 currTime;
+ BOOL needSched = FALSE;
+
+ UINT32 intSave = LOS_IntLock();
+
+ if (g_taskScheduled) {
+ if (g_schedResponseID == OS_INVALID) {
+ if (g_swtmrScan != NULL) {
+ needSched = g_swtmrScan();
+ }
+
+ needSched |= OsSchedScanTimerList();
+ }
+
+ g_schedResponseTime = OS_SCHED_MAX_RESPONSE_TIME;
+ if (needSched && LOS_CHECK_SCHEDULE) {
+ HalTaskSchedule();
+ } else {
+ currTime = OsGetCurrSchedTimeCycle();
+ OsTimeSliceUpdate(g_losTask.runTask, currTime);
+ OsSchedUpdateExpireTime(currTime);
+ }
+ } else {
+ OsSchedUpdateExpireTime(OsGetCurrSchedTimeCycle());
+ }
+
+ LOS_IntRestore(intSave);
+}
+
+VOID LOS_Schedule(VOID)
+{
+ if (g_taskScheduled && LOS_CHECK_SCHEDULE) {
+ HalTaskSchedule();
+ }
+}
+
+#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
+VOID OsSchedUpdateSleepTime(VOID)
+{
+ UINT64 nextResponseTime;
+ UINT64 currTime, realSleepTime;
+ UINT32 intSave;
+
+ if (g_schedSleepFlags == FALSE) {
+ return;
+ }
+
+ intSave = LOS_IntLock();
+ 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_schedSleepFlags = FALSE;
+ g_schedSleepTime = 0;
+ g_schedSleepCB.stop();
+ LOS_IntRestore(intSave);
+}
+
+VOID OsSchedToSleep(VOID)
+{
+ UINT32 intSave;
+ UINT64 sleepTime;
+
+ if (!g_schedSleepCB.ready) {
+ return;
+ }
+
+ 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();
+
+ 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) || (getTime == NULL)) {
+ return LOS_NOK;
+ }
+
+ g_schedSleepCB.init = init;
+ g_schedSleepCB.start = start;
+ g_schedSleepCB.stop = stop;
+ g_schedSleepCB.getTimeNs = getTime;
+
+ ret = g_schedSleepCB.init();
+ if (ret != LOS_OK) {
+ return ret;
+ }
+
+ g_schedSleepCB.ready = TRUE;
+ return LOS_OK;
+}
+#endif
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __cplusplus */
diff --git a/kernel/src/los_sem.c b/kernel/src/los_sem.c
old mode 100755
new mode 100644
index e33ee305..1323381d
--- a/kernel/src/los_sem.c
+++ b/kernel/src/los_sem.c
@@ -36,6 +36,7 @@
#include "los_hook.h"
#include "los_interrupt.h"
#include "los_memory.h"
+#include "los_sched.h"
#ifdef __cplusplus
#if __cplusplus
@@ -251,18 +252,19 @@ LITE_OS_SEC_TEXT UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout)
runningTask = (LosTaskCB *)g_losTask.runTask;
runningTask->taskSem = (VOID *)semPended;
- OsTaskWait(&semPended->semList, OS_TASK_STATUS_PEND, timeout);
+ OsSchedTaskWait(&semPended->semList, timeout);
LOS_IntRestore(intSave);
OsHookCall(LOS_HOOK_TYPE_SEM_PEND, semPended, runningTask);
LOS_Schedule();
+ intSave = LOS_IntLock();
if (runningTask->taskStatus & OS_TASK_STATUS_TIMEOUT) {
- intSave = LOS_IntLock();
runningTask->taskStatus &= (~OS_TASK_STATUS_TIMEOUT);
retErr = LOS_ERRNO_SEM_TIMEOUT;
goto ERROR_SEM_PEND;
}
+ LOS_IntRestore(intSave);
return LOS_OK;
ERROR_SEM_PEND:
@@ -301,7 +303,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SemPost(UINT32 semHandle)
if (!LOS_ListEmpty(&semPosted->semList)) {
resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(semPosted->semList)));
resumedTask->taskSem = NULL;
- OsTaskWake(resumedTask, OS_TASK_STATUS_PEND);
+ OsSchedTaskWake(resumedTask);
LOS_IntRestore(intSave);
OsHookCall(LOS_HOOK_TYPE_SEM_POST, semPosted, resumedTask);
diff --git a/kernel/src/los_sortlink.c b/kernel/src/los_sortlink.c
new file mode 100644
index 00000000..c93b9afe
--- /dev/null
+++ b/kernel/src/los_sortlink.c
@@ -0,0 +1,211 @@
+/*
+ * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
+ * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "los_sortlink.h"
+#include "los_sched.h"
+#include "los_debug.h"
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif
+#endif /* __cplusplus */
+
+STATIC SortLinkAttribute g_taskSortLink;
+STATIC SortLinkAttribute g_swtmrSortLink;
+
+UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader)
+{
+ LOS_ListInit(&sortLinkHeader->sortLink);
+ return LOS_OK;
+}
+
+STATIC INLINE VOID OsAddNode2SortLink(SortLinkAttribute *sortLinkHeader, SortLinkList *sortList)
+{
+ LOS_DL_LIST *head = (LOS_DL_LIST *)&sortLinkHeader->sortLink;
+
+ if (LOS_ListEmpty(head)) {
+ LOS_ListAdd(head, &sortList->sortLinkNode);
+ return;
+ }
+
+ SortLinkList *listSorted = LOS_DL_LIST_ENTRY(head->pstNext, SortLinkList, sortLinkNode);
+ if (listSorted->responseTime >= sortList->responseTime) {
+ LOS_ListAdd(head, &sortList->sortLinkNode);
+ return;
+ }
+
+ LOS_DL_LIST *prevNode = head->pstPrev;
+ do {
+ listSorted = LOS_DL_LIST_ENTRY(prevNode, SortLinkList, sortLinkNode);
+ if (listSorted->responseTime <= sortList->responseTime) {
+ LOS_ListAdd(prevNode, &sortList->sortLinkNode);
+ break;
+ }
+
+ prevNode = prevNode->pstPrev;
+ } while (1);
+}
+
+VOID OsDeleteNodeSortLink(SortLinkAttribute *sortLinkHeader, SortLinkList *sortList)
+{
+ LOS_ListDelete(&sortList->sortLinkNode);
+ SET_SORTLIST_VALUE(sortList, OS_SORT_LINK_INVALID_TIME);
+}
+
+STATIC INLINE UINT64 OsGetSortLinkNextExpireTime(SortLinkAttribute *sortHeader, UINT64 startTime)
+{
+ UINT64 expirTime = 0;
+ UINT64 nextExpirTime = 0;
+ LOS_DL_LIST *head = &sortHeader->sortLink;
+ LOS_DL_LIST *list = head->pstNext;
+
+ if (LOS_ListEmpty(head)) {
+ return (UINT64)-1;
+ }
+
+ do {
+ SortLinkList *listSorted = LOS_DL_LIST_ENTRY(list, SortLinkList, sortLinkNode);
+ if (listSorted->responseTime <= startTime) {
+ expirTime = startTime;
+ list = list->pstNext;
+ } else {
+ nextExpirTime = listSorted->responseTime;
+ break;
+ }
+ } while (list != head);
+
+ if (expirTime == 0) {
+ return nextExpirTime;
+ }
+
+ if (nextExpirTime == 0) {
+ return expirTime;
+ }
+
+ if ((nextExpirTime - expirTime) <= OS_US_PER_TICK) {
+ return nextExpirTime;
+ }
+
+ return expirTime;
+}
+
+VOID OsAdd2SortLink(SortLinkList *node, UINT64 startTime, UINT32 waitTicks, SortLinkType type)
+{
+ UINT32 intSave;
+ SortLinkAttribute *sortLinkHeader = NULL;
+
+ if (type == OS_SORT_LINK_TASK) {
+ sortLinkHeader = &g_taskSortLink;
+ } else if (type == OS_SORT_LINK_SWTMR) {
+ sortLinkHeader = &g_swtmrSortLink;
+ } else {
+ LOS_Panic("Sort link type error : %u\n", type);
+ }
+
+ intSave = LOS_IntLock();
+ SET_SORTLIST_VALUE(node, startTime + (UINT64)waitTicks * OS_CYCLE_PER_TICK);
+ OsAddNode2SortLink(sortLinkHeader, node);
+ LOS_IntRestore(intSave);
+}
+
+VOID OsDeleteSortLink(SortLinkList *node, SortLinkType type)
+{
+ UINT32 intSave;
+ SortLinkAttribute *sortLinkHeader = NULL;
+
+ if (type == OS_SORT_LINK_TASK) {
+ sortLinkHeader = &g_taskSortLink;
+ } else if (type == OS_SORT_LINK_SWTMR) {
+ sortLinkHeader = &g_swtmrSortLink;
+ } else {
+ LOS_Panic("Sort link type error : %u\n", type);
+ }
+
+ intSave = LOS_IntLock();
+ if (node->responseTime != OS_SORT_LINK_INVALID_TIME) {
+ OsDeleteNodeSortLink(sortLinkHeader, node);
+ }
+ LOS_IntRestore(intSave);
+}
+
+SortLinkAttribute *OsGetSortLinkAttribute(SortLinkType type)
+{
+ if (type == OS_SORT_LINK_TASK) {
+ return &g_taskSortLink;
+ } else if (type == OS_SORT_LINK_SWTMR) {
+ return &g_swtmrSortLink;
+ }
+
+ PRINT_ERR("Invalid sort link type!\n");
+ return NULL;
+}
+
+UINT64 OsGetNextExpireTime(UINT64 startTime)
+{
+ UINT32 intSave;
+ SortLinkAttribute *taskHeader = &g_taskSortLink;
+ SortLinkAttribute *swtmrHeader = &g_swtmrSortLink;
+
+ intSave = LOS_IntLock();
+ UINT64 taskExpirTime = OsGetSortLinkNextExpireTime(taskHeader, startTime);
+ UINT64 swtmrExpirTime = OsGetSortLinkNextExpireTime(swtmrHeader, startTime);
+ LOS_IntRestore(intSave);
+
+ return (taskExpirTime < swtmrExpirTime) ? taskExpirTime : swtmrExpirTime;
+}
+
+UINT32 OsSortLinkGetTargetExpireTime(UINT64 currTime, const SortLinkList *targetSortList)
+{
+ if (currTime >= targetSortList->responseTime) {
+ return 0;
+ }
+
+ return (UINT32)(((targetSortList->responseTime - currTime) * LOSCFG_BASE_CORE_TICK_PER_SECOND) / OS_SYS_CLOCK);
+}
+
+UINT32 OsSortLinkGetNextExpireTime(const SortLinkAttribute *sortLinkHeader)
+{
+ LOS_DL_LIST *head = (LOS_DL_LIST *)&sortLinkHeader->sortLink;
+
+ if (LOS_ListEmpty(head)) {
+ return 0;
+ }
+
+ SortLinkList *listSorted = LOS_DL_LIST_ENTRY(head->pstNext, SortLinkList, sortLinkNode);
+ return OsSortLinkGetTargetExpireTime(OsGetCurrSchedTimeCycle(), listSorted);
+}
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif
+#endif /* __cplusplus */
diff --git a/kernel/src/los_swtmr.c b/kernel/src/los_swtmr.c
index 1d02a048..f33c6205 100644
--- a/kernel/src/los_swtmr.c
+++ b/kernel/src/los_swtmr.c
@@ -36,6 +36,7 @@
#include "los_memory.h"
#include "los_queue.h"
#include "los_debug.h"
+#include "los_sched.h"
#ifdef __cplusplus
#if __cplusplus
@@ -45,10 +46,10 @@ extern "C" {
#if (LOSCFG_BASE_CORE_SWTMR == 1)
-LITE_OS_SEC_BSS UINT32 g_swtmrHandlerQueue; /* Software Timer timeout queue ID */
-LITE_OS_SEC_BSS SWTMR_CTRL_S *g_swtmrCBArray = NULL; /* first address in Timer memory space */
-LITE_OS_SEC_BSS SWTMR_CTRL_S *g_swtmrFreeList = NULL; /* Free list of Softwaer Timer */
-LITE_OS_SEC_BSS SWTMR_CTRL_S *g_swtmrSortList = NULL; /* The software timer count list */
+LITE_OS_SEC_BSS UINT32 g_swtmrHandlerQueue; /* Software Timer timeout queue ID */
+LITE_OS_SEC_BSS SWTMR_CTRL_S *g_swtmrCBArray = NULL; /* first address in Timer memory space */
+LITE_OS_SEC_BSS SWTMR_CTRL_S *g_swtmrFreeList = NULL; /* Free list of Softwaer Timer */
+LITE_OS_SEC_BSS SortLinkAttribute *g_swtmrSortLinkList = NULL; /* The software timer count list */
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
typedef struct SwtmrAlignDataStr {
@@ -59,9 +60,6 @@ typedef struct SwtmrAlignDataStr {
UINT32 isAligned : 1;
} SwtmrAlignData;
LITE_OS_SEC_BSS SwtmrAlignData g_swtmrAlignID[LOSCFG_BASE_CORE_SWTMR_LIMIT] = {0}; /* store swtmr align */
-static UINT32 g_swtimerRousesTime = 0; /* suspend time */
-static SWTMR_CTRL_S *g_swtmrRouses = NULL; /* first swtmr that can wake up */
-static SWTMR_CTRL_S *g_swtmrRousesPrev = NULL;
#endif
#define SWTMR_MAX_RUNNING_TICKS 2
@@ -125,103 +123,48 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrTaskCreate(VOID)
return ret;
}
-/*****************************************************************************
-Function : OsSwtmrInit
-Description : Initializes Software Timer
-Input : None
-Output : None
-Return : LOS_OK on success or error code on failure
-*****************************************************************************/
-LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrInit(VOID)
-{
- UINT32 size;
- UINT16 index;
- UINT32 ret;
- SWTMR_CTRL_S *swtmr = NULL;
- SWTMR_CTRL_S *temp = NULL;
-
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
- // Ignore the return code when matching CSEC rule 6.6(1).
- (VOID)memset_s((VOID *)g_swtmrAlignID, sizeof(SwtmrAlignData) * LOSCFG_BASE_CORE_SWTMR_LIMIT,
- 0, sizeof(SwtmrAlignData) * LOSCFG_BASE_CORE_SWTMR_LIMIT);
-#endif
-
- g_swtmrSortList = (SWTMR_CTRL_S *)NULL;
- size = sizeof(SWTMR_CTRL_S) * LOSCFG_BASE_CORE_SWTMR_LIMIT;
- swtmr = (SWTMR_CTRL_S *)LOS_MemAlloc(m_aucSysMem0, size);
- if (swtmr == NULL) {
- return LOS_ERRNO_SWTMR_NO_MEMORY;
- }
- // Ignore the return code when matching CSEC rule 6.6(3).
- (VOID)memset_s((VOID *)swtmr, size, 0, size);
- g_swtmrCBArray = swtmr;
- g_swtmrFreeList = swtmr;
- swtmr->usTimerID = 0;
- temp = swtmr;
- swtmr++;
- for (index = 1; index < LOSCFG_BASE_CORE_SWTMR_LIMIT; index++, swtmr++) {
- swtmr->usTimerID = index;
- temp->pstNext = swtmr;
- temp = swtmr;
- }
-
- ret = LOS_QueueCreate((CHAR *)NULL, OS_SWTMR_HANDLE_QUEUE_SIZE,
- &g_swtmrHandlerQueue, 0, sizeof(SwtmrHandlerItem));
- if (ret != LOS_OK) {
- (VOID)LOS_MemFree(m_aucSysMem0, swtmr);
- return LOS_ERRNO_SWTMR_QUEUE_CREATE_FAILED;
- }
-
- ret = OsSwtmrTaskCreate();
- if (ret != LOS_OK) {
- (VOID)LOS_MemFree(m_aucSysMem0, swtmr);
- return LOS_ERRNO_SWTMR_TASK_CREATE_FAILED;
- }
-
- return LOS_OK;
-}
-
-#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
-STATIC_INLINE UINT32 OsSwtmrCalcAlignCount(UINT32 interval, UINT32 timerId)
+STATIC_INLINE UINT32 OsSwtmrCalcAlignCount(UINT64 currTime, UINT32 interval, UINT32 timerId)
{
- SWTMR_CTRL_S *cur = g_swtmrSortList;
- UINT32 count = 0;
+ UINT32 count;
+
if (interval == 0) {
return interval;
}
- while (cur != NULL) {
- count += cur->uwCount;
- if (cur->usTimerID == timerId) {
- return (interval - (cur->uwInterval - count) % interval);
- }
- cur = cur->pstNext;
- }
- return interval;
+ SWTMR_CTRL_S *cur = g_swtmrCBArray + timerId % LOSCFG_BASE_CORE_SWTMR_LIMIT;
+ count = OsSortLinkGetTargetExpireTime(currTime, &cur->stSortList);
+ return (interval - (cur->uwInterval - count) % interval);
}
-LITE_OS_SEC_TEXT SWTMR_CTRL_S* OsSwtmrFindAlignPos(SWTMR_CTRL_S *swtmr)
+VOID OsSwtmrFindAlignPos(UINT64 currTime, SWTMR_CTRL_S *swtmr)
{
- SWTMR_CTRL_S *intPos = (SWTMR_CTRL_S *)NULL;
- SWTMR_CTRL_S *cur = (SWTMR_CTRL_S *)NULL;
SWTMR_CTRL_S *minInLarge = (SWTMR_CTRL_S *)NULL;
SWTMR_CTRL_S *maxInLitte = (SWTMR_CTRL_S *)NULL;
UINT32 currSwtmrTimes, swtmrTimes;
- SwtmrAlignData swtmrAlgInfo, currSwtmrAlgInfo;
UINT32 minInLargeVal = OS_NULL_INT;
UINT32 maxInLitteval = OS_NULL_INT;
- currSwtmrAlgInfo = g_swtmrAlignID[swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT];
+ LOS_DL_LIST *listHead = &g_swtmrSortLinkList->sortLink;
+ if (LOS_ListEmpty(listHead)) {
+ return;
+ }
+
+ SwtmrAlignData currSwtmrAlgInfo = g_swtmrAlignID[swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT];
currSwtmrTimes = currSwtmrAlgInfo.times;
- cur = g_swtmrSortList;
- while (cur != NULL) {
- swtmrAlgInfo = g_swtmrAlignID[cur->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT];
- if ((swtmrAlgInfo.isAligned == 0) || (swtmrAlgInfo.canAlign == 0)) { // swtmr not start
+ LOS_DL_LIST *listObject = listHead->pstNext;
+
+ do {
+ SortLinkList *sortList = LOS_DL_LIST_ENTRY(listObject, SortLinkList, sortLinkNode);
+ SWTMR_CTRL_S *cur = LOS_DL_LIST_ENTRY(sortList, SWTMR_CTRL_S, stSortList);
+ SwtmrAlignData swtmrAlgInfo = g_swtmrAlignID[cur->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT];
+ /* swtmr not start */
+ if ((swtmrAlgInfo.isAligned == 0) || (swtmrAlgInfo.canAlign == 0)) {
goto CONTINUE_NEXT_NODE;
}
- // find same interval timer, directly return
+ /* find same interval timer, directly return */
if (cur->uwInterval == swtmr->uwInterval) {
swtmr->uwCount = 0;
- return cur;
+ return;
}
if ((currSwtmrAlgInfo.canMultiple != 1) || (swtmrAlgInfo.times == 0)) {
@@ -229,7 +172,7 @@ LITE_OS_SEC_TEXT SWTMR_CTRL_S* OsSwtmrFindAlignPos(SWTMR_CTRL_S *swtmr)
}
swtmrTimes = swtmrAlgInfo.times;
if (currSwtmrTimes == 0) {
- return NULL;
+ return;
}
if ((swtmrTimes >= currSwtmrTimes) && ((swtmrTimes % currSwtmrTimes) == 0)) {
if (minInLargeVal > (swtmrTimes / currSwtmrTimes)) {
@@ -242,17 +185,17 @@ LITE_OS_SEC_TEXT SWTMR_CTRL_S* OsSwtmrFindAlignPos(SWTMR_CTRL_S *swtmr)
maxInLitte = cur;
}
}
- CONTINUE_NEXT_NODE:
+CONTINUE_NEXT_NODE:
+ listObject = listObject->pstNext;
+ } while (listObject != listHead);
- cur = cur->pstNext;
- }
if (minInLarge != NULL) {
- swtmr->uwCount = OsSwtmrCalcAlignCount(swtmr->uwInterval, minInLarge->usTimerID);
+ swtmr->uwCount = OsSwtmrCalcAlignCount(currTime, swtmr->uwInterval, minInLarge->usTimerID);
} else if (maxInLitte != NULL) {
- swtmr->uwCount = 0;
- intPos = maxInLitte;
+ swtmr->uwCount = OsSortLinkGetTargetExpireTime(currTime, &maxInLitte->stSortList);
}
- return intPos;
+
+ return;
}
#endif
@@ -265,38 +208,22 @@ Return : None
*****************************************************************************/
LITE_OS_SEC_TEXT VOID OsSwtmrStart(SWTMR_CTRL_S *swtmr)
{
- SWTMR_CTRL_S *prev = (SWTMR_CTRL_S *)NULL;
- SWTMR_CTRL_S *cur = (SWTMR_CTRL_S *)NULL;
+ UINT64 currTime = OsGetCurrSchedTimeCycle();
swtmr->uwCount = swtmr->uwInterval;
+ swtmr->ucState = OS_SWTMR_STATUS_TICKING;
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
if ((g_swtmrAlignID[swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT].canAlign == 1) &&
(g_swtmrAlignID[swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT].isAligned == 0)) {
g_swtmrAlignID[swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT].isAligned = 1;
- prev = OsSwtmrFindAlignPos(swtmr);
+ OsSwtmrFindAlignPos(currTime, swtmr);
}
#endif
-
- if (prev == NULL) {
- cur = g_swtmrSortList;
- while (cur != NULL) {
- if (cur->uwCount > swtmr->uwCount) {
- break;
- }
-
- swtmr->uwCount -= cur->uwCount;
- prev = cur;
- cur = cur->pstNext;
- }
+ OsAdd2SortLink(&swtmr->stSortList, currTime, swtmr->uwCount, OS_SORT_LINK_SWTMR);
+ if (LOS_TaskIsRunning()) {
+ OsSchedUpdateExpireTime(currTime);
}
-
- swtmr->pstNext = ((prev == NULL) ? g_swtmrSortList : prev->pstNext);
- if (swtmr->pstNext != NULL) {
- swtmr->pstNext->uwCount -= swtmr->uwCount;
- }
- (prev == NULL) ? (g_swtmrSortList = swtmr) : (prev->pstNext = swtmr);
- swtmr->ucState = OS_SWTMR_STATUS_TICKING;
}
/*****************************************************************************
@@ -320,93 +247,67 @@ STATIC_INLINE VOID OsSwtmrDelete(SWTMR_CTRL_S *swtmr)
}
-LITE_OS_SEC_TEXT VOID OsSwtmrStop(const SWTMR_CTRL_S *swtmr)
+LITE_OS_SEC_TEXT VOID OsSwtmrStop(SWTMR_CTRL_S *swtmr)
{
- SWTMR_CTRL_S *prev = (SWTMR_CTRL_S *)NULL;
- SWTMR_CTRL_S *cur = (SWTMR_CTRL_S *)NULL;
-
- if (!g_swtmrSortList) {
- return;
- }
-
- cur = g_swtmrSortList;
-
- while (cur != swtmr) {
- prev = cur;
- cur = cur->pstNext;
- }
- if (cur == NULL) {
- return;
- }
- if (cur->pstNext != NULL) {
- cur->pstNext->uwCount += cur->uwCount;
- }
-
- if (prev == NULL) {
- g_swtmrSortList = cur->pstNext;
- } else {
- prev->pstNext = cur->pstNext;
- }
-
- cur->pstNext = (SWTMR_CTRL_S *)NULL;
- cur->ucState = OS_SWTMR_STATUS_CREATED;
+ OsDeleteSortLink(&swtmr->stSortList, OS_SORT_LINK_SWTMR);
+ swtmr->ucState = OS_SWTMR_STATUS_CREATED;
+ if (LOS_TaskIsRunning()) {
+ OsSchedUpdateExpireTime(OsGetCurrSchedTimeCycle());
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
- g_swtmrAlignID[swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT].isAligned = 0;
+ g_swtmrAlignID[swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT].isAligned = 0;
#endif
+ }
}
-/*****************************************************************************
-Function : OsSwtmrTimeoutHandle
-Description : Software Timer time out handler
-Input : None
-Output : None
-Return : None
-*****************************************************************************/
-LITE_OS_SEC_TEXT static VOID OsSwtmrTimeoutHandle(VOID)
+STATIC VOID OsSwtmrTimeoutHandle(SWTMR_CTRL_S *swtmr)
{
- SWTMR_CTRL_S *swtmr = g_swtmrSortList;
SwtmrHandlerItem swtmrHandler;
- while ((swtmr != NULL) && (swtmr->uwCount == 0)) {
- g_swtmrSortList = swtmr->pstNext;
- swtmrHandler.handler = swtmr->pfnHandler;
- swtmrHandler.arg = swtmr->uwArg;
- (VOID)LOS_QueueWriteCopy(g_swtmrHandlerQueue, &swtmrHandler, sizeof(SwtmrHandlerItem), LOS_NO_WAIT);
- if (swtmr->ucMode == LOS_SWTMR_MODE_ONCE) {
- OsSwtmrDelete(swtmr);
- if (swtmr->usTimerID < (OS_SWTMR_MAX_TIMERID - LOSCFG_BASE_CORE_SWTMR_LIMIT)) {
- swtmr->usTimerID += LOSCFG_BASE_CORE_SWTMR_LIMIT;
- } else {
- swtmr->usTimerID %= LOSCFG_BASE_CORE_SWTMR_LIMIT;
- }
- } else if (swtmr->ucMode == LOS_SWTMR_MODE_PERIOD) {
- OsSwtmrStart(swtmr);
- } else if (swtmr->ucMode == LOS_SWTMR_MODE_NO_SELFDELETE) {
- swtmr->ucState = OS_SWTMR_STATUS_CREATED;
- }
+ swtmrHandler.handler = swtmr->pfnHandler;
+ swtmrHandler.arg = swtmr->uwArg;
- swtmr = g_swtmrSortList;
+ (VOID)LOS_QueueWriteCopy(g_swtmrHandlerQueue, &swtmrHandler, sizeof(SwtmrHandlerItem), LOS_NO_WAIT);
+ if (swtmr->ucMode == LOS_SWTMR_MODE_ONCE) {
+ OsSwtmrDelete(swtmr);
+ if (swtmr->usTimerID < (OS_SWTMR_MAX_TIMERID - LOSCFG_BASE_CORE_SWTMR_LIMIT)) {
+ swtmr->usTimerID += LOSCFG_BASE_CORE_SWTMR_LIMIT;
+ } else {
+ swtmr->usTimerID %= LOSCFG_BASE_CORE_SWTMR_LIMIT;
+ }
+ } else if (swtmr->ucMode == LOS_SWTMR_MODE_PERIOD) {
+ OsSwtmrStart(swtmr);
+ } else if (swtmr->ucMode == LOS_SWTMR_MODE_NO_SELFDELETE) {
+ swtmr->ucState = OS_SWTMR_STATUS_CREATED;
}
}
-/*****************************************************************************
-Function : OsSwtmrScan
-Description : Tick interrupt interface module of Software Timer
-Input : None
-Output : None
-Return : LOS_OK on success
-*****************************************************************************/
-LITE_OS_SEC_TEXT UINT32 OsSwtmrScan(VOID)
+STATIC BOOL OsSwtmrScan(VOID)
{
- UINTPTR intSave = LOS_IntLock();
- if (g_swtmrSortList != NULL) {
- if (--(g_swtmrSortList->uwCount) == 0) {
- OsSwtmrTimeoutHandle();
- }
+ BOOL needSchedule = FALSE;
+ LOS_DL_LIST *listObject = &g_swtmrSortLinkList->sortLink;
+
+ if (LOS_ListEmpty(listObject)) {
+ return needSchedule;
}
- LOS_IntRestore(intSave);
- return LOS_OK;
+
+ SortLinkList *sortList = LOS_DL_LIST_ENTRY(listObject->pstNext, SortLinkList, sortLinkNode);
+ UINT64 currTime = OsGetCurrSchedTimeCycle();
+ while (sortList->responseTime <= currTime) {
+ OsDeleteNodeSortLink(g_swtmrSortLinkList, sortList);
+
+ SWTMR_CTRL_S *swtmr = LOS_DL_LIST_ENTRY(sortList, SWTMR_CTRL_S, stSortList);
+ OsSwtmrTimeoutHandle(swtmr);
+
+ needSchedule = TRUE;
+ if (LOS_ListEmpty(listObject)) {
+ break;
+ }
+
+ sortList = LOS_DL_LIST_ENTRY(listObject->pstNext, SortLinkList, sortLinkNode);
+ }
+
+ return needSchedule;
}
/*****************************************************************************
@@ -416,174 +317,88 @@ Input : None
Output : None
Return : Count of the Timer list
*****************************************************************************/
-#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
-LITE_OS_SEC_TEXT UINT32 OsSwtmrGetNextTimeout(VOID)
-{
- SWTMR_CTRL_S *cur = NULL;
- UINT32 tmpTime = 0;
- UINT32 sleepTime = OS_NULL_INT;
- UINTPTR intSave = LOS_IntLock();
- cur = g_swtmrSortList;
-
- // find first timer can wakeup the system
- while (cur != NULL) {
- if (cur->ucRouses == OS_SWTMR_ROUSES_ALLOW) {
- g_swtmrRouses = cur;
- break;
- }
-
- tmpTime += cur->uwCount;
- g_swtmrRousesPrev = cur;
- cur = cur->pstNext;
- }
-
- if (cur != NULL) {
- sleepTime = cur->uwCount + tmpTime;
- g_swtimerRousesTime = sleepTime;
- }
- LOS_IntRestore(intSave);
- return sleepTime;
-}
-#else
LITE_OS_SEC_TEXT UINT32 OsSwtmrGetNextTimeout(VOID)
{
UINTPTR intSave = LOS_IntLock();
- if (g_swtmrSortList == NULL) {
- LOS_IntRestore(intSave);
- return OS_NULL_INT;
- }
- UINT32 tmp = g_swtmrSortList->uwCount;
+ UINT32 ticks = OsSortLinkGetNextExpireTime(g_swtmrSortLinkList);
LOS_IntRestore(intSave);
- return tmp;
+ return ticks;
}
-#endif
-
-/*****************************************************************************
-Function : OsSwtimerInsert
-Description : Insert a list of swtmr
-Input : **head, *swtmr
-Output : **head, *swtmr
-Return : None
-*****************************************************************************/
-#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
-VOID OsSwtimerInsert(SWTMR_CTRL_S **head, SWTMR_CTRL_S *swtmr)
-{
- SWTMR_CTRL_S *prev = NULL;
- SWTMR_CTRL_S *nextTmp = swtmr->pstNext;
- SWTMR_CTRL_S *cur = *head;
-
- while (swtmr != NULL) {
- while (cur != NULL) {
- if (cur->uwCount > swtmr->uwCount) {
- break;
- }
-
- swtmr->uwCount -= cur->uwCount;
- prev = cur;
- cur = cur->pstNext;
- }
- swtmr->pstNext = cur;
-
- if (cur != NULL) {
- cur->uwCount -= swtmr->uwCount;
- }
- if (prev == NULL) {
- *head = swtmr;
- } else {
- prev->pstNext = swtmr;
- }
-
- prev = swtmr;
- swtmr = nextTmp;
- nextTmp = nextTmp->pstNext;
- }
-
- return;
-}
-#endif
-/*****************************************************************************
-Function : OsSwtmrAdjust
-Description : Adjust Software Timer list
-Input : sleepTime
-Output : None
-Return : None
-*****************************************************************************/
-#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
-LITE_OS_SEC_TEXT VOID OsSwtmrAdjust(UINT32 sleepTime)
-{
- SWTMR_CTRL_S *cur = NULL;
- UINTPTR intSave = LOS_IntLock();
- if (g_swtmrRouses == NULL) {
- LOS_IntRestore(intSave);
- return;
- }
-
- if (sleepTime > g_swtimerRousesTime) {
- sleepTime = g_swtimerRousesTime;
- }
-
- if (sleepTime <= g_swtmrRouses->uwCount) {
- g_swtmrRouses->uwCount -= sleepTime;
- } else {
- g_swtmrRouses->uwCount = g_swtimerRousesTime - sleepTime;
-
- if (g_swtmrRousesPrev != NULL) {
- g_swtmrRousesPrev->pstNext = NULL;
- cur = g_swtmrSortList;
- OsSwtimerInsert(&g_swtmrRouses, cur);
- g_swtmrSortList = g_swtmrRouses;
- }
- }
- if (g_swtmrSortList->uwCount == 0) {
- OsSwtmrTimeoutHandle();
- }
-
- g_swtmrRouses = NULL;
- g_swtmrRousesPrev = NULL;
- LOS_IntRestore(intSave);
-}
-#else
-LITE_OS_SEC_TEXT VOID OsSwtmrAdjust(UINT32 sleepTime)
-{
- UINT32 tmpSleepTime = sleepTime;
- UINTPTR intSave = LOS_IntLock();
- if (g_swtmrSortList == NULL) {
- LOS_IntRestore(intSave);
- return;
- }
-
- if (tmpSleepTime > g_swtmrSortList->uwCount) {
- tmpSleepTime = g_swtmrSortList->uwCount;
- }
-
- g_swtmrSortList->uwCount -= tmpSleepTime;
-
- if (g_swtmrSortList->uwCount == 0) {
- OsSwtmrTimeoutHandle();
- }
- LOS_IntRestore(intSave);
-}
-#endif
LITE_OS_SEC_TEXT UINT32 OsSwtmrTimeGet(const SWTMR_CTRL_S *swtmr)
{
- SWTMR_CTRL_S *cur = (SWTMR_CTRL_S *)NULL;
- UINT32 tick = 0;
+ return OsSortLinkGetTargetExpireTime(OsGetCurrSchedTimeCycle(), &swtmr->stSortList);
+}
- cur = g_swtmrSortList;
- while (1) {
- if (cur == NULL) {
- break;
- }
- tick += cur->uwCount;
- if (cur == swtmr) {
- break;
- }
+/*****************************************************************************
+Function : OsSwtmrInit
+Description : Initializes Software Timer
+Input : None
+Output : None
+Return : LOS_OK on success or error code on failure
+*****************************************************************************/
+LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrInit(VOID)
+{
+ UINT32 size;
+ UINT16 index;
+ UINT32 ret;
- cur = cur->pstNext;
+#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
+ // Ignore the return code when matching CSEC rule 6.6(1).
+ (VOID)memset_s((VOID *)g_swtmrAlignID, sizeof(SwtmrAlignData) * LOSCFG_BASE_CORE_SWTMR_LIMIT,
+ 0, sizeof(SwtmrAlignData) * LOSCFG_BASE_CORE_SWTMR_LIMIT);
+#endif
+
+ size = sizeof(SWTMR_CTRL_S) * LOSCFG_BASE_CORE_SWTMR_LIMIT;
+ SWTMR_CTRL_S *swtmr = (SWTMR_CTRL_S *)LOS_MemAlloc(m_aucSysMem0, size);
+ if (swtmr == NULL) {
+ return LOS_ERRNO_SWTMR_NO_MEMORY;
+ }
+ // Ignore the return code when matching CSEC rule 6.6(3).
+ (VOID)memset_s((VOID *)swtmr, size, 0, size);
+ g_swtmrCBArray = swtmr;
+ g_swtmrFreeList = swtmr;
+ swtmr->usTimerID = 0;
+ SWTMR_CTRL_S *temp = swtmr;
+ swtmr++;
+ for (index = 1; index < LOSCFG_BASE_CORE_SWTMR_LIMIT; index++, swtmr++) {
+ swtmr->usTimerID = index;
+ temp->pstNext = swtmr;
+ temp = swtmr;
}
- return tick;
+ ret = LOS_QueueCreate((CHAR *)NULL, OS_SWTMR_HANDLE_QUEUE_SIZE,
+ &g_swtmrHandlerQueue, 0, sizeof(SwtmrHandlerItem));
+ if (ret != LOS_OK) {
+ (VOID)LOS_MemFree(m_aucSysMem0, swtmr);
+ return LOS_ERRNO_SWTMR_QUEUE_CREATE_FAILED;
+ }
+
+ ret = OsSwtmrTaskCreate();
+ if (ret != LOS_OK) {
+ (VOID)LOS_MemFree(m_aucSysMem0, swtmr);
+ return LOS_ERRNO_SWTMR_TASK_CREATE_FAILED;
+ }
+
+ g_swtmrSortLinkList = OsGetSortLinkAttribute(OS_SORT_LINK_SWTMR);
+ if (g_swtmrSortLinkList == NULL) {
+ (VOID)LOS_MemFree(m_aucSysMem0, swtmr);
+ return LOS_NOK;
+ }
+
+ ret = OsSortLinkInit(g_swtmrSortLinkList);
+ if (ret != LOS_OK) {
+ (VOID)LOS_MemFree(m_aucSysMem0, swtmr);
+ return LOS_NOK;
+ }
+
+ ret = OsSchedSwtmrScanRegister((SchedScan)OsSwtmrScan);
+ if (ret != LOS_OK) {
+ (VOID)LOS_MemFree(m_aucSysMem0, swtmr);
+ return LOS_NOK;
+ }
+
+ return LOS_OK;
}
/*****************************************************************************
@@ -664,6 +479,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_SwtmrCreate(UINT32 interval,
#endif
swtmr->ucState = OS_SWTMR_STATUS_CREATED;
*swtmrId = swtmr->usTimerID;
+ SET_SORTLIST_VALUE(&swtmr->stSortList, OS_SORT_LINK_INVALID_TIME);
return LOS_OK;
}
@@ -677,21 +493,15 @@ Return : LOS_OK on success or error code on failure
*****************************************************************************/
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStart(UINT32 swtmrId)
{
- SWTMR_CTRL_S *swtmr = NULL;
UINTPTR intSave;
-#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
- UINT32 times;
- UINT32 swtmrAlignIdIndex = 0;
-#endif
UINT32 ret = LOS_OK;
- UINT16 swtmrCbId;
if (swtmrId >= OS_SWTMR_MAX_TIMERID) {
return LOS_ERRNO_SWTMR_ID_INVALID;
}
+
intSave = LOS_IntLock();
- swtmrCbId = swtmrId % LOSCFG_BASE_CORE_SWTMR_LIMIT;
- swtmr = g_swtmrCBArray + swtmrCbId;
+ SWTMR_CTRL_S *swtmr = g_swtmrCBArray + swtmrId % LOSCFG_BASE_CORE_SWTMR_LIMIT;
if (swtmr->usTimerID != swtmrId) {
LOS_IntRestore(intSave);
return LOS_ERRNO_SWTMR_ID_INVALID;
@@ -699,12 +509,11 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStart(UINT32 swtmrId)
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
if ((swtmr->ucSensitive == OS_SWTMR_ALIGN_INSENSITIVE) && (swtmr->ucMode == LOS_SWTMR_MODE_PERIOD)) {
- swtmrAlignIdIndex = swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT;
+ UINT32 swtmrAlignIdIndex = swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT;
g_swtmrAlignID[swtmrAlignIdIndex].canAlign = 1;
if ((swtmr->uwInterval % LOS_COMMON_DIVISOR) == 0) {
g_swtmrAlignID[swtmrAlignIdIndex].canMultiple = 1;
- times = swtmr->uwInterval / (LOS_COMMON_DIVISOR);
- g_swtmrAlignID[swtmrAlignIdIndex].times = times;
+ g_swtmrAlignID[swtmrAlignIdIndex].times = swtmr->uwInterval / LOS_COMMON_DIVISOR;
}
}
#endif
diff --git a/kernel/src/los_task.c b/kernel/src/los_task.c
old mode 100755
new mode 100644
index bbc4146c..459c2c99
--- a/kernel/src/los_task.c
+++ b/kernel/src/los_task.c
@@ -37,6 +37,7 @@
#include "los_interrupt.h"
#include "los_memory.h"
#include "los_mpu.h"
+#include "los_sched.h"
#include "los_mux.h"
#include "los_sem.h"
#include "los_timer.h"
@@ -74,11 +75,9 @@ extern "C" {
((NUMBER) = ((NUMBER) - 1))
-#define OS_CHECK_TASK_BLOCK (OS_TASK_STATUS_DELAY | \
- OS_TASK_STATUS_PEND | \
- OS_TASK_STATUS_SUSPEND | \
- OS_TASK_STATUS_EVENT | \
- OS_TASK_STATUS_PEND_QUEUE)
+#define OS_CHECK_TASK_BLOCK (OS_TASK_STATUS_DELAY | \
+ OS_TASK_STATUS_PEND | \
+ OS_TASK_STATUS_SUSPEND)
/**
* @ingroup los_task
@@ -98,13 +97,6 @@ extern "C" {
*/
#define OS_TASK_STACK_TOP_OFFSET 4
-LITE_OS_SEC_BSS LOS_DL_LIST *g_losPriorityQueueList = NULL;
-static LITE_OS_SEC_BSS UINT32 g_priqueueBitmap = 0;
-
-#define PRIQUEUE_PRIOR0_BIT (UINT32)0x80000000
-#define OS_PRIORITY_QUEUE_PRIORITYNUM 32
-#define OS_TASK_STACK_PROTECT_SIZE 32
-
LITE_OS_SEC_BSS LosTaskCB *g_taskCBArray = NULL;
LITE_OS_SEC_BSS LosTask g_losTask;
LITE_OS_SEC_BSS UINT16 g_losTaskLock;
@@ -113,7 +105,6 @@ LITE_OS_SEC_BSS UINT32 g_idleTaskID;
LITE_OS_SEC_BSS UINT32 g_swtmrTaskID;
LITE_OS_SEC_DATA_INIT LOS_DL_LIST g_losFreeTask;
LITE_OS_SEC_DATA_INIT LOS_DL_LIST g_taskRecyleList;
-LITE_OS_SEC_BSS TaskSortLinkAttr g_taskSortLink;
LITE_OS_SEC_BSS BOOL g_taskScheduled = FALSE;
#if (LOSCFG_BASE_CORE_TSK_MONITOR == 1)
@@ -124,66 +115,6 @@ TSKSWITCHHOOK g_pfnUsrTskSwitchHook = NULL;
TaskSwitchInfo g_taskSwitchInfo;
#endif
-STATIC UINT32 OsPriqueueInit(VOID)
-{
- UINT32 priority;
- UINT32 size = OS_PRIORITY_QUEUE_PRIORITYNUM * sizeof(LOS_DL_LIST);
-
- g_losPriorityQueueList = (LOS_DL_LIST *)LOS_MemAlloc(m_aucSysMem0, size);
- if (g_losPriorityQueueList == NULL) {
- return LOS_NOK;
- }
-
- for (priority = 0; priority < OS_PRIORITY_QUEUE_PRIORITYNUM; ++priority) {
- LOS_ListInit(&g_losPriorityQueueList[priority]);
- }
- return LOS_OK;
-}
-
-STATIC VOID OsPriqueueEnqueue(LOS_DL_LIST *priqueueItem, UINT32 priority)
-{
- if (LOS_ListEmpty(&g_losPriorityQueueList[priority])) {
- g_priqueueBitmap |= (PRIQUEUE_PRIOR0_BIT >> priority);
- }
-
- LOS_ListTailInsert(&g_losPriorityQueueList[priority], priqueueItem);
-}
-
-STATIC VOID OsPriqueueDequeue(LOS_DL_LIST *priqueueItem)
-{
- LosTaskCB *runningTask = NULL;
- LOS_ListDelete(priqueueItem);
-
- runningTask = LOS_DL_LIST_ENTRY(priqueueItem, LosTaskCB, pendList);
- if (LOS_ListEmpty(&g_losPriorityQueueList[runningTask->priority])) {
- g_priqueueBitmap &= ~(PRIQUEUE_PRIOR0_BIT >> runningTask->priority);
- }
-}
-
-STATIC LOS_DL_LIST *OsPriqueueTop(VOID)
-{
- UINT32 priority;
-
- if (g_priqueueBitmap != 0) {
- priority = CLZ(g_priqueueBitmap);
- return LOS_DL_LIST_FIRST(&g_losPriorityQueueList[priority]);
- }
-
- return (LOS_DL_LIST *)NULL;
-}
-
-STATIC UINT32 OsPriqueueSize(UINT32 priority)
-{
- UINT32 itemCnt = 0;
- LOS_DL_LIST *curPQNode = (LOS_DL_LIST *)NULL;
-
- LOS_DL_LIST_FOR_EACH(curPQNode, &g_losPriorityQueueList[priority]) {
- ++itemCnt;
- }
-
- return itemCnt;
-}
-
STATIC_INLINE UINT32 OsCheckTaskIDValid(UINT32 taskID)
{
UINT32 ret = LOS_OK;
@@ -219,28 +150,6 @@ STATIC VOID OsRecyleFinishedTask(VOID)
LOS_IntRestore(intSave);
}
-UINT32 OsTaskNextSwitchTimeGet(VOID)
-{
- LosTaskCB *taskCB = NULL;
- UINT32 taskSortLinkTick = LOS_WAIT_FOREVER;
- LOS_DL_LIST *listObject = NULL;
- UINT32 tempTicks;
- UINT32 index;
-
- for (index = 0; index < OS_TSK_SORTLINK_LEN; index++) {
- listObject = g_taskSortLink.sortLink + ((g_taskSortLink.cursor + index) % OS_TSK_SORTLINK_LEN);
- if (!LOS_ListEmpty(listObject)) {
- taskCB = LOS_DL_LIST_ENTRY((listObject)->pstNext, LosTaskCB, timerList);
- tempTicks = (index == 0) ? OS_TSK_SORTLINK_LEN : index;
- tempTicks += (UINT32)(UWROLLNUM((UINT32)taskCB->idxRollNum) * OS_TSK_SORTLINK_LEN);
- if (taskSortLinkTick > tempTicks) {
- taskSortLinkTick = tempTicks;
- }
- }
- }
- return taskSortLinkTick;
-}
-
/*****************************************************************************
Function : OsIdleTask
Description : Idle task.
@@ -252,154 +161,7 @@ LITE_OS_SEC_TEXT WEAK VOID OsIdleTask(VOID)
{
while (1) {
OsRecyleFinishedTask();
-#if (LOSCFG_KERNEL_RUNSTOP == 1)
- HalEnterSleep(OS_SYS_NORMAL_SLEEP);
-#endif
- }
-}
-
-/*****************************************************************************
- Function : OsTaskPriModify
- Description : Change task priority.
- Input : taskCB --- task control block
- priority --- priority
- Output : None
- Return : None
- *****************************************************************************/
-LITE_OS_SEC_TEXT_MINOR VOID OsTaskPriModify(LosTaskCB *taskCB, UINT16 priority)
-{
- if (taskCB->taskStatus & OS_TASK_STATUS_READY) {
- OsPriqueueDequeue(&taskCB->pendList);
- taskCB->taskStatus &= (~OS_TASK_STATUS_READY);
- taskCB->priority = priority;
- taskCB->taskStatus |= OS_TASK_STATUS_READY;
- OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, taskCB);
- OsPriqueueEnqueue(&taskCB->pendList, taskCB->priority);
- } else {
- taskCB->priority = priority;
- }
- OsHookCall(LOS_HOOK_TYPE_TASK_PRIMODIFY, taskCB, taskCB->priority);
-}
-
-/*****************************************************************************
- Function : OsTaskAdd2TimerList
- Description : Add task to sorted delay list.
- Input : taskCB --- task control block
- timeout --- wait time, ticks
- Output : None
- Return : None
- *****************************************************************************/
-LITE_OS_SEC_TEXT VOID OsTaskAdd2TimerList(LosTaskCB *taskCB, UINT32 timeout)
-{
- LosTaskCB *taskDelay = NULL;
- LOS_DL_LIST *listObject = NULL;
- UINT32 sortIndex;
- UINT32 rollNum;
-
- sortIndex = timeout & OS_TSK_SORTLINK_MASK;
- rollNum = (timeout >> OS_TSK_SORTLINK_LOGLEN);
- (sortIndex > 0) ? 0 : (rollNum--);
- EVALUATE_L(taskCB->idxRollNum, rollNum);
- sortIndex = (sortIndex + g_taskSortLink.cursor);
- sortIndex = sortIndex & OS_TSK_SORTLINK_MASK;
- EVALUATE_H(taskCB->idxRollNum, sortIndex);
- listObject = g_taskSortLink.sortLink + sortIndex;
- if (listObject->pstNext == listObject) {
- LOS_ListTailInsert(listObject, &taskCB->timerList);
- } else {
- taskDelay = LOS_DL_LIST_ENTRY((listObject)->pstNext, LosTaskCB, timerList);
- do {
- if (UWROLLNUM(taskDelay->idxRollNum) <= UWROLLNUM(taskCB->idxRollNum)) {
- UWROLLNUMSUB(taskCB->idxRollNum, taskDelay->idxRollNum);
- } else {
- UWROLLNUMSUB(taskDelay->idxRollNum, taskCB->idxRollNum);
- break;
- }
-
- taskDelay = LOS_DL_LIST_ENTRY(taskDelay->timerList.pstNext, LosTaskCB, timerList);
- } while (&taskDelay->timerList != (listObject));
-
- LOS_ListTailInsert(&taskDelay->timerList, &taskCB->timerList);
- }
-}
-
-
-LITE_OS_SEC_TEXT VOID OsTimerListDelete(LosTaskCB *taskCB)
-{
- LOS_DL_LIST *listObject = NULL;
- LosTaskCB *nextTask = NULL;
- UINT32 sortIndex;
-
- sortIndex = UWSORTINDEX(taskCB->idxRollNum);
- listObject = g_taskSortLink.sortLink + sortIndex;
-
- if (listObject != taskCB->timerList.pstNext) {
- nextTask = LOS_DL_LIST_ENTRY(taskCB->timerList.pstNext, LosTaskCB, timerList);
- UWROLLNUMADD(nextTask->idxRollNum, taskCB->idxRollNum);
- }
-
- LOS_ListDelete(&taskCB->timerList);
-}
-
-LITE_OS_SEC_TEXT VOID OsTaskScan(VOID)
-{
- LosTaskCB *taskCB = NULL;
- BOOL needSchedule = FALSE;
- LOS_DL_LIST *listObject = NULL;
- UINT16 tempStatus;
- UINTPTR intSave;
- intSave = LOS_IntLock();
-
- g_taskSortLink.cursor = (g_taskSortLink.cursor + 1) % OS_TSK_SORTLINK_LEN;
- listObject = g_taskSortLink.sortLink + g_taskSortLink.cursor;
- if (listObject->pstNext == listObject) {
- LOS_IntRestore(intSave);
- return;
- }
-
- for (taskCB = LOS_DL_LIST_ENTRY((listObject)->pstNext, LosTaskCB, timerList);
- &taskCB->timerList != (listObject);) {
- tempStatus = taskCB->taskStatus;
- if (UWROLLNUM(taskCB->idxRollNum) > 0) {
- UWROLLNUMDEC(taskCB->idxRollNum);
- break;
- }
-
- LOS_ListDelete(&taskCB->timerList);
- if (tempStatus & OS_TASK_STATUS_PEND) {
- taskCB->taskStatus &= ~(OS_TASK_STATUS_PEND);
- LOS_ListDelete(&taskCB->pendList);
- taskCB->taskSem = NULL;
- taskCB->taskMux = NULL;
- }
- else if (tempStatus & OS_TASK_STATUS_EVENT) {
- taskCB->taskStatus &= ~(OS_TASK_STATUS_EVENT);
- }
- else if (tempStatus & OS_TASK_STATUS_PEND_QUEUE) {
- LOS_ListDelete(&taskCB->pendList);
- taskCB->taskStatus &= ~(OS_TASK_STATUS_PEND_QUEUE);
- } else {
- taskCB->taskStatus &= ~(OS_TASK_STATUS_DELAY);
- }
-
- if (!(tempStatus & OS_TASK_STATUS_SUSPEND)) {
- taskCB->taskStatus |= OS_TASK_STATUS_READY;
- OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, taskCB);
- OsPriqueueEnqueue(&taskCB->pendList, taskCB->priority);
- needSchedule = TRUE;
- }
-
- if (listObject->pstNext == listObject) {
- break;
- }
-
- taskCB = LOS_DL_LIST_ENTRY(listObject->pstNext, LosTaskCB, timerList);
- }
-
- LOS_IntRestore(intSave);
-
- if (needSchedule) {
- LOS_Schedule();
+ HalEnterSleep(OS_SYS_DEEP_SLEEP);
}
}
@@ -419,19 +181,12 @@ LITE_OS_SEC_TEXT_MINOR UINT8 *OsConvertTskStatus(UINT16 taskStatus)
} else if (taskStatus & OS_TASK_STATUS_DELAY) {
return (UINT8 *)"Delay";
} else if (taskStatus & OS_TASK_STATUS_PEND) {
- if (taskStatus & OS_TASK_STATUS_TIMEOUT) {
- return (UINT8 *)"PendTimeOut";
+ if (taskStatus & OS_TASK_STATUS_PEND_TIME) {
+ return (UINT8 *)"PendTime";
}
-
return (UINT8 *)"Pend";
} else if (taskStatus & OS_TASK_STATUS_SUSPEND) {
return (UINT8 *)"Suspend";
- } else if (taskStatus & OS_TASK_STATUS_PEND_QUEUE) {
- if (taskStatus & OS_TASK_STATUS_TIMEOUT) {
- return (UINT8 *)"QueuePendTimeOut";
- }
-
- return (UINT8 *)"QueuePend";
}
return (UINT8 *)"Impossible";
@@ -594,8 +349,6 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsTaskInit(VOID)
{
UINT32 size;
UINT32 index;
- LOS_DL_LIST *listObject = NULL;
- UINT32 queueResult;
size = (g_taskMaxNum + 1) * sizeof(LosTaskCB);
g_taskCBArray = (LosTaskCB *)LOS_MemAlloc(m_aucSysMem0, size);
@@ -619,28 +372,9 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsTaskInit(VOID)
g_losTask.runTask->taskID = index;
g_losTask.runTask->taskStatus = (OS_TASK_STATUS_UNUSED | OS_TASK_STATUS_RUNNING);
g_losTask.runTask->priority = OS_TASK_PRIORITY_LOWEST + 1;
- queueResult = OsPriqueueInit();
- if (queueResult == LOS_NOK) {
- (VOID)LOS_MemFree(m_aucSysMem0, g_taskCBArray);
- return LOS_ERRNO_TSK_NO_MEMORY;
- }
- size = sizeof(LOS_DL_LIST) * OS_TSK_SORTLINK_LEN;
- listObject = (LOS_DL_LIST *)LOS_MemAlloc(m_aucSysMem0, size);
- if (listObject == NULL) {
- (VOID)LOS_MemFree(m_aucSysMem0, g_taskCBArray);
- return LOS_ERRNO_TSK_NO_MEMORY;
- }
-
- // Ignore the return code when matching CSEC rule 6.6(3).
- (VOID)memset_s((VOID *)listObject, size, 0, size);
- g_taskSortLink.sortLink = listObject;
- g_taskSortLink.cursor = 0;
- for (index = 0; index < OS_TSK_SORTLINK_LEN; index++, listObject++) {
- LOS_ListInit(listObject);
- }
-
- return LOS_OK;
+ g_idleTaskID = OS_INVALID;
+ return OsSchedInit();
}
@@ -661,12 +395,13 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsIdleTaskCreate(VOID)
taskInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE;
taskInitParam.pcName = "IdleCore000";
taskInitParam.usTaskPrio = OS_TASK_PRIORITY_LOWEST;
- retVal = LOS_TaskCreate(&g_idleTaskID, &taskInitParam);
+ retVal = LOS_TaskCreateOnly(&g_idleTaskID, &taskInitParam);
if (retVal != LOS_OK) {
return retVal;
}
+ OsSchedSetIdleTaskSchedPartam(OS_TCB_FROM_TID(g_idleTaskID));
return LOS_OK;
}
@@ -694,10 +429,11 @@ LITE_OS_SEC_TEXT UINT32 LOS_CurTaskIDGet(VOID)
*****************************************************************************/
LITE_OS_SEC_TEXT UINT32 LOS_NextTaskIDGet(VOID)
{
- if (g_losTask.newTask == NULL) {
- return LOS_ERRNO_TSK_ID_INVALID;
- }
- return g_losTask.newTask->taskID;
+ UINTPTR intSave = LOS_IntLock();
+ UINT32 taskID = OsGetTopTask()->taskID;
+ LOS_IntRestore(intSave);
+
+ return taskID;
}
/*****************************************************************************
@@ -866,11 +602,7 @@ LITE_OS_SEC_TEXT_MINOR VOID OsTaskMonInit(VOID)
LITE_OS_SEC_TEXT_INIT VOID OsTaskEntry(UINT32 taskID)
{
UINT32 retVal;
- LosTaskCB *taskCB = NULL;
-
- OS_TASK_ID_CHECK(taskID);
-
- taskCB = OS_TCB_FROM_TID(taskID);
+ LosTaskCB *taskCB = OS_TCB_FROM_TID(taskID);
(VOID)taskCB->taskEntry(taskCB->arg);
@@ -928,11 +660,14 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsNewTaskInit(LosTaskCB *taskCB, TSK_INIT_PARAM_S *
taskCB->taskMux = NULL;
taskCB->taskStatus = OS_TASK_STATUS_SUSPEND;
taskCB->priority = taskInitParam->usTaskPrio;
+ taskCB->timeSlice = 0;
+ taskCB->waitTimes = 0;
taskCB->taskEntry = taskInitParam->pfnTaskEntry;
taskCB->event.uwEventID = OS_NULL_INT;
taskCB->eventMask = 0;
taskCB->taskName = taskInitParam->pcName;
taskCB->msg = NULL;
+ SET_SORTLIST_VALUE(&taskCB->sortList, OS_SORT_LINK_INVALID_TIME);
return LOS_OK;
}
@@ -1001,22 +736,6 @@ LOS_ERREND:
return retVal;
}
-/* ****************************************************************************
- Function : OsTaskSchedule
- Description : Function to check task schedule and do real task schedule.
- Input : None
- Output : None
- Return : None
- **************************************************************************** */
-VOID OsTaskSchedule(VOID)
-{
-#if (LOSCFG_BASE_CORE_TSK_MONITOR == 1)
- OsTaskSwitchCheck();
-#endif
- OsHookCall(LOS_HOOK_TYPE_TASK_SWITCHEDIN);
- HalTaskSchedule();
-}
-
/*****************************************************************************
Function : LOS_TaskCreate
Description : Create a task
@@ -1037,28 +756,18 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreate(UINT32 *taskID, TSK_INIT_PARAM_S *ta
taskCB = OS_TCB_FROM_TID(*taskID);
intSave = LOS_IntLock();
- taskCB->taskStatus &= (~OS_TASK_STATUS_SUSPEND);
- taskCB->taskStatus |= OS_TASK_STATUS_READY;
-
#if (LOSCFG_BASE_CORE_CPUP == 1)
g_cpup[taskCB->taskID].cpupID = taskCB->taskID;
g_cpup[taskCB->taskID].status = taskCB->taskStatus;
#endif
- OsPriqueueEnqueue(&taskCB->pendList, taskCB->priority);
- g_losTask.newTask = LOS_DL_LIST_ENTRY(OsPriqueueTop(), LosTaskCB, pendList);
+ OsSchedTaskEnQueue(taskCB);
+ LOS_IntRestore(intSave);
- if ((g_taskScheduled) && (g_losTaskLock == 0)) {
- if (g_losTask.runTask != g_losTask.newTask) {
- if (LOS_CHECK_SCHEDULE) {
- LOS_IntRestore(intSave);
- OsTaskSchedule();
- return LOS_OK;
- }
- }
+ if (g_taskScheduled) {
+ LOS_Schedule();
}
- LOS_IntRestore(intSave);
return LOS_OK;
}
@@ -1094,15 +803,12 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskID)
taskCB->taskStatus &= (~OS_TASK_STATUS_SUSPEND);
if (!(taskCB->taskStatus & OS_CHECK_TASK_BLOCK)) {
- taskCB->taskStatus |= OS_TASK_STATUS_READY;
- OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, taskCB);
- OsPriqueueEnqueue(&taskCB->pendList, taskCB->priority);
+ OsSchedTaskEnQueue(taskCB);
if (g_taskScheduled) {
LOS_IntRestore(intSave);
LOS_Schedule();
return LOS_OK;
}
- g_losTask.newTask = LOS_DL_LIST_ENTRY(OsPriqueueTop(), LosTaskCB, pendList);
}
LOS_IntRestore(intSave);
@@ -1151,8 +857,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskSuspend(UINT32 taskID)
}
if (tempStatus & OS_TASK_STATUS_READY) {
- OsPriqueueDequeue(&taskCB->pendList);
- taskCB->taskStatus &= (~OS_TASK_STATUS_READY);
+ OsSchedTaskDeQueue(taskCB);
}
taskCB->taskStatus |= OS_TASK_STATUS_SUSPEND;
@@ -1176,7 +881,7 @@ LITE_OS_SEC_TEXT_INIT STATIC_INLINE VOID OsRunningTaskDelete(UINT32 taskID, LosT
LOS_ListTailInsert(&g_taskRecyleList, &taskCB->pendList);
g_losTask.runTask = &g_taskCBArray[g_taskMaxNum];
g_losTask.runTask->taskID = taskID;
- g_losTask.runTask->taskStatus = taskCB->taskStatus;
+ g_losTask.runTask->taskStatus = taskCB->taskStatus | OS_TASK_STATUS_RUNNING;
g_losTask.runTask->topOfStack = taskCB->topOfStack;
g_losTask.runTask->taskName = taskCB->taskName;
}
@@ -1212,32 +917,19 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskID)
}
OsHookCall(LOS_HOOK_TYPE_TASK_DELETE, taskCB);
+ OsSchedTaskExit(taskCB);
- if ((taskCB->taskStatus) & OS_TASK_STATUS_READY) {
- OsPriqueueDequeue(&taskCB->pendList);
- taskCB->taskStatus &= (~OS_TASK_STATUS_READY);
- } else if (((taskCB->taskStatus) & (OS_TASK_STATUS_PEND | OS_TASK_STATUS_PEND_QUEUE))) {
- LOS_ListDelete(&taskCB->pendList);
- }
-
- if ((taskCB->taskStatus) & (OS_TASK_STATUS_DELAY | OS_TASK_STATUS_TIMEOUT)) {
- OsTimerListDelete(taskCB);
- }
-
- taskCB->taskStatus &= (~(OS_TASK_STATUS_SUSPEND));
- taskCB->taskStatus |= OS_TASK_STATUS_UNUSED;
taskCB->event.uwEventID = OS_NULL_INT;
taskCB->eventMask = 0;
#if (LOSCFG_BASE_CORE_CPUP == 1)
// Ignore the return code when matching CSEC rule 6.6(4).
(VOID)memset_s((VOID *)&g_cpup[taskCB->taskID], sizeof(OsCpupCB), 0, sizeof(OsCpupCB));
#endif
- g_losTask.newTask = LOS_DL_LIST_ENTRY(OsPriqueueTop(), LosTaskCB, pendList);
- if (taskCB->taskStatus & OS_TASK_STATUS_RUNNING) {
- OsRunningTaskDelete(taskID, taskCB);
+ if (taskCB->taskStatus & OS_TASK_STATUS_RUNNING) {
taskCB->taskStatus = OS_TASK_STATUS_UNUSED;
+ OsRunningTaskDelete(taskID, taskCB);
LOS_IntRestore(intSave);
- OsTaskSchedule();
+ LOS_Schedule();
return LOS_OK;
} else {
taskCB->taskStatus = OS_TASK_STATUS_UNUSED;
@@ -1279,12 +971,9 @@ LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay(UINT32 tick)
return LOS_TaskYield();
} else {
intSave = LOS_IntLock();
- OsPriqueueDequeue(&(g_losTask.runTask->pendList));
- g_losTask.runTask->taskStatus &= (~OS_TASK_STATUS_READY);
- OsTaskAdd2TimerList((LosTaskCB *)g_losTask.runTask, tick);
- g_losTask.runTask->taskStatus |= OS_TASK_STATUS_DELAY;
- LOS_IntRestore(intSave);
+ OsSchedDelay(g_losTask.runTask, tick);
OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTODELAYEDLIST, g_losTask.runTask);
+ LOS_IntRestore(intSave);
LOS_Schedule();
}
@@ -1345,19 +1034,8 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskPriSet(UINT32 taskID, UINT16 taskPrio)
LOS_IntRestore(intSave);
return LOS_ERRNO_TSK_NOT_CREATED;
}
- /* delete the task and insert with right priority into ready queue */
- isReady = (tempStatus & OS_TASK_STATUS_READY);
- if (isReady) {
- OsPriqueueDequeue(&taskCB->pendList);
- taskCB->taskStatus &= (~OS_TASK_STATUS_READY);
- taskCB->priority = taskPrio;
- taskCB->taskStatus |= OS_TASK_STATUS_READY;
- OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, taskCB);
- OsPriqueueEnqueue(&taskCB->pendList, taskCB->priority);
- } else {
- taskCB->priority = taskPrio;
- }
+ isReady = OsSchedModifyTaskSchedParam(taskCB, taskPrio);
LOS_IntRestore(intSave);
/* delete the task and insert with right priority into ready queue */
if (isReady) {
@@ -1369,58 +1047,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskPriSet(UINT32 taskID, UINT16 taskPrio)
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_CurTaskPriSet(UINT16 taskPrio)
{
- UINT32 retVal;
- retVal = LOS_TaskPriSet(g_losTask.runTask->taskID, taskPrio);
- return retVal;
-}
-
-/**************************************************************************
- Function : OsTaskWait
- Description : pend the running task in a list
- Input : pendingList -- The pending list
- taskStatus -- The status need to be converted to
- timeout -- Expiry time
- Output : None
- Return : None
-**************************************************************************/
-VOID OsTaskWait(LOS_DL_LIST *pendingList, UINT32 taskStatus, UINT32 timeout)
-{
- LosTaskCB *runTask = NULL;
- LOS_DL_LIST *pendObj = NULL;
-
- runTask = g_losTask.runTask;
- OsPriqueueDequeue(&runTask->pendList);
- runTask->taskStatus &= (~OS_TASK_STATUS_READY);
- pendObj = &runTask->pendList;
- runTask->taskStatus |= taskStatus;
- LOS_ListTailInsert(pendingList, pendObj);
- if (timeout != LOS_WAIT_FOREVER) {
- runTask->taskStatus |= OS_TASK_STATUS_TIMEOUT;
- OsTaskAdd2TimerList((LosTaskCB *)runTask, timeout);
- }
-}
-
-/**************************************************************************
- Function : OsTaskWake
- Description : delete the task from pendlist and also add to the priqueue
- Input : resumedTask -- resumed task
- : taskStatus -- the status to be unset
- Output : resumedTask -- resumed task
- Return : None
-**************************************************************************/
-VOID OsTaskWake(LosTaskCB *resumedTask, UINT32 taskStatus)
-{
- LOS_ListDelete(&resumedTask->pendList);
- resumedTask->taskStatus &= (~taskStatus);
- if (resumedTask->taskStatus & OS_TASK_STATUS_TIMEOUT) {
- OsTimerListDelete(resumedTask);
- resumedTask->taskStatus &= (~OS_TASK_STATUS_TIMEOUT);
- }
- if (!(resumedTask->taskStatus & OS_TASK_STATUS_SUSPEND)) {
- resumedTask->taskStatus |= OS_TASK_STATUS_READY;
- OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, resumedTask);
- OsPriqueueEnqueue(&resumedTask->pendList, resumedTask->priority);
- }
+ return LOS_TaskPriSet(g_losTask.runTask->taskID, taskPrio);
}
/*****************************************************************************
@@ -1432,29 +1059,10 @@ VOID OsTaskWake(LosTaskCB *resumedTask, UINT32 taskStatus)
*****************************************************************************/
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskYield(VOID)
{
- UINT32 taskCount;
UINTPTR intSave;
- if (g_losTask.runTask->taskID >= g_taskMaxNum) {
- return LOS_ERRNO_TSK_ID_INVALID;
- }
-
- if (!(g_losTask.runTask->taskStatus & OS_TASK_STATUS_READY)) {
- return LOS_OK;
- }
-
intSave = LOS_IntLock();
- taskCount = OsPriqueueSize(g_losTask.runTask->priority);
- if (taskCount > 1) {
- LOS_ListDelete(&(g_losTask.runTask->pendList));
- g_losTask.runTask->taskStatus |= OS_TASK_STATUS_READY;
- OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, g_losTask.runTask);
- OsPriqueueEnqueue(&(g_losTask.runTask->pendList), g_losTask.runTask->priority);
- } else {
- LOS_IntRestore(intSave);
- return LOS_ERRNO_TSK_YIELD_NOT_ENOUGH_TASK;
- }
-
+ OsSchedYield();
LOS_IntRestore(intSave);
LOS_Schedule();
return LOS_OK;
@@ -1642,10 +1250,7 @@ LITE_OS_SEC_TEXT_MINOR BOOL LOS_TaskIsRunning(VOID)
*****************************************************************************/
LITE_OS_SEC_TEXT UINT32 LOS_NewTaskIDGet(VOID)
{
- if (g_losTask.newTask == NULL) {
- return LOS_ERRNO_TSK_ID_INVALID;
- }
- return g_losTask.newTask->taskID;
+ return LOS_NextTaskIDGet();
}
/*****************************************************************************
@@ -1676,71 +1281,6 @@ LITE_OS_SEC_TEXT CHAR* LOS_TaskNameGet(UINT32 taskID)
return taskCB->taskName;
}
-/* ****************************************************************************
- Function : LOS_Schedule
- Description : Function to determine whether task scheduling is required.
- Input : None
- Output : None
- Return : None
- **************************************************************************** */
-VOID LOS_Schedule(VOID)
-{
- UINTPTR intSave;
-
- intSave = LOS_IntLock();
- /* Find the highest task */
- g_losTask.newTask = LOS_DL_LIST_ENTRY(OsPriqueueTop(), LosTaskCB, pendList);
- /* In case that running is not highest then reschedule */
- if (g_losTask.runTask != g_losTask.newTask) {
- if (LOS_CHECK_SCHEDULE) {
- LOS_IntRestore(intSave);
- OsHookCall(LOS_HOOK_TYPE_ISR_EXITTOSCHEDULER);
- OsTaskSchedule();
- return;
- }
- }
- LOS_IntRestore(intSave);
-}
-
-#if (LOSCFG_BASE_CORE_TIMESLICE == 1)
-LITE_OS_SEC_BSS OsTaskRobin g_taskTimeSlice;
-
-/*****************************************************************************
- Function : OsTimesliceInit
- Description : Initialztion Timeslice
- Input : None
- Output : None
- Return : None
- *****************************************************************************/
-LITE_OS_SEC_TEXT_INIT VOID OsTimesliceInit(VOID)
-{
- g_taskTimeSlice.task = (LosTaskCB *)NULL;
- g_taskTimeSlice.tout = LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT;
-}
-
-/*****************************************************************************
- Function : OsTimesliceCheck
- Description : check Timeslice
- Input : None
- Output : None
- Return : None
- *****************************************************************************/
-LITE_OS_SEC_TEXT VOID OsTimesliceCheck(VOID)
-{
- if (g_taskTimeSlice.task != g_losTask.runTask) {
- g_taskTimeSlice.task = g_losTask.runTask;
- g_taskTimeSlice.time = ((UINT16)g_ullTickCount + g_taskTimeSlice.tout) - 1;
- }
-
- if (g_taskTimeSlice.time == (UINT16)g_ullTickCount) {
- g_taskTimeSlice.task = (LosTaskCB *)NULL;
- if (LOS_TaskYield() != LOS_OK) {
- PRINT_INFO("%s, %d\n", __FUNCTION__, __LINE__);
- }
- }
-}
-#endif
-
LITE_OS_SEC_TEXT_MINOR VOID LOS_Msleep(UINT32 mSecs)
{
UINT32 interval;
diff --git a/kernel/src/los_tick.c b/kernel/src/los_tick.c
index ea4e66d7..6f991a4f 100644
--- a/kernel/src/los_tick.c
+++ b/kernel/src/los_tick.c
@@ -30,9 +30,10 @@
*/
#include "los_tick.h"
+#include "los_config.h"
#include "los_task.h"
#include "los_swtmr.h"
-#include "los_config.h"
+#include "los_sched.h"
#ifdef __cplusplus
#if __cplusplus
@@ -40,7 +41,6 @@ extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
-LITE_OS_SEC_BSS UINT64 g_ullTickCount;
LITE_OS_SEC_BSS UINT32 g_ticksPerSec;
LITE_OS_SEC_BSS UINT32 g_uwCyclePerSec;
LITE_OS_SEC_BSS UINT32 g_cyclesPerTick;
@@ -52,21 +52,15 @@ extern VOID platform_tick_handler(VOID);
LITE_OS_SEC_TEXT VOID OsTickHandler(VOID)
{
+#if (LOSCFG_BASE_CORE_TICK_WTIMER == 0)
+ OsSchedUpdateTimeBase();
+#endif
+
#if (LOSCFG_BASE_CORE_TICK_HW_TIME == 1)
platform_tick_handler();
#endif
- g_ullTickCount++;
-
-#if (LOSCFG_BASE_CORE_TIMESLICE == 1)
- OsTimesliceCheck();
-#endif
-
- OsTaskScan(); // task timeout scan
-
-#if (LOSCFG_BASE_CORE_SWTMR == 1)
- (VOID)OsSwtmrScan();
-#endif
+ LOS_SchedTickHandler();
}
UINT32 LOS_SysClockGet(VOID)
@@ -84,7 +78,7 @@ Return : current tick
*****************************************************************************/
LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID)
{
- return g_ullTickCount;
+ return OsGetCurrTimeCycle() / OS_CYCLE_PER_TICK;
}
/*****************************************************************************
diff --git a/targets/cortex-m3_stm32f103_simulator_keil/project/los_demo.uvopt b/targets/cortex-m3_stm32f103_simulator_keil/project/los_demo.uvopt
old mode 100644
new mode 100755
index 0b974b0b..772858f1
--- a/targets/cortex-m3_stm32f103_simulator_keil/project/los_demo.uvopt
+++ b/targets/cortex-m3_stm32f103_simulator_keil/project/los_demo.uvopt
@@ -220,7 +220,7 @@
liteos-m
- 0
+ 1
0
0
0
@@ -500,6 +500,30 @@
0
0
+
+ 1
+ 24
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\kernel\src\los_sched.c
+ los_sched.c
+ 0
+ 0
+
+
+ 1
+ 25
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\kernel\src\los_sortlink.c
+ los_sortlink.c
+ 0
+ 0
+
@@ -510,7 +534,7 @@
0
2
- 24
+ 26
1
0
0
@@ -522,7 +546,7 @@
2
- 25
+ 27
1
0
0
@@ -534,7 +558,7 @@
2
- 26
+ 28
5
0
0
@@ -548,13 +572,13 @@
component
- 1
+ 0
0
0
0
3
- 27
+ 29
1
0
0
@@ -566,7 +590,7 @@
3
- 28
+ 30
1
0
0
@@ -578,7 +602,7 @@
3
- 29
+ 31
1
0
0
@@ -590,7 +614,7 @@
3
- 30
+ 32
1
0
0
@@ -602,7 +626,7 @@
3
- 31
+ 33
1
0
0
@@ -614,7 +638,7 @@
3
- 32
+ 34
1
0
0
@@ -626,7 +650,7 @@
3
- 33
+ 35
5
0
0
@@ -638,7 +662,7 @@
3
- 34
+ 36
1
0
0
@@ -650,7 +674,7 @@
3
- 35
+ 37
5
0
0
diff --git a/targets/cortex-m3_stm32f103_simulator_keil/project/los_demo.uvproj b/targets/cortex-m3_stm32f103_simulator_keil/project/los_demo.uvproj
old mode 100644
new mode 100755
index f8129709..a7e48226
--- a/targets/cortex-m3_stm32f103_simulator_keil/project/los_demo.uvproj
+++ b/targets/cortex-m3_stm32f103_simulator_keil/project/los_demo.uvproj
@@ -537,6 +537,16 @@
1
..\..\..\utils\los_debug.c
+
+ los_sched.c
+ 1
+ ..\..\..\kernel\src\los_sched.c
+
+
+ los_sortlink.c
+ 1
+ ..\..\..\kernel\src\los_sortlink.c
+
diff --git a/targets/cortex-m3_stm32f103_simulator_keil/target_config.h b/targets/cortex-m3_stm32f103_simulator_keil/target_config.h
index 7d797435..cd26cd23 100755
--- a/targets/cortex-m3_stm32f103_simulator_keil/target_config.h
+++ b/targets/cortex-m3_stm32f103_simulator_keil/target_config.h
@@ -48,6 +48,9 @@ extern "C" {
#define OS_SYS_CLOCK 24000000
#define LOSCFG_BASE_CORE_TICK_PER_SECOND (1000UL)
#define LOSCFG_BASE_CORE_TICK_HW_TIME 0
+#define LOSCFG_BASE_CORE_TICK_WTIMER 0
+#define LOSCFG_BASE_CORE_TICK_RESPONSE_MAX 0xFFFFFF
+
/*=============================================================================
Hardware interrupt module configuration
=============================================================================*/
@@ -61,7 +64,7 @@ extern "C" {
#define LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE (0x2D0U)
#define LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE (0x130U)
#define LOSCFG_BASE_CORE_TIMESLICE 1
-#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 10
+#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 20000
/*=============================================================================
Semaphore module configuration
=============================================================================*/
diff --git a/targets/cortex-m4_stm32f429ig_fire-challenger_iar/main.c b/targets/cortex-m4_stm32f429ig_fire-challenger_iar/main.c
index 82ce033f..d252e5da 100644
--- a/targets/cortex-m4_stm32f429ig_fire-challenger_iar/main.c
+++ b/targets/cortex-m4_stm32f429ig_fire-challenger_iar/main.c
@@ -35,6 +35,7 @@
#include "los_interrupt.h"
#include "los_debug.h"
#include "los_compiler.h"
+#include "los_sched.h"
#include "iar_stm32f429ig_fire-challenger.h"
#ifdef __cplusplus
@@ -43,48 +44,123 @@ extern "C" {
#endif /* __cpluscplus */
#endif /* __cpluscplus */
-VOID taskSampleEntry2(VOID)
+STATIC VOID TaskSampleEntry2(VOID)
{
- while(1) {
- LOS_TaskDelay(10000);
- printf("taskSampleEntry2 running...\n");
+ while (1) {
+ printf("TaskSampleEntry2 running...\n");
+ LOS_TaskDelay(10000); /* 10 Seconds */
}
}
-
-VOID taskSampleEntry1(VOID)
+STATIC VOID TaskSampleEntry1(VOID)
{
- while(1) {
- LOS_TaskDelay(2000);
- printf("taskSampleEntry1 running...\n");
+ while (1) {
+ printf("TaskSampleEntry1 running...\n");
+ LOS_TaskDelay(2000); /* 2 Seconds */
}
-
}
-UINT32 taskSample(VOID)
+WEAK VOID TaskSample(VOID)
{
- UINT32 uwRet;
- UINT32 taskID1,taskID2;
- TSK_INIT_PARAM_S stTask1={0};
- stTask1.pfnTaskEntry = (TSK_ENTRY_FUNC)taskSampleEntry1;
- stTask1.uwStackSize = 0X1000;
- stTask1.pcName = "taskSampleEntry1";
- stTask1.usTaskPrio = 6;
- uwRet = LOS_TaskCreate(&taskID1, &stTask1);
+ UINT32 uwRet;
+ UINT32 taskID1;
+ UINT32 taskID2;
+ TSK_INIT_PARAM_S stTask = {0};
+
+ stTask.pfnTaskEntry = (TSK_ENTRY_FUNC)TaskSampleEntry1;
+ stTask.uwStackSize = 0x1000;
+ stTask.pcName = "TaskSampleEntry1";
+ stTask.usTaskPrio = 6; /* Os task priority is 6 */
+ uwRet = LOS_TaskCreate(&taskID1, &stTask);
if (uwRet != LOS_OK) {
- printf("task1 create failed\n");
+ printf("Task1 create failed\n");
}
- stTask1.pfnTaskEntry = (TSK_ENTRY_FUNC)taskSampleEntry2;
- stTask1.uwStackSize = 0X1000;
- stTask1.pcName = "taskSampleEntry2";
- stTask1.usTaskPrio = 7;
- uwRet = LOS_TaskCreate(&taskID2, &stTask1);
+ stTask.pfnTaskEntry = (TSK_ENTRY_FUNC)TaskSampleEntry2;
+ stTask.uwStackSize = 0x1000;
+ stTask.pcName = "TaskSampleEntry2";
+ stTask.usTaskPrio = 7; /* Os task priority is 7 */
+ uwRet = LOS_TaskCreate(&taskID2, &stTask);
if (uwRet != LOS_OK) {
- printf("task2 create failed\n");
+ printf("Task2 create failed\n");
}
+}
+
+#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
+#define SLEEP_TIME_CYCLE 90000000UL
+#define SLEEP_TIME_MAX_RESPONSE_TIME ((UINT32)-1)
+#define TIM2_INI_PRIORITY 3
+unsigned int g_sleepTimePeriod;
+TIM_TimeBaseInitTypeDef g_timerInit = { 0 };
+unsigned long long GetSleepTimeNs(VOID)
+{
+ unsigned long long currTime = g_sleepTimePeriod + TIM_GetCounter(TIM2);
+ currTime = (currTime * OS_SYS_NS_PER_SECOND) / SLEEP_TIME_CYCLE;
+ return currTime;
+}
+
+void SleepTimerStop(void)
+{
+ TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
+ TIM_DeInit(TIM2);
+ TIM_Cmd(TIM2, DISABLE);
+}
+
+void SleepTimerStart(unsigned long long sleepTimeNs)
+{
+ unsigned long long period = (sleepTimeNs * SLEEP_TIME_CYCLE) / OS_SYS_NS_PER_SECOND;
+ if (period > SLEEP_TIME_MAX_RESPONSE_TIME) {
+ period = SLEEP_TIME_MAX_RESPONSE_TIME;
+ }
+
+ g_timerInit.TIM_Period = period;
+ g_sleepTimePeriod = period;
+ TIM_TimeBaseInit(TIM2, &g_timerInit);
+
+ TIM_ClearFlag(TIM2, TIM_FLAG_Update);
+ TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
+
+ TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
+ TIM_Cmd(TIM2, ENABLE);
+}
+
+void TIM2_IRQHandler(void)
+{
+ TIM_ClearFlag(TIM2, TIM_FLAG_Update);
+ TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
+
+ SleepTimerStop();
+}
+
+unsigned int SleepTimerInit(void)
+{
+ NVIC_InitTypeDef nvic = { 0 };
+
+ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
+ TIM_TimeBaseStructInit(&g_timerInit);
+ g_timerInit.TIM_Period = SLEEP_TIME_MAX_RESPONSE_TIME;
+ g_timerInit.TIM_Prescaler = 0;
+ TIM_TimeBaseInit(TIM2, &g_timerInit);
+
+ nvic.NVIC_IRQChannel = TIM2_IRQn;
+ nvic.NVIC_IRQChannelPreemptionPriority = TIM2_INI_PRIORITY;
+ nvic.NVIC_IRQChannelSubPriority = 0;
+ nvic.NVIC_IRQChannelCmd = ENABLE;
+ NVIC_Init(&nvic);
+
+ TIM_ClearFlag(TIM2, TIM_FLAG_Update);
+ TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
+#if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1)
+ UINT32 ret = HalHwiCreate(TIM2_IRQn, TIM2_INI_PRIORITY, 0, TIM2_IRQHandler, 0);
+ if (ret != LOS_OK) {
+ printf("SleepTimerInit create time2 irq failed! ERROR: 0x%x\n", ret);
+ return ret;
+ }
+#endif
+
return LOS_OK;
}
+#endif
/*****************************************************************************
Function : main
@@ -103,10 +179,19 @@ LITE_OS_SEC_TEXT_INIT int main(void)
ret = LOS_KernelInit();
if (ret == LOS_OK) {
- taskSample();
+#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
+ ret = LOS_SchedSleepInit(SleepTimerInit, SleepTimerStart, SleepTimerStop, GetSleepTimeNs);
+ if (ret != LOS_OK) {
+ goto EXIT;
+ }
+#endif
+ TaskSample();
LOS_Start();
}
-
+
+#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
+EXIT:
+#endif
while (1) {
__asm volatile("wfi");
}
diff --git a/targets/cortex-m4_stm32f429ig_fire-challenger_iar/project/los_demo.ewp b/targets/cortex-m4_stm32f429ig_fire-challenger_iar/project/los_demo.ewp
old mode 100755
new mode 100644
index 7ca8d51a..e3676e71
--- a/targets/cortex-m4_stm32f429ig_fire-challenger_iar/project/los_demo.ewp
+++ b/targets/cortex-m4_stm32f429ig_fire-challenger_iar/project/los_demo.ewp
@@ -11,7 +11,7 @@
General
3
- 30
+ 31
1
1
@@ -66,7 +66,7 @@
OGLastSavedByProductVersion
- 8.22.1.15696
+ 8.32.1.18618
GeneralEnableMisra
@@ -112,7 +112,7 @@
RTConfigPath2
- $TOOLKIT_DIR$\INC\c\DLib_Config_Full.h
+ $TOOLKIT_DIR$\inc\c\DLib_Config_Full.h
GBECoreSlave
@@ -204,13 +204,18 @@
TrustZone
0
+
+ TrustZoneModes
+ 0
+ 0
+
ICCARM
2
- 34
+ 35
1
1
@@ -472,6 +477,10 @@
IccRTTI2
0
+
+ OICompilerExtraOption
+ 1
+
@@ -692,7 +701,7 @@
ILINK
0
- 20
+ 22
1
1
@@ -1004,6 +1013,14 @@
IlinkLocaleSelect
1
+
+ IlinkTrustzoneImportLibraryOut
+ ###Unitialized###
+
+
+ OILinkExtraOption
+ 1
+
@@ -1043,7 +1060,7 @@
General
3
- 30
+ 31
1
0
@@ -1236,13 +1253,18 @@
TrustZone
0
+
+ TrustZoneModes
+ 0
+ 0
+
ICCARM
2
- 34
+ 35
1
0
@@ -1490,6 +1512,10 @@
IccRTTI2
0
+
+ OICompilerExtraOption
+ 1
+
@@ -1710,7 +1736,7 @@
ILINK
0
- 20
+ 22
1
0
@@ -2022,6 +2048,14 @@
IlinkLocaleSelect
1
+
+ IlinkTrustzoneImportLibraryOut
+ ###Unitialized###
+
+
+ OILinkExtraOption
+ 1
+
@@ -2116,9 +2150,15 @@
$PROJ_DIR$\..\..\..\kernel\src\los_queue.c
+
+ $PROJ_DIR$\..\..\..\kernel\src\los_sched.c
+
$PROJ_DIR$\..\..\..\kernel\src\los_sem.c
+
+ $PROJ_DIR$\..\..\..\kernel\src\los_sortlink.c
+
$PROJ_DIR$\..\..\..\kernel\src\los_swtmr.c
diff --git a/targets/cortex-m4_stm32f429ig_fire-challenger_iar/project/los_demo.ewt b/targets/cortex-m4_stm32f429ig_fire-challenger_iar/project/los_demo.ewt
index 79613153..6539647f 100644
--- a/targets/cortex-m4_stm32f429ig_fire-challenger_iar/project/los_demo.ewt
+++ b/targets/cortex-m4_stm32f429ig_fire-challenger_iar/project/los_demo.ewt
@@ -2431,9 +2431,15 @@
$PROJ_DIR$\..\..\..\kernel\src\los_queue.c
+
+ $PROJ_DIR$\..\..\..\kernel\src\los_sched.c
+
$PROJ_DIR$\..\..\..\kernel\src\los_sem.c
+
+ $PROJ_DIR$\..\..\..\kernel\src\los_sortlink.c
+
$PROJ_DIR$\..\..\..\kernel\src\los_swtmr.c
diff --git a/targets/cortex-m4_stm32f429ig_fire-challenger_iar/target_config.h b/targets/cortex-m4_stm32f429ig_fire-challenger_iar/target_config.h
index 6f6b8721..5302b43b 100755
--- a/targets/cortex-m4_stm32f429ig_fire-challenger_iar/target_config.h
+++ b/targets/cortex-m4_stm32f429ig_fire-challenger_iar/target_config.h
@@ -48,14 +48,17 @@ extern "C" {
/*=============================================================================
System clock module configuration
=============================================================================*/
-#define OS_SYS_CLOCK 64000000
+#define OS_SYS_CLOCK SystemCoreClock
#define LOSCFG_BASE_CORE_TICK_PER_SECOND (1000UL)
#define LOSCFG_BASE_CORE_TICK_HW_TIME 0
+#define LOSCFG_BASE_CORE_TICK_WTIMER 0
+#define LOSCFG_BASE_CORE_TICK_RESPONSE_MAX SysTick_LOAD_RELOAD_Msk
+
/*=============================================================================
Hardware interrupt module configuration
=============================================================================*/
#define LOSCFG_PLATFORM_HWI 1
-#define LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT 0
+#define LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT 1
#define LOSCFG_PLATFORM_HWI_LIMIT 128
/*=============================================================================
Task module configuration
@@ -65,7 +68,7 @@ extern "C" {
#define LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE (0x2D0U)
#define LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE (0x130U)
#define LOSCFG_BASE_CORE_TIMESLICE 1
-#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 10
+#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 20000
/*=============================================================================
Semaphore module configuration
=============================================================================*/
@@ -101,11 +104,12 @@ extern "C" {
============================================================================= */
#define LOSCFG_KERNEL_PRINTF 1
+#define LOSCFG_BASE_CORE_SCHED_SLEEP 1
+
#ifdef __cplusplus
#if __cplusplus
}
#endif /* __cplusplus */
#endif /* __cplusplus */
-
#endif /* _TARGET_CONFIG_H */
diff --git a/targets/cortex-m7_nucleo_f767zi_gcc/target_config.h b/targets/cortex-m7_nucleo_f767zi_gcc/target_config.h
index a49fbd69..f81cf09a 100644
--- a/targets/cortex-m7_nucleo_f767zi_gcc/target_config.h
+++ b/targets/cortex-m7_nucleo_f767zi_gcc/target_config.h
@@ -51,6 +51,9 @@ extern "C" {
#define OS_SYS_CLOCK 96000000
#define LOSCFG_BASE_CORE_TICK_PER_SECOND (1000UL)
#define LOSCFG_BASE_CORE_TICK_HW_TIME 0
+#define LOSCFG_BASE_CORE_TICK_WTIMER 0
+#define LOSCFG_BASE_CORE_TICK_RESPONSE_MAX SysTick_LOAD_RELOAD_Msk
+
/*=============================================================================
Hardware interrupt module configuration
=============================================================================*/
@@ -64,7 +67,7 @@ extern "C" {
#define LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE (0x2D0U)
#define LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE (0x130U)
#define LOSCFG_BASE_CORE_TIMESLICE 1
-#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 10
+#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 20000
/*=============================================================================
Semaphore module configuration
=============================================================================*/