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: - * + * * @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: * * @see None */ -extern VOID HalSysTickReload(UINT32 cyclesPerTick); - -/** - * @ingroup los_hwi - * @brief Get System cycle count. - * - * @par Description: - * - * @attention - * - * - * @param None. - * - * @retval: The value of the system cycle count. - * @par Dependency: - * - * @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: - * - * @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: - * - * @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: - * - * @attention - * - * - * @param None. - * - * @retval None. - * @par Dependency: - * - * @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 - * - * - * @param taskCB [IN] Type #LosTaskCB * pointer to task control block structure. - * @param priority [IN] Type #UINT16 the priority of task. - * - * @retval None. - * @par Dependency: - * - * @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: - * - * @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 - * - * - * @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: - * - * @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 - * - * - * @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: - * - * @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 - * - * - * @param taskCB [IN] Type #LosTaskCB * pointer to task control block structure. - * @param timeout [IN] Type #UINT32 wait time, ticks. - * - * @retval None. - * @par Dependency: - * - * @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 - * - * - * @param taskCB [IN] Type #LosTaskCB * pointer to task control block structure. - * - * @retval None. - * @par Dependency: - * - * @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: - * - * @attention - * - * - * @param None. - * - * @retval None. - * @par Dependency: - * - * @see None. - */ -extern VOID OsTimesliceInit(VOID); - -/** - * @ingroup los_timeslice - * @brief Check time slices. - * - * @par Description: - * - * @attention - * - * - * @param None. - * - * @retval None. - * @par Dependency: - * - * @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 + ICCARM 2 - 34 + 35 1 1 + @@ -692,7 +701,7 @@ ILINK 0 - 20 + 22 1 1 + + @@ -1043,7 +1060,7 @@ General 3 - 30 + 31 1 0 + ICCARM 2 - 34 + 35 1 0 + @@ -1710,7 +1736,7 @@ ILINK 0 - 20 + 22 1 0 + + @@ -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 =============================================================================*/