kernel-small-basic-time.md 3.4 KB
Newer Older
D
duangavin123 已提交
1
# 时间管理
D
duangavin123 已提交
2 3


D
duangavin123 已提交
4
## 基本概念
D
duangavin123 已提交
5 6 7 8 9

时间管理以系统时钟为基础。时间管理提供给应用程序所有和时间有关的服务。系统时钟是由定时/计数器产生的输出脉冲触发中断而产生的,一般定义为整数或长整数。输出脉冲的周期叫做一个“时钟滴答”。系统时钟也称为时标或者Tick。一个Tick的时长可以静态配置。用户是以秒、毫秒为单位计时,而操作系统时钟计时是以Tick为单位的,当用户需要对系统操作时,例如任务挂起、延时等,输入秒为单位的数值,此时需要时间管理模块对二者进行转换。

Tick与秒之间的对应关系可以配置。

D
duangavin123 已提交
10 11
- **Cycle**
  系统最小的计时单位。Cycle的时长由系统主频决定,系统主频就是每秒钟的Cycle数。
D
duangavin123 已提交
12

D
duangavin123 已提交
13 14
- **Tick**
  Tick是操作系统的基本时间单位,对应的时长由系统主频及每秒Tick数决定,由用户配置。
D
duangavin123 已提交
15

D
duangavin123 已提交
16
OpenHarmony系统的时间管理模块提供时间转换、统计、延迟功能以满足用户对时间相关需求的实现。
D
duangavin123 已提交
17 18


D
duangavin123 已提交
19
## 开发指导
D
duangavin123 已提交
20

D
duangavin123 已提交
21
用户需要了解当前系统运行的时间以及Tick与秒、毫秒之间的转换关系时,需要使用到时间管理模块的接口。
D
duangavin123 已提交
22 23


D
duangavin123 已提交
24
### 接口说明
D
duangavin123 已提交
25

D
duangavin123 已提交
26
OpenHarmony LiteOS-A内核的时间管理提供下面几种功能,接口详细信息可以查看API参考。
D
duangavin123 已提交
27

D
duangavin123 已提交
28
  **表1** 时间管理相关接口说明
D
duangavin123 已提交
29

D
duangavin123 已提交
30 31 32 33
| 功能分类 | 接口描述 | 
| -------- | -------- |
| 时间转换 | LOS_MS2Tick:毫秒转换成Tick<br/>LOS_Tick2MS:Tick转换成毫秒 | 
| 时间统计 | LOS_TickCountGet:获取当前Tick数<br/>LOS_CyclePerTickGet:每个Tick的cycle数 | 
D
duangavin123 已提交
34 35


D
duangavin123 已提交
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
### 开发流程

1. 调用时间转换接口;

2. 获取系统Tick数完成时间统计等。

> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> - 获取系统Tick数需要在系统时钟使能之后。
> 
> - 时间管理不是单独的功能模块,依赖于los_config.h中的OS_SYS_CLOCK和LOSCFG_BASE_CORE_TICK_PER_SECOND两个配置选项。
> 
> - 系统的Tick数在关中断的情况下不进行计数,故系统Tick数不能作为准确时间计算。


### 编程实例
D
duangavin123 已提交
51 52 53

前置条件:

D
duangavin123 已提交
54 55 56
- 配置好LOSCFG_BASE_CORE_TICK_PER_SECOND,即系统每秒的Tick数。

- 配置好OS_SYS_CLOCK 系统时钟频率,单位:Hz。
D
duangavin123 已提交
57 58 59

**示例代码**

D
duangavin123 已提交
60 61
  时间转换:
  
D
duangavin123 已提交
62 63 64 65 66 67 68 69 70 71 72 73 74 75
```
VOID Example_TransformTime(VOID)
{
    UINT32 uwMs;
    UINT32 uwTick;
    uwTick = LOS_MS2Tick(10000); //10000 ms数转换为Tick数
    PRINTK("uwTick = %d \n",uwTick);
    uwMs= LOS_Tick2MS(100); //100 Tick数转换为ms数
    PRINTK("uwMs = %d \n",uwMs);
}
```

时间统计和时间延迟:

D
duangavin123 已提交
76
  
D
duangavin123 已提交
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
```
VOID Example_GetTime(VOID)
{
    UINT32 uwcyclePerTick;
    UINT64 uwTickCount;

    uwcyclePerTick = LOS_CyclePerTickGet(); //每个Tick多少Cycle数
    if(0 != uwcyclePerTick)
    {
        PRINTK("LOS_CyclePerTickGet = %d \n", uwcyclePerTick);
    }

    uwTickCount = LOS_TickCountGet(); //获取Tick数
    if(0 != uwTickCount)
    {
        PRINTK("LOS_TickCountGet = %d \n", (UINT32)uwTickCount);
    }
    LOS_TaskDelay(200);//延迟200 Tick
    uwTickCount = LOS_TickCountGet();
    if(0 != uwTickCount)
    {
        PRINTK("LOS_TickCountGet after delay = %d \n", (UINT32)uwTickCount);
    }
}
```

**结果验证**

编译运行的结果如下:

时间转换:

D
duangavin123 已提交
109
  
D
duangavin123 已提交
110 111 112 113 114 115 116
```
uwTick = 10000 
uwMs = 100
```

时间统计和时间延迟:

D
duangavin123 已提交
117
  
D
duangavin123 已提交
118 119 120 121 122
```
LOS_CyclePerTickGet = 49500 
LOS_TickCountGet = 5042
LOS_TickCountGet after delay = 5242
```