2021SC@SDUSC
文章目录
软件定时器的基本概念
TencentOS tiny
的软件定时器是由操作系统提供的一类系统接口
,它构建在硬件定时器基础之上,使系统能够提供不受硬件定时器资源限制的定时器服务,本质上软件定时器的使用相当于扩展了定时器的数量,允许创建更多的定时业务,它实现的功能与硬件定时器也是类似的。
硬件定时器是芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断。硬件定时器的精度一般很高,可以达到纳秒级别,并且是中断触发方式。
软件定时器的超时处理是指:在定时时间到达之后就会自动触发一个超时,然后系统跳转到对应的函数去处理这个超时,此时,调用的函数也被称回调函数
。
回调函数的执行环境可以是中断
,也可以是任务
,这就需要你自己在tos_config.h
通过TOS_CFG_TIMER_AS_PROC
宏定义选择回调函数的执行环境了。
-
TOS_CFG_TIMER_AS_PROC 为 1
:回调函数的执行环境是中断
-
TOS_CFG_TIMER_AS_PROC 为 0
:回调函数的执行环境是任务
这与硬件定时器的中断服务函数很类似,无论是在中断中还是在任务中,回调函数的处理尽可能简短,快进快出
。
软件定时器在被创建之后,当经过设定的超时时间后会触发回调函数,定时精度与系统时钟的周期有关,一般可以采用SysTick
作为软件定时器的时基。
TencentOS tiny
提供的软件定时器支持单次模式和周期模式,单次模式和周期模式的定时时间到之后都会调用软件定时器的回调函数。
-
单次模式
:当用户创建了定时器并启动了定时器后,指定超时时间到达,只执行一次回调函数之后就将该定时器停止,不再重新执行。 -
周期模式
:这个定时器会按照指定的定时时间循环执行回调函数,直到将定时器删除。
软件定时器以tick
为基本计时单位,当用户创建并启动
一个软件定时器时, TencentOS tiny
会根据当前系统tick
与用户指定的超时时间计算出该定时器超时的时间expires
,并将该定时器插入软件定时器列表。
软件定时器的数据结构
软件定时器列表
软件定时器列表用于记录系统中所有的软件定时器,这些软件定时器将按照唤醒时间升序插入软件定时器列表k_timer_ctl.list
中,它的数据类型是timer_ctl_t
。
timer_ctl_t k_timer_ctl = { TOS_TIME_FOREVER, TOS_LIST_NODE(k_timer_ctl.list) };
typedef struct timer_control_st {
k_tick_t next_expires;
k_list_t list;
} timer_ctl_t;
-
next_expires
:记录下一个到期的软件定时器时间。 -
list
:软件定时器列表,所有的软件定时器都会被挂载到这个列表中。
软件定时器任务相关的数据结构
如果 TOS_CFG_TIMER_AS_PROC
宏定义为0,则表示使用软件定时器任务处理软件定时器的回调函数,那么此时软件定时器的回调函数执行环境为任务;反之软件定时器回调函数的处理将在中断上下文环境中。
k_task_t k_timer_task;
k_stack_t k_timer_task_stk[TOS_CFG_TIMER_TASK_STK_SIZE];
k_prio_t const k_timer_task_prio = TOS_CFG_TIMER_TASK_PRIO;
k_stack_t *const k_timer_task_stk_addr = &k_timer_task_stk[0];
size_t const k_timer_task_stk_size = TOS_CFG_TIMER_TASK_STK_SIZE;
-
k_timer_task
:软件定时器任务控制块 -
k_timer_task_stk
:软件定时器任务栈,其大小为TOS_CFG_TIMER_TASK_STK_SIZE
-
k_timer_task_prio
:软件定时器任务优先级,值为TOS_CFG_TIMER_TASK_PRIO
,默认值是(k_prio_t)(K_TASK_PRIO_IDLE - (k_prio_t)1u)
-
k_timer_task_stk_addr
:软件定时器任务栈起始地址 -
k_timer_task_stk_size
:软件定时器任务栈大小
软件定时器的回调函数
// 软件定时器的回调函数类型
typedef void (*k_timer_callback_t)(void *arg);
软件定时器的回调函数是一个函数指针的形式,它支持传入一个void
指针类型的数据。