驅動-Linux定時-timer_list

了解內核定時相關基礎知識

文章目錄

  • 簡要介紹
  • timer_list 特點
  • API 函數
  • 實驗
    • 測試程序 - timer_mod.c
    • 編譯文件-Makefile
    • 實驗驗證
  • 注意事項
  • 總結


簡要介紹

硬件為內核提供了一個系統定時器來計算流逝的時間(即基于未來時間點的計時方式, 以當前時刻為計時開始的起點, 以未來的某一時刻為計時的終點) , 內核只有在系統定時器的幫助下才能計算和管理時間, 但是內核定時器的精度并不高, 所以不能作為高精度定時器使用。并且內核定時器的運行沒有周期性, 到達計時終點后會自動關閉。 如果要實現周期性定時, 就要在定時處理函數中重新開啟定時器。

Linux 內核中使用 timer_list 結構體表示內核定時器, 該結構體定義在“內核源碼/include/li
nux/timer.h”文件中, 具體內容如下所示


struct timer_list {struct hlist_node   entry;unsigned long       expires;/* 定時器超時時間,單位是節拍數 */void            (*function)(struct timer_list *);/* 定時處理函數 */u32         flags;#ifdef CONFIG_LOCKDEPstruct lockdep_map  lockdep_map;
#endifANDROID_KABI_RESERVE(1);ANDROID_KABI_RESERVE(2);
};

timer_list 特點

inux 內核定時器是基于 timer_list 結構的動態定時器,具有以下特點:

  • 不是周期性的,超時后會自動失效

  • 基于內核的 jiffies 計時

  • 在中斷上下文執行,因此不能睡眠

  • 精度取決于 HZ 值(通常為 1ms 或 10ms)

API 函數

函數作用
void add_timer(struct timer_list *timer)向 Linux 內核注冊定時器,使用 add_timer 函數向內核注冊定時器以后,定時器就會開始運行
int del_timer(struct timer_list * timer)刪除一個定時器
int mod_timer(struct timer_list *timer,unsigned long expires)修改定時值,如果定時器還沒有激活的話,mod_timer 函數會激活定時器

在使用add_timer()函數向 Linux 內核注冊定時器之前,還需要設置定時時間,定時時間由timer_list結構體中的expires參數所確定,單位為節拍數

這里簡要理解,節拍數 jiffies 和 時間之間的轉換函數:

jiffies_64用于64位系統,而jiffies用于 32 位系統。為了方便開發,Linux 內核還提供了幾個jiffies和ms、us、ns之間的轉換函數,如下 所示:

函數作用
int jiffies_to_msecs(const unsigned long j)將 jiffies 類型的參數 j 分別轉換為對應的毫秒
int jiffies_to_usecs(const unsigned long j)將 jiffies 類型的參數 j 分別轉換為對應的微秒
u64 jiffies_to_nsecs(const unsigned long j)將 jiffies 類型的參數 j 分別轉換為對應的納秒
long msecs_to_jiffies(const unsigned int m)將毫秒轉換為 jiffies 類型
long usecs_to_jiffies(const unsigned int u)將微秒轉換為 jiffies 類型
unsigned long nsecs_to_jiffies(u64 n)將納秒轉換為 jiffies 類型

既然要定時,那么情形就是 把定時時間轉換成節拍數,系統內核根據節拍數和節拍頻率。內核里面只認節拍數,它對應的就是頻率

例如:進行3秒鐘的定時:

timer_test.expires = jiffies_64 +msecs_to_jiffies(3000)

實驗

