Linux驅動入門 定時計數

2021-07-22 17:18:38 字數 1765 閱讀 2813

第四章 定時計數

4.1 定時器基本概念

系統定時器頻率(節拍率)是通過靜態預處理器定義的,也就是hz。連續兩次時鐘的間隔時間叫做節拍,它等於1/hz秒。

全域性變數jiffies用來記錄自系統啟動以來產生的節拍的總數,jiffies在

一秒內增加的值就是hz,系統執行的時間以秒為單位計算,就等於jiffies/hz.

extern  unsigned  long volatile jiffies;    //定義

jiffies

unsigned long later = jiffies + 5 * hz      //從現在開始5s

說明:

(1)jiffies 型別為unsigned long,其他型別是不對的,核心時間管理**使用整個64位的jiffies_64,以此避免溢位,而jiffies僅是讀取jiffies_64的低32位。

(2)c編譯器通常只將變數裝載一次,一般情況下不能保證迴圈中的jiffies變數在每次的迴圈中被讀取時都重新被載入,所以關鍵字volatile指示編譯器在每次訪問變數時都重新從主記憶體中獲得,而不是通過暫存器中的變數別名來訪問。

如果節拍數達到最大值後還要繼續增加的話,它的值會迴繞到0,這就叫做jiffies迴繞。核心提供四種巨集來解決jiffies迴繞問題,即time_after、time_before、time_after_eq、time_before_eq.

例:

unsigned long time = jiffies + hz;        //1s後超時

if(time_before(jiffies,timeout))

else

體系結構提供兩種裝置進行計時——系統定時器和實時時鐘。系統定時器提供一種週期性觸發中斷機制,實時時鐘最主要的作用是在啟動時初始化牆上的時間(實際時間)xtime變數。

4.2 動態定時器的使用

struct time_list my_timer;                //建立定時器

init_timer(&my_timer);                  //初始化定時器

my_timer.expires = jiffies + delay;          //填充超時時間

my_timer.data = 0;                      //填充超時處理函式

void my_function(unsigned        

long data )形參

my_timer.function = my_function;         //填充超時處理函式

add_timer(&my_timer);                 //啟用定時器

mod_timer(&my_timer,jiffies+new_delay);  //修改新的定時時間並啟用

del_timer_sync(&my_timer);             //刪除定時

這種定時器不能完全保證實時,所以不能用這種定時器來實現任何硬實時任務。

定時計數器

1 工作方式0 當tmod中的m1,m2設定成0,0時,定時器 計數器就工作在方式0,工作方式0是一種13位定時器 計數器方式。可用來測量外訊號的脈衝寬度所持續的時間。2 工作方式1 工作方式1為16位定時器 計數其結構和操作與工作方式0基本相同,唯一的區別是工作方式1的計數器由tl0的8位和th0...

定時計數 總述

上一節,稀里糊塗地照著demo測試了定時計數的效果,但對內部和引數的控制還是不解,準備從基礎原理學習定時計數器的工作原理和方式。8051微控制器的結構是由一內部匯流排連線各功能模組,通過特殊功能暫存器 sfr 集中控制,不同型號引腳定義和sfr定義不同,因此乙個功能模組,可以從相關引腳功能和相關sf...

Linux基礎入門 Linux定時(計畫)任務

我們明天或多或少都會有一些常規性的工作,例如每週一次的週報,每天的上下班打卡,還有一些突發性的工作,例如臨時的加班,會議,需要你準備講稿等等,還有生活上的,例如每年的愛人的生日,結婚紀念日,等等。上面所有羅列出來的例行或者常規性的工作,都需要你自己記錄,不過,我們有了計算機,如果計算機可以主動通知我...