一 、軟件定時器
軟件定時器是由操作系統提供的一類系統接口,它構建在硬件定時器基礎之上,使系統能夠提供不受數目限制的定時器服務。
RT-Thread 操作系統提供軟件實現的定時器,以時鐘節拍(OS Tick)的時間長度爲單位,即定時數值必須是 OS Tick 的整數倍,例如一個 OS Tick 是 10ms,那麼上層軟件定時器只能是 10ms,20ms,100ms 等,而不能定時爲 15ms。RT-Thread 的定時器也基於系統的節拍,提供了基於節拍整數倍的定時能力。
1、查看系統的時鐘節拍OS Tick
無特殊需求,使用默認1000HZ,即1ms即可。
2、複製例程使用
更多函數接口查看RT官方資料RT軟件定時器
這個例程會創建兩個動態定時器,一個是單次定時,一個是週期性定時並讓週期定時器運行一段時間後停止運行,如下所示:
/* 定時器的控制塊 */
static rt_timer_t timer1;
static rt_timer_t timer2;
static int cnt = 0;
/* 定時器 1 超時函數 */
static void timeout1(void *parameter)
{
rt_kprintf("periodic timer is timeout %d\n", cnt);
/* 運行第 10 次,停止週期定時器 */
if (cnt++>= 9)
{
rt_timer_stop(timer1);
rt_kprintf("periodic timer was stopped! \n");
}
}
/* 定時器 2 超時函數 */
static void timeout2(void *parameter)
{
rt_kprintf("one shot timer is timeout\n");
}
int timer_sample(void)
{
/* 創建定時器 1 週期定時器 */
timer1 = rt_timer_create("timer1", timeout1,
RT_NULL, 10,
RT_TIMER_FLAG_PERIODIC);
/* 啓動定時器 1 */
if (timer1 != RT_NULL) rt_timer_start(timer1);
/* 創建定時器 2 單次定時器 */
timer2 = rt_timer_create("timer2", timeout2,
RT_NULL, 30,
RT_TIMER_FLAG_ONE_SHOT);
/* 啓動定時器 2 */
if (timer2 != RT_NULL) rt_timer_start(timer2);
return 0;
}