1000毫秒等于多少秒(毫秒和秒的换算)
此账号为华为云开发者社区官方运营账号,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态
本文分享自华为云社区《鸿蒙轻内核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 和秒/毫秒进行转换。
下面,我们剖析下时间管理模块的源代码,若涉及开发板部分,以开发板工程 targets\cortex-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 中定义,如文件 targets\cortex-m7_nucleo_f767zi_gcc\target_config.h 中定义如下:#define OS_SYS_CLOCK 96000000 #define LOSCFG_BASE_CORE_TICK_PER_SECOND (1000UL) #define LOSCFG_BASE_CORE_TICK_HW_TIME 01.2 时间管理初始化和启动
函数 INT32 main(VOID)会调用 kernel\src\los_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)定义在 kernel\arch\arm\cortex-m7\gcc\los_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)定义在文件 kernel\arch\arm\cortex-m7\gcc\los_timer.c,源码如下,我们分析下函数的代码实现。⑴处校验下时间管理模块的配置项的合法性。在开启宏 LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT 时,会使用系统定义的中断。会执行⑵处的代码,调用定义在文件 kernel\arch\arm\cortex-m7\gcc\los_interrupt.c 中的函数 OsSetVector()设置中断向量,该函数在中断系列会详细分析。⑶处设置全局变量 g_sysClock 为系统时钟,g_cyclesPerTick 为每 tick 对应的 cycle 数目,g_ullTickCount 初始化为 0,表示系统 tick 中断发生次数。⑷处调用定义在 targets\cortex-m7_nucleo_f767zi_gcc\Drivers\CMSIS\Include\core_cm7.h 文件中的内联函数 uint32_t SysTick_Config(uint32_t ticks),初始化、启动系统定时器 Systick 和中断。WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler) { UINT32 ret; ⑴ if ((OS_SYS_CLOCK == 0) || (LOSCFG_BASE_CORE_TICK_PER_SECOND == 0) || (LOSCFG_BASE_CORE_TICK_PER_SECOND
红色配什么颜色好看(正红色配什么颜色最搭)女人到了50岁或者是60岁,这两个年龄阶段虽大不如从前,但是也可以一样美的很有韵味,主要在搭配方面,更注重配色的选择,穿搭才会展现出更贵气的效果。相信大部分老年人都喜欢穿红色,红色
cad如何测量面积(cad自动算面积命令)本文介绍AutoCAD测量面积的实用知识点。该知识点平时可能用得少,但还是要求对该知识点了解乃至掌握。本文内容为本文作者编著图书AutoCAD2022快速入门与实战(作者钟日铭出版
如何制作糖(如何制作白糖)在一个地方生活,或多或少会有些食物的印记。每一次只要提到这种食物,就会马上确认自己曾经吃过,自己曾在产这种食物的地方生活过。小时候,我特别喜欢吃打白糖,即使到现在,每次吃到这个,都
如何制作冰(有颜色的冰块怎么做)自制冰饮透心凉,驱暑气,随手取材做粉紫色冰球,纯天然有颜值。大热天就想躲在屋子里避避暑,为了平衡体内外的温度,不到三伏天我不开空调。解暑的方法我有不少,除了不离手的大蒲扇不停摇头的
ps如何框选(ps制作qq图标详细步骤)PS工具入门第二课选框工具的使用方法与技巧(PSCC2018版)矩形选框工具和椭圆选框工具,它的作用就是选定一个区域内进行操作,只对选区内的(当前图层)操作才启作用。工具属性栏的参
月子中心如何(月子中心护士)这次我们对于月子中心的选址定位在了成都的太古里地区。成都,四川省辖地级市,简称蓉,别称蓉城锦城,是四川省省会副省级市超大城市国家中心城市成渝地区双城经济圈核心城市国家重要的高新技术
脾虚如何调理脾(怎么样为脾虚)现在胃不好的人有很多,很多人胃一不舒服了就会自行吃点胃药来缓解,但其实这或许是治标不治本,从中医的角度上来讲,胃好不好跟脾的关系是很大的,脾宜升则健,胃宜降则和,脾胃是相辅相成的,
如何加强党的建设(社会如何加强党的建设)党的基层组织建设是保持党的先进性提高党的执政能力的重要基础。如何加强党的基层组织建设,成为社会的重点。加强党的基层组织建设关键在于抓好基层党组织的班子建设队伍建设宣传和组织的载体建
癣如何治疗(祖传秘方专治各种皮肤癣症)体癣足癣,有两个特点,一是给生活带来不便,比如足癣(脚气)让人瘙痒难耐,还易引起脚臭,而体癣导致的皮肤异常也让人尴尬不已二是易反复难根治。今天介绍一个非常简单的外用偏方,可以根治体
如何添加微信小程序(微信里面怎么添加小程序功能)平常我们打开之后,才能打开小程序,为了能快速打开频繁使用的小程序,将小程序直接添加到手机桌面上,使用更加方便快捷。部分用户在小程序内点击添加到桌面,但并未在手机桌面上找到小程序图标
如何清洗空调滤网(小米空调怎么清洗过滤网)夏天即将到来,空调的使用高峰期也即将到来。空调使用三个月,过滤网会非常脏。脏的过滤网会影响空调送风状态(有异味),且非常影响家人健康(细菌滋生),在这里就不影响大家的胃口放图片了。