From 583d177de0d039aae73faec8d2dadc5ef344edca Mon Sep 17 00:00:00 2001 From: zhushengle Date: Fri, 23 Apr 2021 14:50:27 +0800 Subject: [PATCH 1/3] fix:Provide a CPU delay interface Close #I3NT3Y Change-Id: I30c984a95a77cbddabdae2900ab8fcf9d7eac1ac --- kal/cmsis/cmsis_liteos2.c | 2 +- kernel/src/los_task.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/kal/cmsis/cmsis_liteos2.c b/kal/cmsis/cmsis_liteos2.c index 4c741240..9d6cb289 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_SysDelay(ticks); } else { uwRet = LOS_TaskDelay(ticks); } diff --git a/kernel/src/los_task.c b/kernel/src/los_task.c index 8c226c34..c860f3c3 100644 --- a/kernel/src/los_task.c +++ b/kernel/src/los_task.c @@ -1296,3 +1296,17 @@ LITE_OS_SEC_TEXT_MINOR VOID LOS_Msleep(UINT32 mSecs) (VOID)LOS_TaskDelay(interval); } +VOID LOS_SysDelay(UINT32 ticks) +{ + UINT64 endTime; + + if (ticks == 0) { + return; + } + + endTime = LOS_SysCycleGet() + ticks * OS_CYCLE_PER_TICK; + while (LOS_SysCycleGet() < endTime) { + } + + return; +} From 9656d852ab7fa99d56131858d761e554e56665eb Mon Sep 17 00:00:00 2001 From: zhushengle Date: Fri, 23 Apr 2021 15:38:11 +0800 Subject: [PATCH 2/3] fix:Add LOS_SysDelay declaration. Close #I3NT3Y Change-Id: I14a1edc3f9aa06cba28ad51a12f21f6fdcf14fd0 --- kernel/include/los_task.h | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/kernel/include/los_task.h b/kernel/include/los_task.h index aae6d7d9..7bd594dd 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 ticks [IN] delay times. * * @retval: None. * @par Dependency: - * + * * @see None. */ -extern VOID LOS_Schedule(VOID); +extern VOID LOS_SysDelay(UINT32 ticks); /** * @ingroup los_cpup From adaf6cf7c56db5de56859e494998ab6222e08225 Mon Sep 17 00:00:00 2001 From: zhushengle Date: Fri, 23 Apr 2021 17:33:27 +0800 Subject: [PATCH 3/3] fix:Change the interface to LOS_UDelay and change the input parameter to microsecond. Close #I3NT3Y Change-Id: Iae33e0aff59480342b07bb4fd2e66969a09affb3 --- kal/cmsis/cmsis_liteos2.c | 2 +- kernel/arch/include/los_timer.h | 4 +--- kernel/include/los_task.h | 4 ++-- kernel/src/los_task.c | 8 +++++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/kal/cmsis/cmsis_liteos2.c b/kal/cmsis/cmsis_liteos2.c index 9d6cb289..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) { - LOS_SysDelay(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 7bd594dd..d1288f5a 100644 --- a/kernel/include/los_task.h +++ b/kernel/include/los_task.h @@ -1098,14 +1098,14 @@ extern CHAR* LOS_TaskNameGet(UINT32 taskID); * @attention: *
  • None.
* - * @param ticks [IN] delay times. + * @param UINT64 [IN] delay times, microseconds. * * @retval: None. * @par Dependency: *
  • los_task.h: the header file that contains the API declaration.
* @see None. */ -extern VOID LOS_SysDelay(UINT32 ticks); +extern VOID LOS_UDelay(UINT64 microseconds); /** * @ingroup los_cpup diff --git a/kernel/src/los_task.c b/kernel/src/los_task.c index c860f3c3..89561b0a 100644 --- a/kernel/src/los_task.c +++ b/kernel/src/los_task.c @@ -1296,15 +1296,17 @@ LITE_OS_SEC_TEXT_MINOR VOID LOS_Msleep(UINT32 mSecs) (VOID)LOS_TaskDelay(interval); } -VOID LOS_SysDelay(UINT32 ticks) +VOID LOS_UDelay(UINT64 microseconds) { UINT64 endTime; - if (ticks == 0) { + if (microseconds == 0) { return; } - endTime = LOS_SysCycleGet() + ticks * OS_CYCLE_PER_TICK; + 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) { }