Linux使用乙個定時器實現設定任意數量定時器功能

2022-10-06 19:57:20 字數 3329 閱讀 1712

為什麼需要這個功能,因為大多數計算機軟體時鐘系統通常只能有乙個時鐘觸發一次中斷。當執行多個任務時,我們會想要多個定時器 的時鐘跟蹤併發這樣可以生成正確的時間重疊,作業系統這樣做。

本例子是為了實現使用linux下的乙個定時器,實現任一數量的定時器功能。

首先我們需要一些資料型別用來描述時鐘資料結構

#include

#include

#define true 1

#define false 0

#define max_timers ... 最大時鐘數量

typedef timerval time; 定義時間型別

#define very_long_time ... 最大時間長度

struct timer timers[max_timers]; /* set of timers */

每個定時器都以這個資料結構來描述,第乙個成員用來描述時鐘是否正在使用,第二個成員是這個定時器的定時時間,第三個成員是是乙個指標,*event初始化應該為0,當他被置為1,我們知道這個定時器已經超時了,和他相關的任務可以執行。

接下來是定時器陣列的初始化,這裡將每個時鐘inuse成員設定為false,表示時鐘不可用。

void

timers_init()

現在開始是結構實現部分

首先寫到的timer_undeclare這個函式,這個函式與後面的timer_declare相對立。主要作用是清除乙個定時器。

有很多方法可以用來儲存定時器的定時記錄。沒有複雜時鐘硬體的機器通常在每乙個時鐘週期處理乙個中斷處理程式。然後軟體就在處理程式中獲取系統時間,然後判斷是否設定的定時器超時。

很多比較聰明的機器可以在硬體中設定定時時間,一旦時間超時,就觸發乙個硬體中斷。這同樣適用與軟體中斷。

他們通過乙個 定義乙個time_now來記錄當前的系統時間,volatile告訴機器每程式設計客棧次從暫存器取值,防止資料被系統優化。

volatile time time_now

接下來定義一系列資料來記錄 timer_next 指接下來要我們想要計時的定時器。time_timer_set儲存最後一次獲取的系統時間。

struct timer *timer_next = null;/* timer we expect to run down next */

time time_timer_set; /* time when physical timer was set */

//取消乙個定時器

void timer_undeclare(struct timer *t)

t->inuse=0;

if(t==timer_next)

}enable_interrupts();

}timer_undeclare作用為取消乙個定時器。首先讓中斷失效,這很重要,因為時鐘資料結構資料是在各程序中共享的,是可以在其他中斷中被修改的,為了防止不必要的錯我,這個取消操作應該為乙個原子操作。開始我們先檢測是否這個時鐘已經無效了。如果有效,則設定inuse使其失效。如果我們要取消的定時器正好是下乙個期望等待的定時器。那我們要重新指定下乙個期望等待的定時器。在此之前所有定時器都要更新一下前乙個定時器已經走過的時間。

接下來我們看到timers_update(time_t ti)函式

//更新定時器表時間

void timers_update(time_t time)

,  null

};

timer_last.time.tv_sec=10;

struct timer *t;

timer_next=&timer_last;

for(t=timers;tinuse)

else

}}www.cppcns.com  if(!timer_next->inuse)timer_next=0;

}此函式作用是更新所有有效定時器的時間長,同時將timer_next指向當前延時時間最短的乙個定時器。如沒有定時器,則將timer_next設定為空。

timer_declare 加入乙個定時器

struct timer * timer_declare(time *ti,char *event)

if(t==&timers[max_timers])

t->event=event;

t->time.tv_sec=ti->tv_sec;

t->time.tv_usec=ti->tv_usec;

if(!timer_next)

else if((ti->tv_sec+time_now)time.tv_sec+time_timer_set))

else

t->inuse=1;

enable_interrupts();

return t;

}首先找到乙個可用的定時器表項,設定相關引數。

接下來判斷如果timer_next為空,那麼說明定時器表項沒有定時器需要定時,那我們直接將timer_next指向新加入定時器,開始計時。

如果新加入定時器需要延時時間比當前正在延時的定時器的剩餘時間還要短,則更新定時器表,並計時當前加入的定時器。

在處理完當前定時器事件後,將新加入的定時器的inuse置1.

接下來是定時器中斷處理函式

//定時器中斷處理函式

void timer_interrupt_hander(int signo)

}這裡我們列印一串字元來證明定時器時間的觸發,首先要做的先更新定時器表,然後將time_timer_set設定成當前系統時間,繼續進行下乙個定時器事件,直到所有定時器都處理完畢。

接下來幾個是linux系統相關函式

//失效定時器中斷

void disable_interrupts()

//使能定時器中斷

void enable_interrupts()

//開啟乙個定時器工作

void start_physical_timer(time* time)

主函式測試部分

#include

#include

#include"multtime.h"

#include

#include

int main()

else if(pid==0)

else

else if(pid==0)

else

} exit(0);

}實驗結果:

parent

child 2

child 1

interrupt_hander

interrupt_hander

interrupt_hander

總結本文標題: linux使用乙個定時器實現設定任意數量定時器功能

本文位址: /os/linux/199345.html

乙個精確的定時器

typedef union large integer longlong quadpart 8位元組整型數 large integer large integer litmp longlong qpart1,qpart2 double dfminus,dffreq,dftim queryperfor...

linux下定時器實現

linux定時器 是指在每隔一段時間後就會進行一次相關操作,具有計時性的。核心操作是如下方法 int setitimer int which,const struct itimerval restrict value,struct itimerval restrict ovalue 函式返回的是va...

Linux定時器的使用

使用定時器的目的無非是為了週期性的執行某一任務,或者是到了乙個指定時間去執行某乙個任務。要達到這一目的,一般有兩個常見的比較有效的方法。乙個是用linux內部的三個定時器,另乙個是用sleep,usleep函式讓程序睡眠一段時間,使用alarm定時發出乙個訊號,還有那就是用gettimeofday,...