Linux 定時器(核心態)

2021-07-07 10:26:05 字數 2080 閱讀 6519

本文參考文件

struct timer_list test_timer;

setup_timer(&test_timer, timer_print, 1234);

test_timer.expires = jiffies + 5 * hz;

add_timer(&test_timer);

值得注意的是,定義定時器時注意定時器為全域性變數或者是通過kmalloc從堆中申請到的記憶體。否則定時器會在函式生命週期結束後被銷毀,導致出現錯誤。
首先來看一下setup_timer的源**

#define setup_timer(timer, fn, data)                    \

__setup_timer((timer), (fn), (data), 0)

#define __setup_timer(_timer, _fn, _data, _flags) \

do while (0)

很容易可以看出,這個函式只是簡單的往test_timer這個資料結構中填充一些內容。其實在add_timer這個函式執行之前,test_timer結構裡的資料都可以隨意更改。其中1234是隨手寫的乙個資料,將會作為引數傳入觸發器的function中(在這裡是timer_print)。其實這個data引數可以通過強轉傳入指標,例如:

(unsigned long)&test_timer;

test_timer.expires = jiffies + 5 * hz;

在這句**中expires成員是定時器,設定了觸發函式的時間。hz代表的是系統每一秒的滴答時鐘計算數,可以從config中查到(shell命令,本人核心是3.7.10)。

#cat /boot/config-3.7.10 |grep config_hz

其中jiffies是linux中定義的乙個全域性變數,記錄的是從系統啟動到當前使用的時間。假如要計算系統已經執行的時間,可以簡單通過以下計算獲得:

jiffies / hz

這一句的意思是將定時器設定為5秒後觸發(由於程式執行本身需要消耗一些時間,因此並不是絕對精確的。假如在這句語句定義後呼叫msleep(1000)睡眠3秒,那麼可能定時器就會在add_timer之後,只剩下不足4秒的時間了)。

linux核心中定時器的實現涉及到乙個雙向鍊錶,這個鍊錶中的每乙個節點都是

struct timer_list

型別。初始化的的簡單呼叫過程,從kernel/init/main.c到kernel/kernel/timer.c

start_kernel()->init_timers()

更深一層的內容原理請檢視參考文件

#include 

#include

struct timer_list test_timer;

/*static define_timer(test_timer, test_print, 0, 0)*/

void timer_print(unsigned

long data)

static

int __init test_init(void)

static

void test_exit(void)

module_init(test_init);

module_exit(test_exit);

module_license("gpl");

ccflags-y += -o0 -g

obj-m := test_timer.o

kdir :=/lib/modules/$(shell uname -r)/build

pwd :=$(shell pwd)

default:

$(make) -c $(kdir) subdirs=$(pwd) modules

clean:

$(make) -c $(kdir) subdirs=$(pwd) clean

linux 核心 核心定時器

一.時鐘中斷概念 1.時鐘中斷由系統的定時硬體以週期性的時間間隔產生,這個間隔 即頻率 由核心根據hz來確定,hz是乙個與體系結構無關的常數,可配置 50 1200 在x86平台上預設值是1000 2.每當時鐘中斷發生的時候,全域性變數jiffies unsigned long 就加1,所以jiff...

linux核心定時器

度量時間差 時鐘中斷由系統的定時硬體以週期性的時間間隔產生,這個間隔 頻率 由核心根據hz來確定,hz是乙個與體系結構無關的常數,可配置 50 1200 在x86平台,預設值為1000.每秒鐘產生1000次時鐘中斷 每當時鐘中斷發生時,全域性變數jiffies就加1,因此其記錄了自linux啟動後時...

Linux 核心定時器

include include include include struct timer list my timer void func unsigned long data printk time out n data ld,pid ld n data,current pid mod timer ...