xref: /DragonOS/docs/kernel/sched/kernel_timer.md (revision fae6e9ade46a52976ad5d099643d51cc20876448)
1# 内核定时器
2
3## 1. 简介
4
5  内核定时器是内核中的一种定时器,内核定时器的工作方式是:添加定时器到队列,为每个定时器设置到期时间。当定时器到期时,会执行定时器对应的函数。
6
7## 2. 设计思路
8
9&emsp;&emsp;定时器类型为`Timer`结构体,而`Timer`由`SpinLock<InnerTimer>`组成。全局中使用元素类型为`Arc<Timer>`的队列`TIMER_LIST`存储系统创建的定时器。创建定时器时,应调用`Timer::new(timer_func,expire_jiffies)`,timer_func为定时器要执行的操作,expire_jiffies为定时器的结束时间,`timer_func`参数的类型是实现了`TimerFunction`特性的结构体。在创建定时器后,应使用`Timer::activate()`将定时器插入到`TIMER_LIST`中。
10
11&emsp;&emsp;**如果只是希望当前pcb休眠一段时间,应调用`schedule_timeout(timeout)`,timeout指定pcb休眠的时间长度。**
12
13## 3. 定时器应实现的特性
14
15&emsp;&emsp;定时器要执行的函数应实现`TimerFunction`特性,其定义如下:
16
17```rust
18/// 定时器要执行的函数的特征
19pub trait TimerFunction: Send + Sync {
20    fn run(&mut self);
21}
22```
23
24&emsp;&emsp;一种典型的实现方式是:新建一个零长的结构体,实现`TimerFunction`特性,然后在`run`函数中实现定时器要执行的操作。
25
26## 4. 定时器API
27
28### 4.1. Timer的API
29
30#### 4.1.1. 创建一个定时器
31```rust
32pub fn new(timer_func: Box<dyn TimerFunction>, expire_jiffies: u64) -> Arc<Self>
33```
34
35**参数**
36
37- timer_func:定时器需要执行的函数对应的结构体,其实现了`TimerFunction`特性
38
39- expire_jiffies:定时器结束时刻(单位:**jiffies**)
40
41**返回**
42
43- 定时器结构体指针
44
45#### 4.1.2. 将定时器插入到定时器链表中
46
47```rust
48pub fn activate(&self)
49```
50
51### 4.2. 其余API
52
53&emsp;&emsp;**若想要在.c的模块中使用以下函数,请在函数名之前加上rs_**
54
55#### 4.2.1. 让进程休眠一段时间
56
57```rust
58pub fn schedule_timeout(mut timeout: i64) -> Result<i64, SystemError>
59```
60
61**功能**
62
63&emsp;&emsp;让进程休眠timeout个jiffies
64
65**参数**
66
67- timeout:需要休眠的时间 (单位:**jiffies**)
68
69**返回值**
70
71- Ok(i64):剩余需要休眠的时间 (单位:**jiffies**)
72- Err(SystemError):错误码
73
74#### 4.2.2. 获取队列中第一个定时器的结束时间
75
76```rust
77pub fn timer_get_first_expire() -> Result<u64, SystemError>
78```
79
80**功能**
81
82&emsp;&emsp;获取队列中第一个定时器的结束时间,即最早结束的定时器的结束时间
83
84**返回值**
85
86- Ok(i64):最早结束的定时器的结束时间 (单位:**jiffies**)
87- Err(SystemError):错误码
88
89#### 4.2.3. 获取当前系统时间
90
91```rust
92pub fn clock() -> u64
93```
94
95**功能**
96
97&emsp;&emsp;获取当前系统时间(单位:**jiffies**)
98
99#### 4.2.4. 计算接下来n毫秒或者微秒对应的定时器时间片
100
101##### 4.2.4.1. 毫秒
102
103```rust
104pub fn next_n_ms_timer_jiffies(expire_ms: u64) -> u64
105```
106
107**功能**
108
109&emsp;&emsp;计算接下来n**毫秒**对应的定时器时间片
110
111**参数**
112
113- expire_ms:n毫秒
114
115**返回值**
116
117&emsp;&emsp;对应的定时器时间片(单位:**毫秒**)
118
119##### 4.2.4.2. 微秒
120
121```rust
122pub fn next_n_us_timer_jiffies(expire_us: u64) -> u64
123```
124
125**功能**
126
127&emsp;&emsp;计算接下来n**微秒**对应的定时器时间片
128
129**参数**
130
131- expire_ms:n微秒
132
133**返回值**
134
135&emsp;&emsp;对应的定时器时间片(单位:**微秒**)
136
137## 5. 创建定时器实例
138
139```rust
140struct TimerExample {
141    /// 结构体的成员对应函数的形参
142    example_parameter: i32,
143}
144impl TimerExample {
145    pub fn new(para: i32) -> Box<TimerExample> {
146        return Box::new(TimerExample {
147            example_parameter: para,
148        });
149    }
150}
151/// 为结构体实现TimerFunction特性
152impl TimerFunction for TimerExample {
153    /// TimerFunction特性中的函数run
154    fn run(&mut self) {
155        // 定时器需要执行的操作
156        example_func(self.example_parameter);
157    }
158}
159fn example_func(para: i32) {
160    println!("para is {:?}", para);
161}
162fn main() {
163    let timer_example: Box<TimerExample> = TimerExample::new(1);
164    // 创建一个定时器
165    let timer: Arc<Timer> = Timer::new(timer_example, 1);
166    // 将定时器插入队列
167    timer.activate();
168}
169```
170