1. linux下的幾種時鍾和定時器機制
1. RTC(Real Time Clock)
所有PC都有RTC. 它和CPU和其他晶元獨立。它在電腦關機之後還可以正常運行。RTC可以在IRQ8上產生周期性中斷. 頻率在2Hz--8192HZ.
Linux只是把RTC用來獲取時間和日期. 當然它允許進程通過對/dev/rtc設備來對它進行編程。Kernel通過0x70和0x71 I/O埠來訪問RTC。
2. TSC(Time Stamp Counter)
80x86上的微處理器都有CLK輸入針腳. 從奔騰系列開始. 微處理器支持一個計數器. 每當一個時鍾信號來的時候. 計數器加1. 可以通過匯編指令rdtsc來得到計數器的值。通過calibrate_tsc可以獲得CPU的頻率. 它是通過計算大約5毫秒里tsc寄存器裡面的增加值來確認的。或者可以通過cat /proc/cpuinfo來獲取cpu頻率。tsc可以提供比PIT更精確的時間度量。
3. PIT(Programmable internval timer)
除了RTC和TSC. IBM兼容機提供了PIT。PIT類似微波爐的鬧鍾機制. 當時間到的時候. 提供鈴聲. PIT不是產生鈴聲. 而是產生一種特殊中斷. 叫定時器中斷或者時鍾中斷。它用來告訴內核一個間隔過去了。這個時間間隔也叫做一個滴答數。可以通過編譯內核是選擇內核頻率來確定。如內核頻率設為1000HZ,則時間間隔或滴答為1/1000=1微秒。滴答月短. 定時精度更高. 但是用戶模式的時間更短. 也就是說用戶模式下程序執行會越慢。滴答的長度以納秒形式存在tick_nsec變數裡面。PIT通過8254的0x40--0x43埠來訪問。它產生中斷號為IRQ 0.
下面是關於pIT裡面的一些宏定義:
HZ:每秒中斷數。
CLOCK_TICK_RATE:值是1,193,182. 它是8254晶元內部振盪器頻率。
LATCH:代表CLOCK_TICK_RATE和HZ的比率. 被用來編程PIT。
setup_pit_timer()如下:
spin_lock_irqsave(&i8253_lock, flags);
outb_p(0x34,0x43);
udelay(10);
outb_p(LATCH & 0xff, 0x40);
udelay(10);
outb (LATCH >> 8, 0x40);
spin_unlock_irqrestore(&i8253_lock, flags);
4. CPU Local Timer
最近的80x86架構的微處理器上的local apic提供了cpu local timer.他和pit區別在於它提供了one-shot和periodic中斷。它可以使中斷發送到特定cpu。one-shot中斷常用在實時系統裡面。
2. 如何使用避免內核定時器函數調用可休眠函數引發的系統
定時器由定時器控制寄存器TCON控制,該寄存器的第4/6位TR0/TR1置1,則打開定時器0/1。
示例語句如下:
先初始化定時器1的相關寄存器:
TMOD|= 0x11;//16位定時器/計數器模式
TH1=0x1C; //12.000M
TL1=0x18;
IE = 0x8A; //打開總中斷
TR1 = 1; //打開定時器1
設置完成後,每1ms進一次中斷,執行中斷程序(關於進中斷的時間由TH1,TL1控制,具體參見手冊)
void T1zd(void) interrupt 3 //3定時器1的中斷號 1定時器0的中斷號 0外部中斷1 2外部中斷2 4串口中斷
{
TH1 = 0x1c; //12.000
TL1 = 0x18;
LedNumVal++;
}
3. linux內核定時器怎樣控制用戶和內核空間的讀寫
作為一個Linux開發者,首先應該清楚內核空間和用戶空間的區別。關於這個話題,已經有很多相關資料,我們在這里簡單描述如下:
現代的計算機體系結構中存儲管理通常都包含保護機制。提供保護的目的,是要避免系統中的一個任務訪問屬於另外的或屬於操作系統的存儲區域。如在IntelX86體系中,就提供了特權級這種保護機制,通過特權級別的區別來限制對存儲區域的訪問。 基於這種構架,Linux操作系統對自身進行了劃分:一部分核心軟體獨立於普通應用程序,運行在較高的特權級別上,(Linux使用Intel體系的特權級3來運行內核。)它們駐留在被保護的內存空間上,擁有訪問硬體設備的所有許可權,Linux將此稱為內核空間。
4. 內核定時器 jiffies的時間是多少
首先,你這樣問,說明你不理解jiffies,jiffies應該說不是時間,jiffies的增加,是根據HZ的值變化而變化的。以時下linux kernel來說:1s=jiffies/HZ(即1秒=jiffies/HZ);在asm_i386中,HZ被定義為一個常,且為1000.一般在內核中定義超時是這樣用,如:xxx_timer.expires = jiffies+HZ/100;這個定義表示超時時間為10ms,如果超過個時間就處理中斷函數或者做你想做的事.當然HZ的分母你可以定為別的數。如HZ/1000等.
5. linux內核定時器可以中斷其他程序嗎
中斷與定時器:
中斷的概念:指CPU在執行過程中,出現某些突發事件急待處理,CPU暫停執行當前程序,轉去處理突發事件,處理完後CPU又返回原程序被中斷的位置繼續執行
中斷的分類:內部中斷和外部中斷
內部中斷:中斷源來自CPU內部(軟體中斷指令、溢出、觸發錯誤等)
外部中斷:中斷源來自CPU外部,由外設提出請求
屏蔽中斷和不可屏蔽中斷:
可屏蔽中斷:可以通過屏蔽字被屏蔽,屏蔽後,該中斷不再得到響應
不可屏蔽中斷:不能被屏蔽
向量中斷和非向量中斷:
向量中斷 : CPU通常為不同的中斷分配不同的中斷號,當檢測到某中斷號的中斷到來後,就自動跳轉到與該中斷號對應的地址執行
非向量中斷:多個中斷共享一個入口地址。進入該入口地址後再通過軟體判斷中斷標志來識別具體哪個是中斷
也就是說向量中斷由軟體提供中斷服務程序入口地址,非向量中斷由軟體提供中斷入口地址
/*典型的非向量中斷首先會判斷中斷源,然後調用不同中斷源的中斷處理程序*/
irq_handler()
{
...
int int_src = read_int_status();/*讀硬體的中斷相關寄存器*/
switch(int_src){//判斷中斷標志
case DEV_A:
dev_a_handler();
break;
case DEV_B:
dev_b_handler();
break;
...
default:
break;
}
...
}
定時器中斷原理:
定時器在硬體上也以來中斷,PIT(可編程間隔定時器)接收一個時鍾輸入,
當時鍾脈沖到來時,將目前計數值增1並與已經設置的計數值比較,若相等,證明計數周期滿,產生定時器中斷,並復位計數值。
附上出處鏈接:http://blog.163.com/baosongliang@126/blog/static/1949357020132585316912/
6. 內核定時器 可以使用哪些函數
在使用函數的過程中可以打開它的Excel,然後在Excel裡面就能夠知道它具體使用的函數了。
7. 如何在linux系統中自己新建一個內核定時器,用struct timer_list這樣子
大家來學習學習,「jiffies + HZ」這個時間是怎麼計算,還不是非常理解。我的整體理解是,驅動被載入一秒內,運行myfunc函數,myfunc函數列印一個「Hello,world!"後,每兩秒再列印一個"Hello,world!"。驅動函數不需要你自己寫main函數,你配置成y會自動被拉起,配置成m,需要手動通過工具拉起。