diff --git a/kal/cmsis/cmsis_liteos2.c b/kal/cmsis/cmsis_liteos2.c index 4c741240..9aa795b6 100644 --- a/kal/cmsis/cmsis_liteos2.c +++ b/kal/cmsis/cmsis_liteos2.c @@ -639,7 +639,7 @@ osStatus_t osDelay(uint32_t ticks) return osOK; } if (osKernelGetState() != osKernelRunning) { - HalDelay(ticks); + LOS_UDelay(ticks * OS_US_PER_TICK); } else { uwRet = LOS_TaskDelay(ticks); } diff --git a/kernel/arch/include/los_timer.h b/kernel/arch/include/los_timer.h index bc09a703..498f02c4 100644 --- a/kernel/arch/include/los_timer.h +++ b/kernel/arch/include/los_timer.h @@ -67,9 +67,7 @@ VOID HalClearSysSleepFlag(VOID); VOID HalEnterSleep(LOS_SysSleepEnum sleep); -VOID HalDelay(UINT32 ticks); - - /** +/** * @ingroup los_timer * @brief Get systick cycle. * diff --git a/kernel/include/los_task.h b/kernel/include/los_task.h index aae6d7d9..d1288f5a 100644 --- a/kernel/include/los_task.h +++ b/kernel/include/los_task.h @@ -1088,25 +1088,24 @@ extern UINT32 LOS_NewTaskIDGet(VOID); */ extern CHAR* LOS_TaskNameGet(UINT32 taskID); - /* * - * @ingroup los_hw - * @brief: Function to determine whether task scheduling is required. + * @ingroup los_task + * @brief: cpu delay. * * @par Description: - * This API is used to Judge and entry task scheduling. + * This API is used to cpu delay, no task switching. * * @attention: * * - * @param None. + * @param UINT64 [IN] delay times, microseconds. * * @retval: None. * @par Dependency: - * + * * @see None. */ -extern VOID LOS_Schedule(VOID); +extern VOID LOS_UDelay(UINT64 microseconds); /** * @ingroup los_cpup diff --git a/kernel/src/los_task.c b/kernel/src/los_task.c index 8c226c34..89561b0a 100644 --- a/kernel/src/los_task.c +++ b/kernel/src/los_task.c @@ -1296,3 +1296,19 @@ LITE_OS_SEC_TEXT_MINOR VOID LOS_Msleep(UINT32 mSecs) (VOID)LOS_TaskDelay(interval); } +VOID LOS_UDelay(UINT64 microseconds) +{ + UINT64 endTime; + + if (microseconds == 0) { + return; + } + + endTime = (microseconds / OS_SYS_US_PER_SECOND) * OS_SYS_CLOCK + + (microseconds % OS_SYS_US_PER_SECOND) * OS_SYS_CLOCK / OS_SYS_US_PER_SECOND; + endTime = LOS_SysCycleGet() + endTime; + while (LOS_SysCycleGet() < endTime) { + } + + return; +}