linux內核定時器
❶ 如何學習linux內核
Linux是最受歡迎的自由電腦操作系統內核。它是一個用C語言寫成,符合POSIX標準的類Unix操作系統。Linux最早是由芬蘭黑客LinusTorvalds為嘗試在英特爾x86架構上提供自由免費的類Unix操作系統而開發的。該計劃開始於1991年,在計劃的早期有一些Minix黑客提供了協助,而今天全球無數程序員正在為該計劃無償提供幫助。技術上說Linux是一個內核。「內核」指的是一個提供硬體抽象層、磁碟及文件系統控制、多任務等功能的系統軟體。一個內核不是一套完整的操作系統。一套基於Linux內核的完整操作系統叫作Linux操作系統,或是GNU/Linux。
組成進程管理(processmanagement)、1
定時器(timer)、2
中斷管理(interruptmanagement)、3
內存管理(memorymanagement)、4
模塊管理(molemanagement)、5
虛擬文件系統介面(VFSlayer)、6
文件系統(filesystem)、7
設備驅動程序(devicedriver)、8
進程間通信(inter-processcommunication)、9
網路管理(networkmanagement)、10
系統啟動(systeminit)等操作系統功能的實現。想學先買有關的書,再請教微機老師或專業人士。
❷ 有誰會用linux裡面的定時器timer_list
這段代碼是Linux的一個內核模塊程序,timer_list也是Linux內核中的數據結構。模塊程序不是以main函數作為入口的。而是以mole_init指定。
mole_init/mole_exit分別用於指定模塊的載入和卸載函數。
載入模塊(insmod)時,會調用mytimer_init函數。這個函數設置一個定時器,在定時器超時時執行myfunc函數,指定函數參數為「Hello,world!」。
myfunc執行時,會輸出「Hello,world!」,mod_timer函數會將定時器重新計時,兩秒後到期。
因此整個代碼執行起來後的現象就是每兩秒輸出一次Hello,world!
❸ Linux中斷與定時器
所謂中斷是指CPU在執行程序的過程中,出現了某些突發事件急待處理,CPU必須暫停當前程序的執行,轉去處理突發事件,處理完畢後又返回原程序被中斷的位置繼續執行。根據中斷的來源,中斷可分為內部中斷和外部中斷,內部中斷的中斷源來自CPU內部(軟體中斷指令、溢出、除法錯誤等,例如,操作系統從用戶態切換到內核態需藉助CPU內部的軟體中斷),外部中斷的中斷源來自CPU外部,由外設提出請求。根據中斷是否可以屏蔽,中斷可分為可屏蔽中斷與不可屏蔽中斷(NMI),可屏蔽中斷可以通過設置中斷控制器寄存器等方法被屏蔽,屏蔽後,該中斷不再得到響應,而不可屏蔽中斷不能被屏蔽。
根據中斷入口跳轉方法的不同,中斷可分為向量中斷和非向量中斷。採用向量中斷的CPU通常為不同的中斷分配不同的中斷號,當檢測到某中斷號的中斷到來後,就自動跳轉到與該中斷號對應的地址執行。不同中斷號的中斷有不同的入口地址。非向量中斷的多個中斷共享一個入口地址,進入該入口地址後,再通過軟體判斷中斷標志來識別具體是哪個中斷。也就是說,向量中斷由硬體提供中斷服務程序入口地址,非向量中斷由軟體提供中斷服務程序入口地址。
嵌入式系統以及x86PC中大多包含可編程中斷控制器(PIC),許多MCU內部就集成了PIC。如在80386中,PIC是兩片i8259A晶元的級聯。通過讀寫PIC的寄存器,程序員可以屏蔽/使能某中斷及獲得中斷狀態,前者一般通過中斷MASK寄存器完成,後者一般通過中斷PEND寄存器完成。定時器在硬體上也依賴中斷來實現,典型的嵌入式微處理器內可編程間隔定時器(PIT)的工作原理,它接收一個時鍾輸入,當時鍾脈沖到來時,將目前計數值增1並與預先設置的計數值(計數目標)比較,若相等,證明計數周期滿,並產生定時器中斷且復位目前計數值。
❹ 怎樣在Linux下實現精確定時器
linux下使用select實現精確定時器
在編寫程序時,我們經常回用到定時器。本文講述如何使用select實現超級時鍾。使用select函數,我們能實現微妙級別精度的定時器。同時,select函數也是我們在編寫非阻塞程序時經常用到的一個函數。
首先看看select函數原型如下:
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
參數說明:
slect的第一個參數nfds為fdset集合中最大描述符值加1,fdset是一個位數組,其大小限制為__FD_SETSIZE(1024),位數組的每一位代表其對應的描述符是否需要被檢查。
select的第二三四個參數表示需要關注讀、寫、錯誤事件的文件描述符位數組,這些參數既是輸入參數也是輸出參數,可能會被內核修改用於標示哪些描述符上發生了關注的事件。所以每次調用select前都需重新初始化fdset。
timeout參數為超時時間,該結構會被內核修改,其值為超時剩餘的時間。
利用select實現定時器,需要利用其timeout參數,注意到:
1)select函數使用了一個結構體timeval作為其參數。
2)select函數會更新timeval的值,timeval保持的值為剩餘時間。
如果我們指定了參數timeval的值,而將其他參數都置為0或者NULL,那麼在時間耗盡後,select函數便返回,基於這一點,我們可以利用select實現精確定時。
timeval的結構如下:
struct timeval{
long tv_sec;/*secons*
long tv_usec;/*microseconds*/
}
我們可以看出其精確到microseconds也即微妙。
一、秒級定時器
void seconds_sleep(unsigned seconds){
struct timeval tv;
tv.tv_sec=seconds;
tv.tv_usec=0;
int err;
do{
err=select(0,NULL,NULL,NULL,&tv);
}while(err<0 && errno==EINTR);
}
二、毫秒級別定時器
void milliseconds_sleep(unsigned long mSec){
struct timeval tv;
tv.tv_sec=mSec/1000;
tv.tv_usec=(mSec%1000)*1000;
int err;
do{
err=select(0,NULL,NULL,NULL,&tv);
}while(err<0 && errno==EINTR);
}
三、微妙級別定時器
void microseconds_sleep(unsigned long uSec){
struct timeval tv;
tv.tv_sec=uSec/1000000;
tv.tv_usec=uSec%1000000;
int err;
do{
err=select(0,NULL,NULL,NULL,&tv);
}while(err<0 && errno==EINTR);
}
現在我們來編寫幾行代碼看看定時效果吧。
#include <stdio.h>
#include <sys/time.h>
#include <errno.h>
int main()
{
int i;
for(i=0;i<5;++i){
printf("%d\n",i);
//seconds_sleep(1);
//milliseconds_sleep(1500);
microseconds_sleep(1900000);
}
}
註:timeval結構體中雖然指定了一個微妙級別的解析度,但內核支持的分別率往往沒有這么高,很多unix內核將超時值向上舍入成10ms的倍數。此外,加上內核調度延時現象,即定時器時間到後,內核還需要花一定時間調度相應進程的運行。因此,定時器的精度,最終還是由內核支持的分別率決定。
❺ linux內核定時器,最多可以申請多少個有沒有數據限制一個驅動程序里,可以申請幾個定時器
內核定時器理論上沒限制,一定要說限制,那麼與存儲空間如內存大小有關。