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);
}
}
實驗結果: