初始化定時器中斷

2021-05-24 05:37:22 字數 1500 閱讀 8583

回到

start_kernel

,612

行time_init

函式:void __init time_init(void)

函式x86_late_time_init

實際上是初始化

tsc時鐘源。在

time_init

中只是把該函式的位址賦給全域性變數

late_time_init

,以後某個時刻肯定會呼叫它的,這裡先提前詳細分析一下他:

static __init void x86_late_time_init(void)

x86_init.timers.timer_init

實際是函式

hpet_time_init

,來自檔案

kernel/timer.c

:101 void __init hpet_time_init(void)

102

由於我們沒有配置

config_hpet_timer

,所以103

行hpet_enable返回0

,呼叫104

行的函式

setup_pit_timer

,位於arch/x86/kernel/i8253.c

:104void __init setup_pit_timer(void)

105

整個函式的

115行之前都是在通過彙編指令初始化全域性變數

pit_ce

,這個clock_event_device

型別的變數在編譯的時候已經被初始化成了:

static struct clock_event_device pit_ce = ;

我們看到它的

irq號為

0,也就是對應

32號中斷描述符表項,即

interrupt[0]

處理函式。

115行把它註冊到通知鏈和

clockevent_devices

鍊錶中:

void clockevents_register_device(struct clock_event_device *dev)

最後將全域性

global_clock_event

設定成這個定時器,然後回到

hpet_time_init

中,105

行,呼叫

setup_default_timer_irq()

:void __init setup_default_timer_irq(void)

static struct irqaction irq0= ;

很簡單,呼叫

setup_irq

把interrupt[0]

對應的處理函式設定成

timer_interrupt

。至於隨後如何處理的,請檢視部落格「定時器中斷」

51定時器初始化步驟

定時器初始化需要六步 void timerinit tmod 0x01 th0 65536 x 256 65536 x 為定時器初值,如定時10ms,則x 1000 tl0 65536 x 256 ea 1 et0 1 tr0 1 中斷函式 void timer0 interrupt 1 th0 6...

mysql定時器 初始化訂單日期

sql 檢視是否開啟定時器 show variables like sche 開啟定時器 0 off 1 on setglobal event scheduler 1 建立事件 每隔一秒自動呼叫e test 儲存過程 create event if not exists event test on ...

定時器中斷

系統初始化的時候在預設的系統初始化函式 systeminit 函式裡面已經初始化 apb1 的時鐘為 2 分頻,所以 apb1 的時鐘為 36m。當 apb1 的時鐘分頻數為 1 的時候,tim2 7 的時鐘為 apb1 的時鐘,而如果 apb1 的時鐘分頻數不為 1,那麼 tim2 7 的時鐘頻率...