Linux設備驅動之定時與延時

来源:http://www.cnblogs.com/archiexie/archive/2016/12/09/6126739.html
-Advertisement-
Play Games

Linux通過系統硬體定時器以規律的間隔(由HZ度量)產生定時器中斷,每次中斷使得一個內核計數器的值jiffies累加,因此這個jiffies就記錄了系統啟動開始的時間流逝,然後內核據此實現軟體定時器和延時。 ...


Linux通過系統硬體定時器以規律的間隔(由HZ度量)產生定時器中斷,每次中斷使得一個內核計數器的值jiffies累加,因此這個jiffies就記錄了系統啟動開始的時間流逝,然後內核據此實現軟體定時器和延時。

Demo for jiffies and HZ

    #include <linux/jiffies.h>

    unsigned long j, stamp_1, stamp_half, stamp_n;

    j = jiffies; /* read the current value */
    stamp_1 = j + HZ; /* 1 second in the future */
    stamp_half = j + HZ/2; /* half a second */
    stamp_n = j + n * HZ / 1000; /* n milliseconds */

內核定時器

硬體時鐘中斷處理程式會喚起 TIMER_SOFTIRQ 軟中斷,運行當前處理器上到期的所有內核定時器。

定時器定義/初始化

在Linux內核中,timer_list結構體的一個實例對應一個定時器:

    /* 當expires指定的定時器到期時間期滿後,將執行function(data) */
    struct timer_list {
        unsigned long expires;           /*定時器到期時間*/
        void (*function)(unsigned long); /* 定時器處理函數 */
        unsigned long data;              /* function的參數 */
        ...
    };

    /* 定義 */
    struct timer_list my_timer;

    /* 初始化函數 */
    void init_timer(struct timer_list * timer);
    /* 初始化巨集 */
    TIMER_INITIALIZER(_function, _expires, _data)

    /* 定義並初始化巨集 */
    DEFINE_TIMER(_name, _function, _expires, _data)

定時器添加/移除

    /* 註冊內核定時器,將定時器加入到內核動態定時器鏈表中 */
    void add_timer(struct timer_list * timer);

    /* del_timer_sync()是 del_timer()的同步版,在刪除一個定時器時需等待其被處理完,
       因此該函數的調用不能發生在中斷上下文 */
    void del_timer(struct timer_list * timer);
    void del_timer_sync(struct timer_list * timer);

定時時間修改

    int mod_timer(struct timer_list *timer, unsigned long expires);

延時

短延時

    void ndelay(unsigned long nsecs);
    void udelay(unsigned long usecs);
    void mdelay(unsigned long msecs);

內核在啟動時,會運行一個延遲測試程式(delay loop calibration),計算出lpj(loops per jiffy),根據lpj就實現了這幾個函數,屬忙等待。

長延時

  • 一個很直觀的方法是比較當前的 jiffies 和目標 jiffies:

    int time_after(unsigned long a, unsigned long b);    /* a after b, true */
    int time_before(unsigned long a, unsigned long b);   /* a before b */
    int time_after_eq(unsigned long a, unsigned long b); /* a after or equal b */
    int time_before_eq(unsigned long a, unsigned long b);/* a before or equal b */
  • 睡著延時

    void msleep(unsigned int millisecs);
    unsigned long msleep_interruptible(unsigned int millisecs);
    void ssleep(unsigned int seconds);

    Tip: msleep()、 ssleep()不能被打斷。


References

1. Linux Device Drivers
2. Linux設備驅動開發詳解(宋寶華第二版)


Copyright (C) 2016 archiexie@cnblogs. All Rights Reserved.



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 基於STM32F1開發平臺,從頭開始完成一個基於時間片輪詢和優先順序搶占的實時任務調度內核 ...
  • 對於包含 MMU 的處理器而言, Linux 系統提供了複雜的存儲管理系統,使得進程所能訪問的記憶體達到 4GB。進程的 4GB 記憶體空間被分為兩個部分—用戶空間與內核空間。用戶空間地址一般分佈為 0~3GB(即 PAGE_OFFSET),這樣,剩下的 3~4GB 為內核空間。內核空間申請記憶體涉及的函... ...
  • 介紹 forfiles是windows自帶的一個批量刪除命令,對於時間的判斷是通過文件自身的修改日期屬性進行判斷,使用它來對歷史文件進行判斷刪除是個不錯的選擇。 語法 forfiles [/p Path ] [/m SearchMask ] [/s ] [/c Command ] [/d [{+ | ...
  • 從網路上下載到的源碼包, 最常見的是 .tar.gz 包, 還有一部分是 .tar.bz2包要解壓很簡單 :.tar.gz 格式解壓命令為 tar -zxvpf xx.tar.gz.tar.bz2 格式解壓命令為 tar -jxvpf xx.tar.bz2 //p參數可以保留原文件許可權(很重要) ...
  • 本文地址 分享提綱: 1. svn 不常見單有用的命令 2. svn查看切換用戶 1. svn自己總結的一些不常見,但有用的命令 1)【導出svn不帶版本代碼】導出不帶svn版本控制的代碼到本地的 localdir下: svn export https://github.com/wozhuzaisi ...
  • 更改SSH服務端遠程登錄的配置 windows服務端的預設遠程管理埠是3389,管理員用戶是administrator,普通用戶是guest。Linux的管理用戶是root,普通用戶預設有很多個,遠程連接預設埠是22。 修改配置文件/etc/ssh/sshd_config,13行Port 22(... ...
  • 一、NFS概念: 透過網路,讓不同的主機能“共用”文件。通過NFS,用戶和程式可以像訪問本地文件一樣訪問遠端系統上的文件。 二、版本: 共三個版本,NFSv2,NFSv3,NFSv4(包含4.0和4.1)。其中NFSv2和NFSv3由Sun公司起草。NFS4.0主要由NetApp。 三、版本特點 V ...
  • [joy@localhost ~]$ java -version openjdk version "1.8.0_91" OpenJDK Runtime Environment (build 1.8.0_91-b14)OpenJDK 64-Bit Server VM (build 25.91-b14, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...