日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

c#获取当前时间 毫秒_《Linux设备驱动程序》(十二)——时间操作(一)

發布時間:2023/12/15 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c#获取当前时间 毫秒_《Linux设备驱动程序》(十二)——时间操作(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

之前我們學會了如何編寫一個字符設備,并對其中的一些重要操作進行了說明。對于一個完整的設備而已,可能還有許多工作要做。

本節我們將要說一下內核中是如何對時間問題進行操作的。

本節主要涉及到以下內容:

  • 內核中的時間描述;
  • 如何獲取當前時間;
  • 如何進行延時操作;

內核中的時間描述

在內核中,系統定時硬件以周期性的間隔產生中斷,內核通過這個中斷來跟蹤時間流。

在內核中,上面的中斷間隔是由HZ常數來決定的,該常數是與體系結構相關的,定義在中(或者在其中的某個子文件中)。HZ的含義是一秒內產生的中斷數。如果需要,用戶可以修改這個變量,修改完后需要重新編譯整個內核以及模塊,不過,不建議用戶對該常數進行修改。

內核中使用一個變量來作為中斷計數器,系統啟動時,該計數器清零;上面的中斷發生時,計數器的值加1,因此這個計數器記錄了系統啟動以來的中斷數(也稱為時鐘滴答數)。這個變量稱為jiffies_64,是一個64位的變量(即使在32位系統中也是64位的),而我們在編寫驅動過程中,常用的變量名稱為jiffies,該變量是一個unsigned long型變量,其值要么就是jiffies_64,要么就是jiffies_64的低32位。以上計數器變量及其相關操作定義在文件中。

通過以上jiffies變量和HZ常數,就可以知道或定義一些時間:

#include unsigned long j = jiffies;unsigned long stamp_1 = j + HZ; /* 未來1秒 */unsigned long stamp_half = j + HZ / 2; /* 未來半秒 */unsigned long stamp_n = j + n * HZ / 1000; /* 未來n毫秒 */

上面對于jiffies可以直接讀取,但對于jiffies_64變量讀取是非原子的,是不可靠的,如果需要使用jiffies_64變量,我們可以使用以下輔助函數:

#include u64 get_jiffies_64(void);

如果兩個unsigned long變量表示獲取到的jiffies時間,則我們可以通過比較其大小來判斷時間先后(較大時間靠后),但我們還需要考慮時間過長而溢出問題(概率很低),因此,我們最好使用內核提供的宏來進行比較:

#include int time_after(unsigned long a, unsigned log b); /* 判斷a時間是否比b時間靠后 */int time_before(unsigned long a, unsigned log b); /* 判斷a時間是否比b時間靠前 */int time_after_eq(unsigned long a, unsigned log b); /* 判斷a時間是否比b時間靠后或相等 */int time_before_eq(unsigned long a, unsigned log b); /* 判斷a時間是否比b時間靠前或相等 */

上面說了內核空間的時間描述。

在用戶空間中,用于描述時間的變量是struct timeval(較老,包含秒和毫秒)和struct timespec(較新,包含秒和納秒)。

如果需要對兩個空間的時間描述,可以使用內核提供的函數進行轉換:

#include unsigned long timespec_to_jiffies(struct timespec *value);void jiffies_to_timespec(unsigned long jiffies, struct timespec *value);unsigned long timeval_to_jiffies(struct timeval *value);void jiffies_to_timeval(unsgined long jiffies, struct timeval *value);

上面的函數看名字和變量就知道其含義和使用方法,這里就不再描述了。

獲取當前時間

通過讀取jiffies變量,我們就可以獲取當前時間(系統啟動后經歷的時間)。

但有時候我們也需要處理絕對時間戳,因此,內核中導出了以下兩個函數來獲取絕對時間:

#include void do_gettimeofday(struct timeval *tv);struct timespec current_kernel_time(void);

延遲執行

設備驅動程序中經常在執行某個操作后需要等待一段時間,讓硬件做后某些任務后再繼續執行。


對于時間較長的延時(大于一個滴答時鐘),可以使用等待隊列的方式實現,等待隊列的使用可以查看《Linux設備驅動程序》(九)——休眠與喚醒 :

wait_queue_head_t wait;init_waitqueue_head(&wait);wait_event_interrupt_timeout(wait, 0, delay);

上面的condition設為0,因為我們并不是在等待某個特定的事件;delay是超時的時間(為jiffies數量,而不是絕對時間)。因此,上面的代碼會進入休眠,等待指定的jiffies數量后繼續執行。

為了使用超時功能而定義了等待隊里頭,這是多余的,因為我們并不需要他。為了避免定義多余的變量,內核提供了以下方法實現延時:

#include set_current_state(TASK_INTERRUPTIBLE);schedule_timeout(delay);

