软件定时器
Categories:
少于1分钟
概述
软件定时器是基于调度器的滴答定时器任务实现的,因此时间精度最小为滴答定时器的中断频率。 软件定时器可以是 单次 的,也可以是 周期 的。
软件定时器对象与对象描述符描述符
软件定时器对象是 XWOS对象 struct xwos_object
的派生类 。
类似的,软件定时器对象也用 软件定时器对象描述符 xwos_swt_d
来解决有效性和身份合法性的问题。
软件定时器对象描述符由 软件定时器对象的指针 和 标签 组成:
typedef struct {
struct xwos_swt * swt; /**< 软件定时器对象的指针 */
xwsq_t tik; /**< 标签 */
} xwos_swt_d;
通过对象描述符引用对象时,首先检测 obj->magic
的值,是否为 0x58574F53U
,由此可确定指针 obj
指向一个有效的 XWOS的对象 。
然后对比标签 obj->tik
和 tik
是否相等,由此可以确定对象的 身份 。
因为对象的 tik
是全局唯一的,当对象被释放后,它的 tik
会被析构函数析构为 0 。
当内存地址被重新构建为新的对象,那么它的 tik
一定与对象描述符的 tik
不一致。
软件定时器的初始化、销毁与动态创建、删除
静态初始化、销毁
- 静态初始化:
xwos_swt_init()
- 静态 是指用户预先定义线程结构体对象,这些对象在编译期由编译器分配内存。
- 销毁静态初始化的软件定时器:
xwos_swt_fini()
动态创建、删除
- 动态创建:
xwos_swt_create()
- 动态 是指程序在运行时,通过内存分配函数申请内存,并在申请的内存上构造对象。
- 删除动态创建的软件定时器:
xwos_swt_delete()
软件定时器的标志
软件定时器在初始化或创建时,需要指定 标志 :
XWOS_SWT_FLAG_NULL
:无任何标志,占位符,也表示定时器为单次的。XWOS_SWT_FLAG_RESTART
:定时器为周期性的,即超时后自动重新开始。
启动软件定时器
软件定时器初始化或创建完成后,可以使用 xwos_swt_start()
启动。
启动时,需要指定开始的时间起点,周期,以及回调函数 xwos_swt_f
。
软件定时器的回调函数
软件定时器超时后,其回调函数 xwos_swt_f
会被调用。其原型被定义为:
typedef void(* xwos_swt_f) (struct xwos_swt *, void *)
其中第一个参数是软件定时器自己的指针,第二个参数是在 xwos_swt_start()
指定的回调函数的参数。
软件定时器的回调函数运行在滴答定时器任务中:
- 当开启中断底半部时,软件定时器的回调函数运行在中断底半部中;
- 当关闭中断底半部时,软件定时器的回调函数运行在中断上下文中。
无论是运行在中断底半部还是中断上下文,软件定时器的回调函数都 不 可使用任何会导致睡眠、阻塞的API。
停止软件定时器
用户可以通过 xwos_swt_stop()
停止已经启动的软件定时器。
对于未启动的软件定时器,此函数 xwos_swt_stop()
只会返回错误码,
不会产生任何破坏性的影响。
软件定时器对象的生命周期管理
软件定时器对象的基类是 XWOS对象 struct xwos_object
。
软件定时器对象也有两组生命周期管理的CAPI:
-
使用 对象指针 访问生命周期管理的CAPI:需要确保调用CAPI时,对象一定是有效的,且不存在 释放-又被申请 为另一个对象的情况。
xwos_swt_grab()
:增加引用计数。xwos_swt_put()
:减少引用计数,当引用计数减少为 0 时,调用垃圾回收函数释放对象。
-
使用 对象描述符 访问生命周期管理的CAPI:用户无法确保对象一定有效或无法确保对象不会变成另一个对象时使用。
xwos_swt_acquire()
:通过对象描述符确定对象有效且合法,再增加引用计数。xwos_swt_release()
:通过对象描述符确定对象有效且合法,再减少引用计数。 当引用计数减少为 0 时,调用垃圾回收函数释放对象。