一、核心中如何記錄時間
任何程式都需要時間控制,其主要目的是:
為達到這個目的,應用程式使用日曆時間(年月日時分秒)或者自2023年1月1日零時零分零秒到當前的秒數來度量時間的流逝,但核心中需要更加有精度的時間度量,因此核心使用時鐘嘀嗒來記錄時間。時鐘中斷發生後核心內部時間計數器增加1(即:增加1個時鐘嘀嗒),系統引導時為0,當前值為自上次系統引導以來的時鐘滴答數,程式可通過核心定義的全域性變數jiffies_64或jiffies來訪問。真實硬體上每秒的嘀嗒數從 50 到 1200 不等 ,x86上預設為1000,而s3c2440上預設為200,出於統一程式設計介面的考慮,核心定義了乙個巨集hz,它表示1秒鐘的嘀嗒數,可供程式使用。
jiffies 和 jiffies_64是 unsigned long 型別唯讀變數,其用法如下:
注意:32-位 平台上當 hz 是 1000 時, 計數器只是每 50 天溢位一次, 必要時你的**應當準備處理這個事件
比較2個時間的大小,常用核心的如下巨集定義:
它們分別在時間a在時間b之後、之前、之後或相等、之前或相等的時候為真,反之為假
你可以轉換乙個 jiffies 差為毫秒, 一般地通過:
jiffies與日曆時間的轉換函式:
二、核心定時器
1、概述
乙個cpu,乙個ksoftirqd
ksoftirqd屬於atomic context
ksoftirqd執行時,不禁用irq
2、定時器 api
#include structtimer_list ;
#include void ndelay(unsigned long2、長延時:nsecs);
void udelay(unsigned long
usecs);
void mdelay(unsigned long msecs);
如果需要延後較長時間,就可以採用長延時。長延時可分為忙等待和讓出cpu兩種方式。
1)、忙等待:
unsigned long j1 = jiffies + 2*hz;
while (time_before(jiffies, j1))
cpu_relax();
cpu_relex 的呼叫使用了乙個特定於體系的方式,你此時沒有用處理器做事情,比較浪費處理器的資源
2)、讓出處理器
unsigned long j1 = jiffies + 3600*hz;
while (time_before(jiffies, j))
set_current_state(task_interruptible);
schedule_timeout(30*hz);
3)此外,如果你的驅動使用乙個等待佇列來等待某些其他事件,但是你也想確保它在乙個確定時間段內執行能夠執行,而不是永久等待,那麼可以使用超時
#include long wait_event_timeout(wait_queue_head_t q, condition, longtimeout);
long wait_event_interruptible_timeout(wait_queue_head_t q, condition, long timeout);
#include #include後面會編寫乙個linux模組化驅動程式設計的例項和延時。#include
struct
timer_list mytimer;
static
void myfunc(unsigned long
data)
static
int __init mytimer_init(void)
static
void __exit mytimer_exit(void)
module_init(mytimer_init);
module_exit(mytimer_exit);
linux核心驅動之定時器
運用場景 1.初始化乙個驅動,經過一定的時間再執行乙個特殊動作 2.初始化乙個驅動,之後每隔一定的時間執行乙個特殊動作 定時器工作流程 a.建立timer,編寫定時器處理函式 b.為timer的expires data function賦值 c.呼叫add timer將timer加入列表 d.定時器...
Linux驅動定時器相關
本文為我學習時所寫,非百分之百原創,望指出錯誤之處。參考資料 linux驅動之定時器 mod timer 核心定時器的使用 好幾個例子add timer linux核心高精度定時器hrtimer 使用例項 hrtimer的簡單使用 原理和實現 定時器被排程的函式肯定是非同步執行的,它類似於一種 軟體...
定時器驅動
想要每次進tick的時間相同如,每秒進100次tick tick想要100次 秒,那乙個tick就是1ms,而系統時鐘頻率是12 000 000 12 000 000hz 100hz,就是時鐘頻率除以tick頻率,翻譯過來就是每秒的時鐘滴答次數 每秒的tick次數等於乙個tick多少次時鐘滴答,然後...