1000毫秒等于多少秒 毫秒和秒的换算


1000毫秒等于多少秒 毫秒和秒的换算

文章插图
?????????????????此账号为华为云开发者社区官方运营账号 , 提供全面深入的云计算前景分析、丰富的技术干货、程序样例 , 分享华为云前沿资讯动态
WWw.kemAOWaNG 。oRG 。cN
本文分享自华为云社区《鸿蒙轻内核M核源码分析系列六 时间管理》 , 原文作者:zhushy。
本文会继续分析 Tick 和时间相关的源码 , 给读者介绍鸿蒙轻内核的时间管理模块 。本文中所涉及的源码 , 以 OpenHarmony LiteOS-M 内核为例 , 均可以在开源站点https://gitee.com/openharmony/kernel_liteos_m 获取 。
时间管理模块以系统时钟为基础 , 可以分为 2 部分 , 一部分是 SysTick 中断 , 为任务调度提供必要的时钟节拍;另外一部分是 , 给应用程序提供所有和时间有关的服务 , 如时间转换、统计功能 。
系统时钟是由定时器/计数器产生的输出脉冲触发中断产生的 , 一般定义为整数或长整数 。输出脉冲的周期叫做一个“时钟滴答” , 也称为时标或者 Tick 。Tick 是操作系统的基本时间单位 , 由用户配置的每秒 Tick 数决定 。如果用户配置每秒的 Tick 数目为 1000 , 则 1 个 Tick 等于 1ms 的时长 。另外一个计时单位是 Cycle , 这是系统最小的计时单位 。Cycle 的时长由系统主时钟频率决定 , 系统主时钟频率就是每秒钟的 Cycle 数 , 对于 216 MHz 的 CPU , 1 秒产生 216000000 个 cycles 。
用户以秒、毫秒为单位计时 , 而操作系统以 Tick 为单位计时 , 当用户需要对系统进行操作时 , 例如任务挂起、延时等 , 此时可以使用时间管理模块对 Tick 和秒/毫秒进行转换 。
下面 , 我们剖析下时间管理模块的源代码 , 若涉及开发板部分 , 以开发板工程 targetscortex-m7_nucleo_f767zi_gcc为例进行源码分析 。
1、时间管理初始化和启动
我们先看下时间管理模块的相关配置 , 然后再剖析如何初始化 , 如何启动 。
1.1 时间管理相关的配置
时间管理模块涉及 3 个配置项 , 系统时钟 OS_SYS_CLOCK、每秒 Tick 数目 LOSCFG_BASE_CORE_TICK_PER_SECOND 两个配置选项 , 还有宏 LOSCFG_BASE_CORE_TICK_HW_TIME 。LOSCFG_BASE_CORE_TICK_HW_TIME 默认关闭 , 开启时 , 需要提供定制函数 VOID platform_tick_handler(VOID) , 在 Tick 中断处理函数中执行定制操作 。这些配置项在模板开发板工程目录的文件 target_config.h 中定义 , 如文件 targetscortex-m7_nucleo_f767zi_gcctarget_config.h 中定义如下:
#define OS_SYS_CLOCK96000000
#define LOSCFG_BASE_CORE_TICK_PER_SECOND(1000UL)
#define LOSCFG_BASE_CORE_TICK_HW_TIME0
1.2 时间管理初始化和启动
WWw.kemAOWaNG 。oRG 。cN
函数 INT32 main(VOID)会调用 kernelsrclos_init.c 中的函数 UINT32 LOS_Start(VOID)启动系统 , 该函数会调用启动调度函数 UINT32 HalStartSchedule(OS_TICK_HANDLER handler) 。源码如下:
LITE_OS_SEC_TEXT_INIT UINT32 LOS_Start(VOID)
{
return HalStartSchedule(OsTickHandler);
}
?函数 UINT32 HalTickStart(OS_TICK_HANDLER *handler)定义在 kernelarcharmcortex-m7gcclos_context.c , 源码如下 。其中函数参数为 Tick 中断处理函数 OsTickHandler() , 后文会分析该 tick 中断处理函数 。⑴处代码继续调用函数进一步调用函数 HalTickStart(handler)来设置 Tick 中断启动 。⑵处会调用汇编函数 HalStartToRun 开始运行系统 , 后续任务调度系列再详细分析该汇编函数 。
LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler)
{
UINT32 ret;
⑴ret = HalTickStart(handler);
if (ret != LOS_OK) {
return ret;
}
⑵HalStartToRun();
return LOS_OK; /* never return */
}
函数 HalTickStart(handler)定义在文件 kernelarcharmcortex-m7gcclos_timer.c , 源码如下 , 我们分析下函数的代码实现 。⑴处校验下时间管理模块的配置项的合法性 。在开启宏 LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT 时 , 会使用系统定义的中断 。会执行⑵处的代码 , 调用定义在文件 kernelarcharmcortex-m7gcclos_interrupt.c 中的函数 OsSetVector()设置中断向量 , 该函数在中断系列会详细分析 。⑶处设置全局变量 g_sysClock 为系统时钟 , g_cyclesPerTick 为每 tick 对应的 cycle 数目 , g_ullTickCount 初始化为 0 , 表示系统 tick 中断发生次数 。⑷处调用定义在 targetscortex-m7_nucleo_f767zi_gccDriversCMSISIncludecore_cm7.h 文件中的内联函数 uint32_t SysTick_Config(uint32_t ticks) , 初始化、启动系统定时器 Systick 和中断 。