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
时需要上锁,防止不同上下文之间竞争数据。但由于软件定时器的 回调函数 只能运行在中断上下文或中断底半部上下文,
锁只能是 Spinlock
或 Seqlock
。
// 内部数据 `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§
- XWOS软件定时器对象占用的内存大小