Linux设备驱动之定时与延时

简介:

Linux通过系统硬件定时器以规律的间隔(由HZ度量)产生定时器中断,每次中断使得一个内核计数器的值jiffies累加,因此这个jiffies就记录了系统启动开始的时间流逝,然后内核据此实现软件定时器和延时。

Demo for jiffies and HZ

 
 
  1. #include <linux/jiffies.h> 
  2.  
  3. unsigned long j, stamp_1, stamp_half, stamp_n; 
  4.  
  5. j = jiffies; /* read the current value */ 
  6. stamp_1 = j + HZ; /* 1 second in the future */ 
  7. stamp_half = j + HZ/2; /* half a second */ 
  8. stamp_n = j + n * HZ / 1000; /* n milliseconds */ 

内核定时器

硬件时钟中断处理程序会唤起 TIMER_SOFTIRQ 软中断,运行当前处理器上到期的所有内核定时器。

定时器定义/初始化

在Linux内核中,timer_list结构体的一个实例对应一个定时器:

/* 当expires指定的定时器到期时间期满后,将执行function(data) */

 
 
  1. /* 当expires指定的定时器到期时间期满后,将执行function(data) */ 
  2.    struct timer_list { 
  3.        unsigned long expires;           /*定时器到期时间*/ 
  4.        void (*function)(unsigned long); /* 定时器处理函数 */ 
  5.        unsigned long data;              /* function的参数 */ 
  6.        ... 
  7.    }; 
  8.  
  9.    /* 定义 */ 
  10.    struct timer_list my_timer; 
  11.  
  12.    /* 初始化函数 */ 
  13.    void init_timer(struct timer_list * timer); 
  14.    /* 初始化宏 */ 
  15.    TIMER_INITIALIZER(_function, _expires, _data) 
  16.  
  17.    /* 定义并初始化宏 */ 
  18.    DEFINE_TIMER(_name, _function, _expires, _data) 

定时器添加/移除

 
 
  1. /* 注册内核定时器,将定时器加入到内核动态定时器链表中 */ 
  2.    void add_timer(struct timer_list * timer); 
  3.  
  4.    /* del_timer_sync()是 del_timer()的同步版,在删除一个定时器时需等待其被处理完, 
  5.       因此该函数的调用不能发生在中断上下文 */ 
  6.    void del_timer(struct timer_list * timer); 
  7.    void del_timer_sync(struct timer_list * timer); 

定时时间修改

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

延时

短延时

 
 
  1. void ndelay(unsigned long nsecs);  
  2. void udelay(unsigned long usecs);  
  3. void mdelay(unsigned long msecs); 

内核在启动时,会运行一个延迟测试程序(delay loop calibration),计算出lpj(loops per jiffy),根据lpj就实现了这几个函数,属忙等待。

长延时

  • 一个很直观的方法是比较当前的 jiffies 和目标 jiffies:
 
 
  1. int time_after(unsigned long a, unsigned long b); /* a after b, true */  
  2. int time_before(unsigned long a, unsigned long b); /* a before b */  
  3. int time_after_eq(unsigned long a, unsigned long b); /* a after or equal b */  
  4. int time_before_eq(unsigned long a, unsigned long b);/* a before or equal b */ 
  • 睡着延时
 
 
  1. void msleep(unsigned int millisecs);  
  2. unsigned long msleep_interruptible(unsigned int millisecs);  
  3. void ssleep(unsigned int seconds); 

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





