1. 软件定时器
2. 提供的API
tos_timer_create
k_err_t tos_timer_create(k_timer_t *tmr,
k_tick_t delay,
k_tick_t period,
k_timer_callback_t callback,
void *cb_arg,
k_opt_t opt);
-
功能描述
创建一个定时器。
-
参数解释
IN/OUT 参数名 描述 [in] tmr 定时器句柄 [in] delay 定时器延迟多久后执行 [in] period 周期性timer的周期 [in] callback 定时器回调 [in] cb_arg 定时器回调参数 [in] opt 选项 -
注意
opt选项说明:
1、TOS_OPT_TIMER_ONESHOT
一次性定时器,创建定时器时传入此参数,表示该定时器是一次性的,只会执行一次。
2、TOS_OPT_TIMER_PERIODIC
周期性定时器,创建定时器时传入此参数,表示该定时器是周期性的,定时器到期后,会按period参数开启下一个周期。
-
返回值
K_ERR_NONE 定时器创建成功。
K_ERR_TIMER_INVALID_PERIOD 非法的period参数。
K_ERR_TIMER_INVALID_DELAY 非法的delay参数。
tos_timer_destroy
k_err_t tos_timer_destroy(k_timer_t *tmr);
-
功能描述
销毁一个定时器。
-
参数解释
IN/OUT 参数名 描述 [in] tmr 定时器句柄 -
返回值
K_ERR_NONE 定时器启动成功。
K_ERR_TIMER_INACTIVE 定时器并未被创建。
tos_timer_start
k_err_t tos_timer_start(k_timer_t *tmr);
-
功能描述
启动一个定时器。
-
参数解释
IN/OUT 参数名 描述 [in] tmr 定时器句柄 -
返回值
K_ERR_NONE 定时器启动成功。
K_ERR_TIMER_INACTIVE 定时器并未被创建。
K_ERR_TIMER_INVALID_STATE 定时器状态非法。
tos_timer_stop
k_err_t tos_timer_stop(k_timer_t *tmr);
-
功能描述
停止一个定时器。
-
参数解释
IN/OUT 参数名 描述 [in] tmr 定时器句柄 -
返回值
K_ERR_NONE 停止定时器成功。
K_ERR_TIMER_INACTIVE 定时器并未被创建。
K_ERR_TIMER_STOPPED 定时器已经处于停止状态。
tos_timer_delay_change
k_err_t tos_timer_delay_change(k_timer_t *tmr, k_tick_t delay);
-
功能描述
修改一个定时器的触发延时。
-
参数解释
IN/OUT 参数名 描述 [in] tmr 定时器句柄 [in] delay 修改后的触发延时参数 -
返回值
K_ERR_NONE 修改定时器触发延时成功。
K_ERR_TIMER_INACTIVE 定时器并未被创建。
K_ERR_TIMER_RUNNING 定时器正处于运行状态(不允许修改运行中的定时器的触发延时参数)。
K_ERR_TIMER_INVALID_DELAY 非法的delay参数(试图将一个一次性定时器的delay参数修改为0)。
tos_timer_period_change
k_err_t tos_timer_period_change(k_timer_t *tmr, k_tick_t perio);
-
功能描述
修改一个定时器的触发周期。
-
参数解释
IN/OUT 参数名 描述 [in] tmr 定时器句柄 [in] period 修改后的触发周期参数 -
返回值
K_ERR_NONE 修改定时器触发周期成功。
K_ERR_TIMER_INACTIVE 定时器并未被创建。
K_ERR_TIMER_RUNNING 定时器正处于运行状态(不允许修改运行中的定时器的触发延时参数)。
K_ERR_TIMER_INVALID_PERIOD 非法的period参数(试图将一个周期性定时器的period参数修改为0)。
3. 使用示例
设置一个3s触发一次的定时器,设置一个3s周期触发的定时器。
实验代码:
/**
* @brief TencentOS-tiny定时器测试
* @author Mculover666
* @date 2020/6/5
*/
#include <tos_k.h>
k_timer_t timer1;
k_timer_t timer2;
void timer1_callback(void *args)
{
printf("timer1 timeout!\r\n");
return;
}
void timer2_callback(void *args)
{
printf("timer2 timeout!\r\n");
return;
}
void application_entry(void *arg)
{
k_err_t ret;
//创建定时器
ret = tos_timer_create(&timer1,
3000,
3000,
timer1_callback,
NULL,
TOS_OPT_TIMER_PERIODIC);
if(ret != K_ERR_NONE)
{
printf("timer 1 create fail, err = %d.\r\n", ret);
}
ret = tos_timer_create(&timer2,
3000,
0,
timer2_callback,
NULL,
TOS_OPT_TIMER_ONESHOT);
if(ret != K_ERR_NONE)
{
printf("timer 2 create fail, err = %d.\r\n", ret);
}
//启动定时器
tos_timer_start(&timer1);
tos_timer_start(&timer2);
while (1) {
//printf("This is a demo task,please use your task entry!\r\n");
tos_task_delay(1000);
}
}
实验结果: