1# 内核定时器 2 3## 1. 简介 4 5  内核定时器是内核中的一种定时器,内核定时器的工作方式是:添加定时器到队列,为每个定时器设置到期时间。当定时器到期时,会执行定时器对应的函数。 6 7## 2. 设计思路 8 9  定时器类型为`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  **如果只是希望当前pcb休眠一段时间,应调用`schedule_timeout(timeout)`,timeout指定pcb休眠的时间长度。** 12 13## 3. 定时器应实现的特性 14 15  定时器要执行的函数应实现`TimerFunction`特性,其定义如下: 16 17```rust 18/// 定时器要执行的函数的特征 19pub trait TimerFunction: Send + Sync { 20 fn run(&mut self); 21} 22``` 23 24  一种典型的实现方式是:新建一个零长的结构体,实现`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  **若想要在.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  让进程休眠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  获取队列中第一个定时器的结束时间,即最早结束的定时器的结束时间 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  获取当前系统时间(单位:**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  计算接下来n**毫秒**对应的定时器时间片 110 111**参数** 112 113- expire_ms:n毫秒 114 115**返回值** 116 117  对应的定时器时间片(单位:**毫秒**) 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  计算接下来n**微秒**对应的定时器时间片 128 129**参数** 130 131- expire_ms:n微秒 132 133**返回值** 134 135  对应的定时器时间片(单位:**微秒**) 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