測試程序 - timer_mod.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/timer.h>static void function_test(struct timer_list  *t);//定義function_test定時功能的函數
DEFINE_TIMER(timer_test,function_test);static void function_test(struct timer_list *t){printk(" this is function test \n");mod_timer(&timer_test,jiffies_64+msecs_to_jiffies(5000));  使用mod_timer函數將定時時間設置為五秒后}static int __init time_module_init(void) //驅動入口函數
{timer_test.expires = jiffies_64 + msecs_to_jiffies(5000);//將定時時間設置為五秒后add_timer(&timer_test);//添加一個定時器return 0;}
static void __exit time_module_exit(void) //驅動出口函數
{del_timer(&timer_test);//刪除一個定時器printk("module exit \n");}
module_init(time_module_init);
module_exit(time_module_exit);
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("wang fang chen");

源碼分析

  • 這里用到了定時器timer_list 的三個api 函數:
    定義定時器:DEFINE_TIMER(timer_test,function_test); 參數為定時器名稱和回調方法
    添加定時器:add_timer(&timer_test);
    修改定時器:mod_timer(&timer_test,jiffies_64+msecs_to_jiffies(5000));
    刪除定時器:del_timer(&timer_test);

    **注意點:**定時器的名稱并不是作為變量定義的,作為方法參數定義了的 DEFINE_TIMER的方法參數。
    回調函數 function_test 是先定義,然后實現 。

編譯文件-Makefile

#!/bin/bash
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
obj-m += timer_mod.o
KDIR :=/home/wfc123/Linux/rk356x_linux/kernel
PWD ?= $(shell pwd)
all:make -C $(KDIR) M=$(PWD) modulesclean:make -C $(KDIR) M=$(PWD) clean

實驗驗證

加載驅動看打印信息
在這里插入圖片描述

注意事項

  • 定時器精度:內核定時器的精度受 HZ 值影響,不適合需要高精度的場合

  • 執行上下文:回調函數在中斷上下文執行,不能調用可能睡眠的函數

  • 多核處理:del_timer() 可能在 SMP 系統上返回后定時器仍在運行,使用 del_timer_sync() 更安全

  • 競爭條件:確保在模塊退出時刪除所有定時器

總結

這里了解的是內核的一個定時器timer_list 的使用。 了解基本知識即可。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81710.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81710.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81710.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機網絡概要

?絡相關基礎知識 協議 兩設備之間使?光電信號傳輸信息數據 要想傳遞不同信息 那么?者?就需要約定好的數據格式 層 封裝 繼承 多態是計算機的性質 它們?持了軟硬件分層的實現 同層協議可以?接通信 同層協議?不直接通信 是各?調?下層提供的結構能?完成通信 分層…

QT 使用QPdfWriter和QPainter繪制PDF文件

QT如何生產pdf文件&#xff0c;網上有許多文章介紹&#xff0c;我也是看了網上的文章&#xff0c;看他們的代碼&#xff0c;自己琢磨琢磨&#xff0c;才有了本編博客&#xff1b; 其他什么就不詳細說了&#xff0c;本篇博客介紹的QPdfWriter和QPainter繪制PDF文件&#xff1b;…

企業標準信息公共服務平臺已開放標準通編輯器訪問入口

標準通 數字化標準編輯器 專業、高效、便捷 企業標準信息公共服務平臺 近日&#xff0c;企業標準信息公共服務平臺已開放標準通編輯器訪問入口&#xff0c;可進入官網指定版塊使用&#xff01; 核心功能亮點 解決企業痛點 傳統標準編制&#xff0c;需反復核對格式、逐條…

【Hadoop】--HA高可用搭建--3.2.2

修改環境配置文件 hadoop-env.sh # 在文件末尾添加以下內容&#xff1a; # java_home記得修改 export JAVA_HOME/usr/java/jdk1.8.0xxxx export HDFS_NAMENODE_USERroot export HDFS_DATANODE_USERroot export HDFS_ZKFC_USERroot export HDFS_JOURNALNODE_USERroot export YA…

【skywalking】index“:“skywalking_metrics-all“},“status“:404}

