备注
AI Translation Notice
This document was automatically translated by Qwen/Qwen3-8B
model, for reference only.
Source document: kernel/sched/kernel_timer.md
Translation time: 2025-05-19 01:41:48
Translation model:
Qwen/Qwen3-8B
Please report issues via Community Channel
Kernel Timer
1. Introduction
The kernel timer is a type of timer within the kernel. The working mechanism of the kernel timer is: adding the timer to a queue and setting the expiration time for each timer. When the timer expires, the function corresponding to the timer is executed.
2. Design Concept
The timer type is a structure of Timer
, and Timer
is composed of SpinLock<InnerTimer>
. A global queue TIMER_LIST
with element type Arc<Timer>
is used to store the timers created by the system. When creating a timer, you should call Timer::new(timer_func,expire_jiffies)
, where timer_func is the function to be executed by the timer, expire_jiffies is the expiration time of the timer, and the type of timer_func
parameter is a structure that implements the TimerFunction
characteristic. After creating the timer, you should use Timer::activate()
to insert the timer into TIMER_LIST
.
If you only want the current PCB to sleep for a certain period, you should call schedule_timeout(timeout)
, and timeout specifies the duration of the PCB sleep.
3. Features That the Timer Should Implement
The function to be executed by the timer should implement the TimerFunction
characteristic, and its definition is as follows:
/// 定时器要执行的函数的特征
pub trait TimerFunction: Send + Sync {
fn run(&mut self);
}
A typical implementation method is: creating a zero-length structure, implementing the TimerFunction
characteristic, and then implementing the operation to be performed by the timer in the run
function.
4. Timer API
4.1. Timer API
4.1.1. Create a Timer
pub fn new(timer_func: Box<dyn TimerFunction>, expire_jiffies: u64) -> Arc<Self>
Parameters
timer_func: A structure corresponding to the function that the timer needs to execute, which implements the
TimerFunction
characteristicexpire_jiffies: The expiration time of the timer (unit: jiffies)
Return
Pointer to the timer structure
4.1.2. Insert the Timer into the Timer List
pub fn activate(&self)
4.2. Other APIs
If you want to use the following functions in a .c module, please add rs_ before the function name.
4.2.1. Make the Process Sleep for a Certain Period
pub fn schedule_timeout(mut timeout: i64) -> Result<i64, SystemError>
Function
Make the process sleep for timeout jiffies
Parameters
timeout: The time to sleep (unit: jiffies)
Return Value
Ok(i64): Remaining time to sleep (unit: jiffies)
Err(SystemError): Error code
4.2.2. Get the Expiration Time of the First Timer in the Queue
pub fn timer_get_first_expire() -> Result<u64, SystemError>
Function
Get the expiration time of the first timer in the queue, i.e., the expiration time of the earliest expiring timer
Return Value
Ok(i64): Expiration time of the earliest expiring timer (unit: jiffies)
Err(SystemError): Error code
4.2.3. Get the Current System Time
pub fn clock() -> u64
Function
Get the current system time (unit: jiffies)
4.2.4. Calculate the Timer Time Slice Corresponding to the Next n Milliseconds or Microseconds
4.2.4.1. Milliseconds
pub fn next_n_ms_timer_jiffies(expire_ms: u64) -> u64
Function
Calculate the timer time slice corresponding to the next n milliseconds
Parameters
expire_ms: n milliseconds
Return Value
The corresponding timer time slice (unit: milliseconds)
4.2.4.2. Microseconds
pub fn next_n_us_timer_jiffies(expire_us: u64) -> u64
Function
Calculate the timer time slice corresponding to the next n microseconds
Parameters
expire_ms: n microseconds
Return Value
The corresponding timer time slice (unit: microseconds)
5. Creating a Timer Instance
struct TimerExample {
/// 结构体的成员对应函数的形参
example_parameter: i32,
}
impl TimerExample {
pub fn new(para: i32) -> Box<TimerExample> {
return Box::new(TimerExample {
example_parameter: para,
});
}
}
/// 为结构体实现TimerFunction特性
impl TimerFunction for TimerExample {
/// TimerFunction特性中的函数run
fn run(&mut self) {
// 定时器需要执行的操作
example_func(self.example_parameter);
}
}
fn example_func(para: i32) {
println!("para is {:?}", para);
}
fn main() {
let timer_example: Box<TimerExample> = TimerExample::new(1);
// 创建一个定时器
let timer: Arc<Timer> = Timer::new(timer_example, 1);
// 将定时器插入队列
timer.activate();
}