通過set_current_state來設置當前進程的狀態(如果是不可中斷的設置為TASK_UNINTERRUPTIBLE),這樣調度器超時后將其設置為TASK_RUNNING,該進程才會繼續執行;如果沒有設置進程狀態,則進程狀態一直都是TASK_RUNNING,此時后面執行schedule_timeout時,其效果等效于schedule,延時不會起作用。


對于短延遲,內核提供了以下幾個函數來完成:

#include void ndelay(unsigned long nscs); /* 延遲指定的納秒 */void udelay(unsigned long usecs); /* 延遲指定的微秒 */void mdelay(unsigned long msecs); /* 延遲指定的毫秒 */

這些函數的實現是與具體架構相關的,所有的架構都實現了udelay,其他函數可能沒有定義,會在udelay的基礎上提供默認的未定義的其他函數。

需要知道的是,以上延遲并不是說精確延時指定的時間,而是至少延遲指定的時間,可能會更長。

雖然輸入的參數均為unsigned long類型的,但一般性的規則是只用在其指定的量級上,即上千納秒應該使用udelay,而上千微秒則應使用mdelay,而不是輸入一個很大的值。

以上的延遲都是忙等待函數,因此在延遲期間不能執行其他任務。

對于毫秒級以上的延遲,內核還提供了一種非忙等待的實現:

#include void msleep(unsigned int millisecs); /* 延時等地指定毫秒 */unsigned long msleep_interruptible(unsgined int millisecs); /* 返回剩余毫秒數,一般為0 */void ssleep(unsgined int seconds); /* 延時等待指定秒 */

以上介紹了內核時間的概念、如何獲取內核時間以及在當前線程中的延時操作。下一節繼續說如何進行異步延時操作。

總結

以上是生活随笔為你收集整理的c#获取当前时间 毫秒_《Linux设备驱动程序》(十二)——时间操作(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品国产三级国产aⅴ原创 | 黄色免费网站在线观看 | 久久最新精品 | 四虎永久网站 | 国产人妻精品一区二区三区不卡 | 中文视频一区二区 | 国产一区二区日韩 | 天天射日日 | 亚洲精品国产精品国自 | 男女性生活视频网站 | 日本高清视频免费观看 | 国产做爰全过程免费视频 | 国产精品久久久一区 | 久久高清 | 肉丝美足丝袜一区二区三区四 | 久久h| 亚洲区偷拍 | 青春草在线视频免费观看 | 国产日韩欧美91 | 亚洲网址 | 国产黄色在线 | 久久精品区 | 欧美午夜精品久久久久久浪潮 | 香蕉成人av | 日本一区免费看 | 爆操老女人| 日本精品视频在线观看 | 97自拍视频在线 | 日韩精品欧美 | 一级特黄特色的免费大片视频 | 精品人妻在线一区二区三区 | 网站av在线 | 告诉我真相俄剧在线观看 | 亚洲三页| 91精品小视频 | 久久久久久久综合色一本 | 欧美激情一级 | 丁香啪啪综合成人亚洲 | 欧美一区二区三区久久久 | caobi视频| 一区二区三区在线视频免费观看 | 成人国产av一区二区三区 | 国产天堂 | 欧美激情一区二区 | 性少妇mdms丰满hdfilm | 女女同性女同一区二区三区按摩 | 美女扒开腿让男生捅 | 欧美自拍偷拍一区二区 | 精品伦一区二区三区 | 亚洲精品小说 | 蜜臀久久99精品久久久久宅男 | 欧美做受视频 | 99精品人妻无码专区在线视频区 | 男女性生活视频网站 | 手机看片日韩国产 | 国产精品欧美久久久久天天影视 | 日本欧美在线视频 | 国产黄色a | 欧美日韩国产激情 | 午夜成人影片 | 国产美女久久久久久 | 国产对白在线 | 香蕉大人久久国产成人av | 国产熟女一区二区三区四区 | 亚洲综合社区 | 992av| 国产一区二区电影 | 欧美色综合网站 | 在线欧美一区 | 国产美女黄色片 | 欧美日韩免费在线视频 | 欧美黄色一级大片 | 手机成人在线视频 | 蜜桃av一区二区 | 最新91在线 | 神宫寺奈绪一区二区三区 | 久草福利在线 | 天堂在线1| 精品人伦一区二区三区蜜桃网站 | 日韩乱码一区二区三区 | 国产又粗又猛又黄又爽无遮挡 | 黄色大尺度视频 | 91九色蝌蚪视频 | 少妇高潮一区二区三区在线 | 国产精品久久久久久久av | 久久国产加勒比精品无码 | 福利电影一区二区三区 | 亚洲第一激情 | 色中色在线视频 | 最近中文字幕在线免费观看 | 伊人久久亚洲 | 91在线观看网站 | 久久影院一区 | xxxxx色 | 日韩涩| 日韩av一区二区三区在线观看 | 成人激情小说网站 | 日韩毛片av| 热久久精|