作者:archiexie
来源:51CTO
目录
相关文章
|
25天前
|
Linux 网络安全 网络虚拟化
Linux虚拟网络设备:底层原理与性能优化深度解析
在深入探讨Linux虚拟网络设备的底层原理之前,重要的是要理解这些设备如何在Linux内核中实现,以及它们如何与操作系统的其他部分交互以提供高效且灵活的网络功能。虚拟网络设备在现代网络架构中发挥着关键作用🔑,特别是在云计算☁️、容器化📦和网络功能虚拟化(NFV)环境中。
Linux虚拟网络设备:底层原理与性能优化深度解析
|
25天前
|
Linux 网络虚拟化 虚拟化
Linux虚拟网络设备深度解析:使用场景、分类与开发者指南
Linux虚拟网络设备支撑着各种复杂的网络需求和配置,从基础的网络桥接到高级的网络隔离和加密🔐。以下是对主要Linux虚拟网络设备的介绍、它们的作用以及适用场景的概览,同时提出了一种合理的分类,并指出应用开发人员应该着重掌握的设备。
Linux虚拟网络设备深度解析:使用场景、分类与开发者指南
|
25天前
|
安全 Linux API
Linux设备模型统一:桥接硬件多样性与应用程序开发的关键
在Linux的宏大世界中,各种各样的硬件设备如星辰般繁多。从常见的USB设备到复杂的网络接口卡,从嵌入式设备到强大的服务器,Linux需要在这些差异极大的硬件上运行。这就引出了一个问题:Linux是如何统一这些不同硬件的设备模型的呢?本文将探讨Linux是如何针对不同的硬件统一设备模型的,这一统一的设备模型对于应用程序开发人员来说又有何意义。让我们一探究竟🕵️‍♂️。
Linux设备模型统一:桥接硬件多样性与应用程序开发的关键
|
1月前
|
Linux Shell
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
82 1
|
24天前
|
Cloud Native Linux 网络虚拟化
深入理解Linux veth虚拟网络设备:原理、应用与在容器化架构中的重要性
在Linux网络虚拟化领域,虚拟以太网设备(veth)扮演着至关重要的角色🌐。veth是一种特殊类型的网络设备,它在Linux内核中以成对的形式存在,允许两个网络命名空间之间的通信🔗。这篇文章将从多个维度深入分析veth的概念、作用、重要性,以及在容器和云原生环境中的应用📚。
深入理解Linux veth虚拟网络设备:原理、应用与在容器化架构中的重要性
|
25天前
|
监控 中间件 Linux
深入Linux设备模型:开发者指南
Linux的设备模型是操作系统管理硬件设备的一种高级抽象,它不仅涉及到设备驱动程序的加载和卸载,还包括设备之间的关系、设备的状态管理以及与用户空间通信的机制。理解Linux的设备模型对于应用开发人员来说至关重要,它有助于开发出更加稳定、高效的应用程序。🌟
深入Linux设备模型:开发者指南
|
5天前
|
存储 监控 Linux
【专栏】如何在 Linux 中列出已安装的驱动器?
【4月更文挑战第28天】在 Linux 中,了解已安装驱动器是系统管理的关键。本文介绍了三种方法:1) 使用 `lsblk` 命令显示设备名、大小和类型;2) `fdisk -l` 命令提供详细分区信息;3) `gnome-disks` 等系统管理工具展示驱动器信息。此外,还讨论了驱动器类型识别、挂载点概念及其应用。通过这些方法,用户能有效地监控和管理 Linux 系统中的驱动器。
|
13天前
|
存储 Linux
如何查看Linux设备的硬盘信息?
【4月更文挑战第12天】在Linux系统中,查看硬盘信息的常用命令。
23 4
|
18天前
|
Linux Go
Linux命令Top 100驱动人生! 面试必备
探索Linux命令不再迷茫!本文分10部分详解20个基础命令,带你由浅入深掌握文件、目录管理和文本处理。 [1]: <https://cloud.tencent.com/developer/article/2396114> [2]: <https://pan.quark.cn/s/865a0bbd5720> [3]: <https://yv4kfv1n3j.feishu.cn/docx/MRyxdaqz8ow5RjxyL1ucrvOYnnH>
70 0
|
24天前
|
网络协议 Linux SDN
虚拟网络设备与Linux网络协议栈
在现代计算环境中,虚拟网络设备在实现灵活的网络配置和隔离方面发挥了至关重要的作用🔧,特别是在容器化和虚拟化技术广泛应用的今天🌐。而Linux网络协议栈则是操作系统处理网络通信的核心💻,它支持广泛的协议和网络服务🌍,确保数据正确地在网络中传输。本文将深入分析虚拟网络设备与Linux网络协议栈的关联,揭示它们如何共同工作以支持复杂的网络需求。