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