From 762f964222bb916ddac1da1ba413e041ab8ce53c Mon Sep 17 00:00:00 2001 From: weitong <494475907@qq.com> Date: Mon, 4 Dec 2023 17:38:46 +0800 Subject: [PATCH] 12.04 --- core/los_sys.c | 34 +++++++++++++++++++++++++++++++++- core/los_tick.c | 29 +++++++++++++++++++++++++++-- 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/core/los_sys.c b/core/los_sys.c index 8a9d373..4d9b586 100644 --- a/core/los_sys.c +++ b/core/los_sys.c @@ -29,44 +29,76 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + + /* + LOS_TickCountGet():获取当前的系统节拍数。通过调用OsGetCurrSchedTimeCycle()函数获取当前调度时间周期,并将其除以每个节拍的周期数,得到节拍数。 + + LOS_CyclePerTickGet():获取每个节拍的周期数。通过将系统时钟频率除以每秒节拍数,得到每个节拍的周期数。 + + LOS_MS2Tick():将毫秒转换为节拍数。将给定的毫秒数乘以每秒节拍数,再除以每秒毫秒数,得到节拍数。 + + LOS_Tick2MS():将节拍数转换为毫秒。将给定的节拍数乘以每秒毫秒数,再除以每秒节拍数,得到毫秒数。 + + OsNS2Tick():将纳秒转换为节拍数。首先计算每个节拍的纳秒数,然后将给定的纳秒数加上每个节拍的纳秒数减1,再除以每个节拍的纳秒数,得到节拍数。如果节拍数超过最大值,则将其设置为最大值。 + */ + #include "los_sys_pri.h" #include "los_sched_pri.h" - + // 定义最大值 #define OS_MAX_VALUE 0xFFFFFFFFUL +// 获取当前的系统节拍数 LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID) { + // 调用内部函数获取当前调度时间周期并除以每个节拍的周期数,得到节拍数 return OsGetCurrSchedTimeCycle() / OS_CYCLE_PER_TICK; } +// 获取每个节拍的周期数 LITE_OS_SEC_TEXT_MINOR UINT32 LOS_CyclePerTickGet(VOID) { + // 返回系统时钟频率除以每秒节拍数,得到每个节拍的周期数 return g_sysClock / LOSCFG_BASE_CORE_TICK_PER_SECOND; } +// 将毫秒转换为节拍数 LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MS2Tick(UINT32 millisec) { + // 如果毫秒数等于最大值,直接返回最大值 if (millisec == OS_MAX_VALUE) { return OS_MAX_VALUE; } + // 将毫秒数乘以每秒节拍数,再除以每秒毫秒数,得到节拍数 return ((UINT64)millisec * LOSCFG_BASE_CORE_TICK_PER_SECOND) / OS_SYS_MS_PER_SECOND; } +// 将节拍数转换为毫秒 LITE_OS_SEC_TEXT_MINOR UINT32 LOS_Tick2MS(UINT32 tick) { + // 将节拍数乘以每秒毫秒数,再除以每秒节拍数,得到毫秒数 return ((UINT64)tick * OS_SYS_MS_PER_SECOND) / LOSCFG_BASE_CORE_TICK_PER_SECOND; } +// 将纳秒转换为节拍数 LITE_OS_SEC_TEXT_MINOR UINT32 OsNS2Tick(UINT64 nanoseconds) { + // 每个节拍的纳秒数 const UINT32 nsPerTick = OS_SYS_NS_PER_SECOND / LOSCFG_BASE_CORE_TICK_PER_SECOND; + // 将纳秒数加上每个节拍的纳秒数减1,再除以每个节拍的纳秒数,得到节拍数 UINT64 ticks = (nanoseconds + nsPerTick - 1) / nsPerTick; + + // 如果节拍数超过最大值,将其设置为最大值 if (ticks > OS_MAX_VALUE) { ticks = OS_MAX_VALUE; } + + // 将节拍数转换为32位整数并返回 return (UINT32)ticks; } + + + diff --git a/core/los_tick.c b/core/los_tick.c index b5c2794..7544c0b 100644 --- a/core/los_tick.c +++ b/core/los_tick.c @@ -29,6 +29,22 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + + + /* + 函数意义 + g_sysClock:系统时钟频率,用于记录系统的时钟频率。 + + g_tickPerSecond:每秒节拍数,用于记录每秒钟发生的节拍数。 + + g_cycle2NsScale:循环周期到纳秒的缩放比例,用于将节拍周期转换为纳秒。 + + g_tickSpin:任务模块的自旋锁,用于保护对任务模块的访问。 + + OsTickHandler():节拍中断处理函数,处理与节拍相关的操作。在函数内部,可能会进行一些特定平台的操作,如调试记录数据、更新虚拟动态共享对象(VDSO)的时间值等。然后调用OsSchedTick()函数,处理调度器的节拍操作。 + */ + + #include "los_tick_pri.h" #include "los_swtmr_pri.h" #include "los_sched_pri.h" @@ -36,17 +52,22 @@ #include "los_vdso.h" #endif - + // 系统时钟频率 LITE_OS_SEC_DATA_INIT UINT32 g_sysClock; + +// 每秒节拍数 LITE_OS_SEC_DATA_INIT UINT32 g_tickPerSecond; + +// 循环周期到纳秒的缩放比例 LITE_OS_SEC_BSS DOUBLE g_cycle2NsScale; -/* spinlock for task module */ +// 任务模块的自旋锁 LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_tickSpin); /* * Description : Tick interruption handler */ + // 节拍中断处理函数 LITE_OS_SEC_TEXT VOID OsTickHandler(VOID) { #ifdef LOSCFG_SCHED_TICK_DEBUG @@ -61,6 +82,10 @@ LITE_OS_SEC_TEXT VOID OsTickHandler(VOID) HalClockIrqClear(); /* diff from every platform */ #endif + // 调度器的节拍处理函数 OsSchedTick(); } + + +