定時器是我們在平時開發中經常使用到的工具,特別是在協議的編寫上更是必不可少的組成部分。雖然系統本身給我們提供了定時器,但是有的時候,我們也想自己編寫乙個粗粒度的定時器,比如說在單元測試的時候。大家只要看到下面的例項**,其實就會發現,只要利用一下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,也...