編寫使用者側定時器

2021-07-10 05:20:46 字數 2824 閱讀 8981

定時器是我們在平時開發中經常使用到的工具,特別是在協議的編寫上更是必不可少的組成部分。雖然系統本身給我們提供了定時器,但是有的時候,我們也想自己編寫乙個粗粒度的定時器,比如說在單元測試的時候。大家只要看到下面的例項**,其實就會發現,只要利用一下sleep函式,編寫屬於自己的定時器原來不是一件複雜的事情。當然,在實現自己的定時器之前,你需要明白自己的定時器應該設計成什麼樣子?比如說,

(1)定時器是否需要做互斥處理?

(2)定時器支援那幾種型別?

(3)定時器支援的最大粒度是多少?有沒有什麼限制?

(4)定時器的介面是什麼?

(5)定時器怎麼遍歷、組織和執行?

下面的**就是我自己練習時編寫的乙個定時器,具有下面幾個特點:

(1)支援1s為基本單位的定時操作;

(2)支援定時器互斥操作,適合移植;

(3)支援單次和迴圈兩種定時器;

(4)tick計數和定時函式處理是由不同執行緒完成;

(5)定時器介面簡單,和linux定時器介面基本一致。

[cpp]view plain

copy

struct

timer  

;  #define max_name_len 16

#define timer_lock_init()

#define timer_lock(sem)

#define timer_unlock(sem)

#define status int

#define max_timer_value (7*24*3600)

enum

;  enum

;  static

intg_timer_count;  

static

struct

link_node g_timer_head;  

static

handle

h_timer_sem;  

void

timer_init()  

status alloc_timer(const

char

* name, 

inttype, 

intcount, 

void

(*func)(

void

*), 

void

* param)  

if(strlen(name) >= max_name_len)  

if(single_shot != type && recycle_type != type)  

if(max_timer_value < count || 0 == count)  

timer_lock(h_timer_sem);  

for(p_node = g_timer_head.next; null != p_node; p_node = p_node->next)  

}  p_timer = (struct

timer*)malloc(

sizeof

(struct

timer));  

if(null == p_timer)  

memset(p_timer, 0, sizeof

(struct

timer));  

strncpy(p_timer->name, name, strlen(name));  

p_timer->type = type;  

p_timer->count = count;  

p_timer->func = func;  

p_timer->param = param;  

p_timer->state = timer_not_active;  

add_node_into_link(&p_timer->node, &g_timer_head);  

timer_unlock(h_timer_sem);  

return

true;  

}  status timer_start(const

char

* name)  

timer_lock(h_timer_sem);  

for(p_node = g_timer_head.next; null != p_node; p_node = p_node->next)  

}  if(null == p_node)  

if(timer_not_active == p_timer->state)  

timer_unlock(h_timer_sem);  

return

true;  

}  status timer_del(const

char

* name)  

timer_lock(h_timer_sem);  

for(p_node = g_timer_head.next; null != p_node; p_node = p_node->next)  

}  if(null == p_node)  

delete_node_from_link(&p_timer->node);  

timer_unlock(h_timer_sem);  

free(p_timer);  

return

true;  

}  void

timer_run()  

else

}  }  timer_unlock(h_timer_sem);  

sleep(1);  

}  }  

void

tick_process()  

}  

ubuntu下的定時器編寫

在linux系統中,計畫任務一般是由cron承擔,我們可以把cron設定為開機時自動啟動。cron啟動後,它會讀取它的所有配置檔案 全域性性配置檔案 etc crontab,以及每個使用者的計畫任務配置檔案 然後cron會根據命令和執行時間來按時來呼叫度工作任務。cron是乙個linux下的定時執行...

Mysql 檢視定時器 開啟定時器 設定定時器時間

1.檢視是否開啟evevt與開啟evevt。1.1 mysql evevt功能預設是關閉的,可以使用下面的語句來看evevt的狀態,如果是off或者0,表示是關閉的。show variables like sche 1.2 開啟evevt功能 setglobal event scheduler 1 ...

定時器 STM32定時器 基本定時器1

我是鼎!定時器時鐘一定要明確其中有哪些變數。上圖為stm407資料手冊摘出來的,可能看不清楚,其實就蘊含了幾點資訊。注意一點,我們看圖2,我們以apb1舉例,上面掛著很多的外設,包括usart1 adc 以及定時器,我們知道apb1上面最高時鐘頻率為84mhz,但是定時器的時鐘是要在此基礎上乘2,也...