xwrust::xwos

Module swt

source
Expand description

§XWOS RUST:软件定时器

XWOS RUST的软件定时器是基于XWOS内核中的软件定时器来实现的。

软件定时器的 回调函数 运行在中断上下文或中断底半部上下文,是由硬件的中断驱动的。

RUST的编译器无法获知硬件的运行状态,所以无法预测 回调函数 什么时候会执行,也无法检测软件定时器对象的生命周期。

如果 回调函数 是闭包,编译器也无法检测捕获环境中引用的生命周期。

回调函数 甚至可能不执行,如果变量移动到 回调函数 ,有可能因 回调函数 不执行而无法被 drop()

因此,软件定时器对象只能定义为静态生命周期的全局变量,软件定时器的 回调函数 只能是 [fn] 或什么也不捕获的 Fn()

§创建

XWOS RUST的软件定时器可使用 Swt::new() 创建。只能创建具有静态生命周期 static 约束的全局变量:

use xwrust::xwos::swt::*;
use xwrust::xwos::lock::spinlock::*;

// 创建一个带有自选锁的软件定时器
static SWT: Swt<Spinlock<u32>> = Swt::new(Spinlock::new(1));

§内部数据

软件定时器可以携带内部数据 T ,由于软件定时器具有静态生命周期,因此内部数据 T 也为静态生命周期。 访问 T 时需要上锁,防止不同上下文之间竞争数据。但由于软件定时器的 回调函数 只能运行在中断上下文或中断底半部上下文, 锁只能是 SpinlockSeqlock

// 内部数据 `T` 为 `Spinlock<u32>`
static SWT: Swt<Spinlock<u32>> = Swt::new(Spinlock::new(1));

§回调函数

软件定时器的 回调函数 的形式为 fn(&Swt) ,其中 &Swt 是指向软件定时器自己的一个引用。 通过此应用,可以访问定时器携带的数据。

Swt::as_ref() 可以获取定时器内部数据 T 的引用。 Swt::as_mut() 可以获取定时器内部数据 T 的可变引用。

§启动

软件定时器由两种启动方式:

Swt::once() 软件定时器只会运行一次; Swt::repeat() 软件定时器会重复运行。

§停止

Swt::stop() 可用于停止软件定时器,若软件定时器未到达超时时间,回调函数不会被调用。

Structs§

  • 软件定时器对象结构体

Constants§