skywalking 啟動報錯 java.lang.RuntimeException: {"error":{"root_cause":[{"type":"index_not_found_exception","reason":"no such index [skywalking_metrics-all]","resource.t ype":"inde…

【Android】從垂直同步到屏幕刷新機制(一)

【Android】從垂直同步到屏幕刷新機制 本文參考以及部分圖片來源&#xff1a; 垂直同步_小科普&#xff1a;“垂直同步”究竟是什么&#xff1f;-CSDN博客 “終于懂了” 系列&#xff1a;Android屏幕刷新機制—VSync、Choreographer 全面理解&#xff01;-騰訊云開發者社區-騰訊…

ACL完全解析:從權限管理到網絡安全的核心防線

訪問控制列表&#xff08;ACL&#xff09;是一種用于管理資源訪問權限的核心安全機制&#xff0c;廣泛應用于操作系統和網絡設備中。以下是對ACL的詳細解析&#xff1a; 1. 基本概念 定義&#xff1a;ACL是由多個訪問控制條目&#xff08;ACE&#xff09;組成的列表&#xff0…

代碼審計-php框架開發,實戰tp項目,打擊微交易,源碼獲取,擴大戰果

實戰&#xff0c;不安全寫法引發的注入 這個bc靶場源碼沒有&#xff0c;看老師演示 打開很明顯的tp框架源碼 拿到tp框架之后第一步&#xff0c;搜索版本信息5.0.5 兩個思路 1.代碼的不安全寫法 2.版本自身存在的漏洞 全局搜索where看看也沒有不安全的 哎&#xff1f;&…

大模型的實踐應用43-基于Qwen3(32B)+LangChain框架+MCP+RAG+傳統算法的旅游行程規劃系統

大家好,我是微學AI,今天給大家介紹一下大模型的實踐應用43-基于Qwen3(32B)+LangChain框架+MCP+RAG+傳統算法的旅游行程規劃系統。本報告將闡述基于大模型Qwen3(32B)、LangChain框架、MCP協議、RAG技術以及傳統算法構建的智能旅游行程規劃系統。該系統通過整合多種技術優勢,實…

Jsoup庫和Apache HttpClient庫有什么區別?

Jsoup 和 Apache HttpClient 是兩個功能不同的庫&#xff0c;它們在 Java 開發中被廣泛使用&#xff0c;但用途和功能有明顯的區別&#xff1a; Jsoup 用途&#xff1a;Jsoup 是一個用于解析 HTML 文檔的庫。它提供了非常方便的方法來抓取和解析網頁內容&#xff0c;提取和操作…

騰訊云存儲原理

我們來詳細展開你提到的兩個核心結構概念&#xff1a; 一、“基于分布式文件系統 對象存儲技術” 是什么&#xff1f; 1. 分布式文件系統&#xff08;DFS&#xff09;基礎 分布式文件系統是一種支持將數據分布在多個存儲節點上、并對上層用戶透明的文件系統。騰訊云COS雖然是…

python fastapi + react, 寫一個圖片 app

1. 起因&#xff0c; 目的: 上廁所的時候&#xff0c;想用手機查看電腦上的圖片&#xff0c;但是又不想點擊下載。此app 應運而生。 2. 先看效果 單擊圖片&#xff0c;能放大圖片 3. 過程: 過程很枯燥。有時候&#xff0c; 有一堆新的想法。 但是做起來太麻煩&#xff0c;…

Kubernetes控制平面組件:Kubelet詳解(五):切換docker運行時為containerd

云原生學習路線導航頁&#xff08;持續更新中&#xff09; kubernetes學習系列快捷鏈接 Kubernetes架構原則和對象設計&#xff08;一&#xff09;Kubernetes架構原則和對象設計&#xff08;二&#xff09;Kubernetes架構原則和對象設計&#xff08;三&#xff09;Kubernetes控…

QT6 源(111):閱讀與注釋菜單欄 QMenuBar,進行屬性與成員函數測試,信號與槽函數測試,并給出源碼

&#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09; &#xff08;4&#xff09; &#xff08;5&#xff09; &#xff08;6&#xff09; &#xff08;7&#xff09;以下源代碼來自于頭文件 qmenubar . h &#xff1a; #ifndef QMENUBAR_H #defi…

Leetcode 3552. Grid Teleportation Traversal

Leetcode 3552. Grid Teleportation Traversal 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3552. Grid Teleportation Traversal 1. 解題思路 這一題的話核心就是一個廣度優先遍歷&#xff0c;我們只需要從原點開始&#xff0c;一點點考察其所能到達的位置&#xff0c;直至…

2023CCPC河南省賽暨河南邀請賽個人補題ABEFGHK

Dashboard - 2023 CCPC Henan Provincial Collegiate Programming Contest - Codeforces 過題難度&#xff1a;A H F G B K E 銅獎&#xff1a; 2 339 銀獎&#xff1a; 3 318 金獎&#xff1a; 5 523 A: 直接模擬 // Code Start Here int t;cin >> t;while(t-…

如何用Python批量解壓ZIP文件?快速解決方案

如何用Python批量解壓ZIP文件&#xff1f;快速解決方案 文章目錄 **如何用Python批量解壓ZIP文件&#xff1f;快速解決方案**代碼結果詳細解釋 話不多說&#xff0c;先上干貨&#xff01;&#xff01;&#xff01; 代碼 import os import zipfiledef unzip_file(dir_path: str…

Spring Boot 的高級特性與經典的設計模式應用

目錄 1. 設計模式在 Spring Boot 中的應用 1.1 單例模式&#xff1a;Bean 管理與全局實例 1.1.1 Spring 中的單例 Bean 1.1.2 自定義單例實現 1.1.3 單例模式的優勢 1.2 工廠模式&#xff1a;動態創建 Bean 1.2.1 Spring 的工廠方法 1.2.2 自定義工廠類 1.2.3 工廠模式…

在Excel中使用函數公式時,常見錯誤對應不同的典型問題

在Excel中使用函數公式時&#xff0c;常見錯誤對應不同的典型問題 1. #DIV/0!&#xff08;除以零錯誤&#xff09;2. #N/A&#xff08;值不可用&#xff09;3. #NAME?&#xff08;名稱錯誤&#xff09;4. #NULL!&#xff08;空交集錯誤&#xff09;5. #NUM!&#xff08;數值錯…

【cursor疑惑】cursor續杯后使用agent對話時,提示“需要pro或商業訂閱的用戶才能使用“

背景 cursor的pro會員體驗過期了&#xff0c;想再次體驗deepseek、Claude等agent對話提示:“免費版本不可以使用agent對話功能(英文忘記截圖了&#xff0c;大意是這樣)”。 處理方法 Step-1&#xff1a;再次續杯cursor的pro會員14天體驗 詳情&#xff0c;見&#xff1a;【c…