1# 时间管理 2 3 4## 基本概念 5 6时间管理以系统时钟为基础。时间管理提供给应用程序所有和时间有关的服务。系统时钟是由定时/计数器产生的输出脉冲触发中断而产生的,一般定义为整数或长整数。输出脉冲的周期叫做一个“时钟滴答”。 7 8系统时钟也称为时标或者Tick。一个Tick的时长可以静态配置。用户是以秒、毫秒为单位计时,而操作系统时钟计时是以Tick为单位的,当用户需要对系统操作时,例如任务挂起、延时等,输入秒为单位的数值,此时需要时间管理模块对二者进行转换。 9 10**Tick与秒之间的对应关系可以配置。** 11 12- **Cycle** 13 系统最小的计时单位。Cycle的时长由系统主频决定,系统主频就是每秒钟的Cycle数。 14 15- **Tick** 16 Tick是操作系统的基本时间单位,对应的时长由系统主频及每秒Tick数决定,由用户配置。 17 18**OpenHarmony系统的时间管理模块提供时间转换、统计、延迟功能以满足用户对时间相关需求的实现。** 19 20 21## 开发指导 22 23用户需要了解当前系统运行的时间以及Tick与秒、毫秒之间的转换关系,以及需要使用到时间管理模块的接口。 24 25 26### 接口说明 27 28OpenHarmony LiteOS-A内核的时间管理提供以下几种功能,接口详细信息可查看API参考。 29 30 **表1** 时间管理相关接口说明: 31 32| 功能分类 | 接口描述 | 33| -------- | ------------------------------------------------------------ | 34| 时间转换 | LOS_MS2Tick:毫秒转换成Tick<br/>LOS_Tick2MS:Tick转换成毫秒 | 35| 时间统计 | LOS_TickCountGet:获取当前Tick数<br/>LOS_CyclePerTickGet:每个Tick的cycle数 | 36 37 38### 开发流程 39 401. 调用时间转换接口; 41 422. 获取系统Tick数完成时间统计等。 43 44> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** 45> 46> - 获取系统Tick数需要在系统时钟使能之后。 47> 48> - 时间管理不是单独的功能模块,依赖于los_config.h中的OS_SYS_CLOCK和LOSCFG_BASE_CORE_TICK_PER_SECOND两个配置选项。 49> 50> - 系统的Tick数在关中断的情况下不进行计数,故系统Tick数不能作为准确时间计算。 51 52 53### 编程实例 54 55前置条件: 56 57- 配置好LOSCFG_BASE_CORE_TICK_PER_SECOND,即系统每秒的Tick数,范围(0, 1000)。 58 59- 配置好OS_SYS_CLOCK 系统时钟频率,单位:Hz。 60 61**示例代码** 62 63 时间转换: 64 65``` 66VOID Example_TransformTime(VOID) 67{ 68 UINT32 uwMs; 69 UINT32 uwTick; 70 uwTick = LOS_MS2Tick(10000); //10000 ms数转换为Tick数 71 PRINTK("uwTick = %d \n",uwTick); 72 uwMs= LOS_Tick2MS(100); //100 Tick数转换为ms数 73 PRINTK("uwMs = %d \n",uwMs); 74} 75``` 76 77时间统计和时间延迟: 78 79 80``` 81VOID Example_GetTime(VOID) 82{ 83 UINT32 uwcyclePerTick; 84 UINT64 uwTickCount; 85 86 uwcyclePerTick = LOS_CyclePerTickGet(); //每个Tick多少Cycle数 87 if(0 != uwcyclePerTick) 88 { 89 PRINTK("LOS_CyclePerTickGet = %d \n", uwcyclePerTick); 90 } 91 92 uwTickCount = LOS_TickCountGet(); //获取Tick数 93 if(0 != uwTickCount) 94 { 95 PRINTK("LOS_TickCountGet = %d \n", (UINT32)uwTickCount); 96 } 97 LOS_TaskDelay(200);//延迟200 Tick 98 uwTickCount = LOS_TickCountGet(); 99 if(0 != uwTickCount) 100 { 101 PRINTK("LOS_TickCountGet after delay = %d \n", (UINT32)uwTickCount); 102 } 103} 104``` 105 106**结果验证** 107 108编译运行的结果如下: 109 110时间转换: 111 112 113``` 114uwTick = 10000 115uwMs = 100 116``` 117 118时间统计和时间延迟: 119 120 121``` 122LOS_CyclePerTickGet = 49500 123LOS_TickCountGet = 347931 124LOS_TickCountGet after delay = 348134 125```