回到
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 的時鐘頻率...