Linux内核定时器简介及使用

Linux内核定时器简介及其简单使用 内核定时器简介1、内核定时器简介2、关于定时器的API函数3、定时器使用流程 1、内核定时器简介 定时器是一个很常用的功能,需要周期性处理的工作都要用到定时器。 Linux 内核定时器采用系统时钟来实现。Linux 内核定时器使用很简单,只需要提供超时时间(相当于定时值)和定时处理函数即可,当超时时间到了以后设置的定时处理函数就会执行,和我们使用硬件定时器的套路一样,只是使用内核定时器不需要做一大堆的寄存器初始化工作。在使用内核定时器的时候要注意一点,内核定时器并不是周期性运行的,超时以后就会自动关闭,因此 阅读详情

28.1 前言

Linux内核定时器用于处理指定时间后,执行某个动作的。其特点如下:

(1)执行了一次便不会再次执行,处理后即失效;

(2)执行的动作函数中,不允许休眠和发生调度行为;

(3)应该对被访问的数据结构进行条件设置防止被调度;

在Linux内核定时器中,不得不说的一个东西就是jiffies。jiffies是记录着从电脑开机到现在总共的时钟中断次数,Linux系统时钟频率是一个常数HZ来决定的,一秒内时钟中断的次数等于Hz,所以jiffies一秒内增加的值也就是Hz,通常HZ=100,精度就是10ms,所以一般来说Linux的精确度是10毫秒。如果我们要进行秒定时操作,需设置expire = jiffies + xs*HZ

28.2 定时器数据结构

Linux内核管理着一个定时器队列,用户新增加一个定时器就会添加到队列中。一般是定义一个新的定时器结构,然后填充好回调函数等相关参数,添加到Linux定时器中断处理链表中,当Linux计时时间到达用户所设置的定时时,那么将会执行用户所设置的操作回调函数。

struct timer_list {  
       structlist_head entry;              //timer双向链表   
       unsignedlong expires;             //timer超时变量   
   
       void(*function)(unsigned long);   //timer超时回调函数  www.linuxidc.com 
       unsignedlong data;                  //传递给回调函数的数据,也就是定时器数据   
      struct tvec_base *base;            //timer base向量表用于timer_list的挂载和链表管理   
                                              //timer的一些扩展参数 
   …………… 
};  

28.3 相关函数说明

struct timer_list tm

定时器数据结构

init_timer(*tm)

初始化定时器结构;tm定时器数据结构指针

add_timer(*tm)

添加定时器;tm定时器结构指针

mod_timer(*tm,expire)

修改定时器;tm定时器数据结构;expire超时时间,一般jiffies+xs

del_timer(*tm)

删除定时器;tm定时器数据结构指针

定时器的使用步骤为:初始化定时器结构、定时器数据结构复制、添加定时器、编写定时器回调函数、删除定时器。

28.4 内核定时器实例

#include <linux/kernel.h>  
#include <linux/init.h>  
#include <linux/fs.h>  
#include <linux/module.h>  
#include <linux/time.h>  

#define I_DEVICE_NAME           "iTimer"  
static int major;  
static struct timer_list tm;  
  
void iTimer_callback(unsigned long arg)  
{  
    struct timeval tv;  
    char *strp = (char*)arg;  
    printk(KERN_EMERG "%s: %lu, %s\n", __func__, jiffies, strp);  
  
    mod_timer(&tm,jiffies+2*HZ); //使用mod_timer或再次add_timer函数重新触发
    //tm.expires = jiffies+1*HZ;  
    //add_timer(&tm);  
}  
  
static int iopen(struct inode *pnode, struct file *pfile)  
{  
    return 0;  
}  
  
static int iRead(struct file * file, const char __user * buffer, size_t count, loff_t * ppos) 
{  
    return 0;  
}  
  
static const struct file_operations stfops = {  
    .owner  = THIS_MODULE,  
    .read   = iRead,  
    .open   = iopen,  
};  
  
static int __init iTest_Init(void)  
{  
    /* 主设备号设置为0表示由系统自动分配主设备号 */  
    major = register_chrdev(0, I_DEVICE_NAME, &stfops);  
  
    init_timer(&tm);  
    tm.function= iTimer_callback;  
    tm.data = (unsigned long)"I am timer";
    tm.expires = jiffies+1*HZ;  
    add_timer(&tm);  
  
    return 0;  
}  
  
static void __exit iTest_Exit(void)  
{  
    unregister_chrdev(major, I_DEVICE_NAME);  
    del_timer(&tm);  
}  
  
module_init(iTest_Init);  
module_exit(iTest_Exit);  
  
MODULE_LICENSE("GPL");  

 

Linux驱动开发 内核时间管理 内核定时器使用 以及 从 应用层通过ioctl接口控制内核定时器 可以使用结构体定义定时器,并通过初始化。// 1 秒后调用首先,需要定义一个唯一的 ioctl 命令,以便用户空间应用程序能够通过该命令与内核模块进行交互。_IOW# define IOCTL_SET_TIMER _IOW('t' , 1 , int) // 设置定时器的周期 # define IOCTL_STOP_TIMER _IO('t' , 2) // 停止定时器。 阅读详情

相关推荐

嵌入式Linux&Android开发-内核定时器

目录 一、内核定时器简介 二、通用定时器使用方法 三、Linux内核短延时函数 一、内核定时器简介 定时器是一个很常用的功能,需要周期性处理的工作都要用到定时器。 Linux内核定时器使用很简单,只需要提供超时时间(相当于定时值)和定时处理函数即可,当超时时间到了以后设置的定时处理函数就会执行,和我们使用硬件定时器的套路一样,只是使用内核定时器不需要做一大堆的寄存器初始化工作。 在使用内核定时器的时候要注意一点,内核定时器并不是周期性运行的,超时以后就会自动关闭,因此如果想要实现周期性定时

嵌入式成长手册 681

内核定时器init_timer与mod_timer的使用

内核定时器为了可以在某个时间点上调用函数 内核定时器的调度函数运行过一次后就不会再被运行了, 但是在del_timer销毁定时之前,可以使用add_timer(注册)或者mod_timer(修改)重新调用 一般重新调用的场景有 1 通过在被调度的函数中重新调度自己来周期运行。 2 通过某个中断服务函数中重新唤起调用 这样就可以实现while(1)循环的功能,可以用于轮询设备等工作需求。 这里被调度的函数是异步执行的。 #include <linux/init.h> #include <li

Ataraxia的专栏 4427

RK3568平台开发系列讲解(Linux系统篇)Linux内核定时器详解

📢 Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱动编写者来说最常用的定时器。硬件定时器提供时钟源,时钟源的频率可以设置, 设置好以后就周期性的产生定时中断,系统使用定时中断来计时。中断周期性产生的频率就是系统频率,也叫做节拍率(tick rate)(有的资料也叫系统频率),比如 100Hz、1000Hz 等等说的就是系统节拍率。

内核笔记 494

Linux内核定时器---init_timer()、add_timer()与mod_timer()使用

一、内核定时器API函数 init_timer(timer):初始化timer。 setup_timer(timer, fn, data):与init_timer()类似,fn为定时器回调函数,data为回调函数的参数。 void add_timer(struct timer_list *timer) 用于向 Linux 内核注册定时器,使用 add_timer 函数向内核注册定时器以后,定时器就会开始运行。 int mod_timer(struct timer_list *timer, unsigned

lihuan680680的博客 1万+

【Linux驱动编程】如何使用内核定时器

linux内核定时器是内核用于控制在未来某个时间点或者特定时间段内调度执行某个函数的一种机制。

只要思想不滑坡,想法总比问题多。 1602

【ANSYS APDL】提取结构刚度矩阵完整过程--附Python代码实现

ANSYS的结构刚度矩阵提取中一些操作技巧

m0_61038364的博客 1万+

linux内核驱动程序实现休眠和延迟操作

一、阻塞型I/O 如何使进程进入休眠并在将来唤醒? 对于已经休眠的进程,为了确保唤醒发生,完整唤醒的代码必须找到休眠的进程。所以通过维护一个等待队列的数据结构,可以将需要休眠的进程加入到等待队列中,唤醒的时候通过查找等待队列就能找到需要唤醒的进程。等待队列其实就是一个进程链表,其中包含了等待某个特定事件的所有进程。 1.简单休眠 静态初始化一个等待队列头: DECLARE_WAIT_QUEUE_HEAD(name); 动态初始化一个等待队列头: wait_queue_head_t my_queue; ini

JXG的博客 1404

linux操作系统使用以太网连接ubuntu,设置固定ipv4

首先,您需要确定要配置的网络接口。可以使用ifconfig -a或ip addr命令来列出当前系统上的所有网络接口及其相关信息。找到您要配置的网络接口名称,例如eth0、ens33或enp0s3;保存并关闭文件后,您需要重启网络服务以使更改生效。在linux操作系统中,要使用交换机连接以太网可以直接使用交互界面;如果你的操作系统没有交互界面,你可以使用命令方式配置;点击ipv4,方式为手动,可以设置ip和子网了;开头,后接网络接口名称。第三步:点击有线最右边圆形控件;第二步:点击有线设置;

2301_79311842的博客 2404

Linux内核定时器使用

内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于内核源码 linux/timer.h 和 kernel/timer.c 文件中。 被调度的函数肯定是异步执行的,它类似于一种“软件中断”,而且是处于非进程的上下文中,所以调度函数必须遵守以下规则: 没有 current 指针、不允许访问用户空间。因为没有进程上下文,相关代码和被中断的进程没有任何联系。 不能执行休眠(或可能引起休眠的函数)和调度。 任何被访问的数据结构都应该针对并发访问进行保护,以

嵌入式 688

非易失存储器读写

24C256、IIC_SCL、IIC_SDA

CT_1104的专栏 2986

AD9361 官方例程详解(一)

文章目录前言一、pandas是什么?二、使用步骤总结 前言 一、pandas是什么? 二、使用步骤 总结

weixin_44630490的博客 4万+

内核定时器的使用

(1)内核是给应用层提供接口的,一般延时都是由用户来完成的。所以在内核中不会使用延时函数,都是用内核定时器来完成。

Enosji的博客 536

常说的cache机制到底是什么?L1 cache和 L2 cache是什么?

一文带你迅速了解CPU内的cache机制!!图解多核CPU中的多级cache结构。为何有的处理器没有cache?

车载系统攻城狮 5878

Linux内核定时器使用简介

上面的终端输出中,time字段表示jiffies值,delta是自前一行来jiffies的变化值,inirq是由。,会发现定时器的上下文是进程0,即是空闲任务,该任务因为历史原因被称为“swapper”。),pid和command表示当前运行的进程,而cpu是正在使用的cpu编号。会遍历所有CPU的定时器队列,确保定时器被彻底移除。会等待其完成,防止释放内存后回调继续访问。:定时器可能被添加到任意CPU的队列中,函数返回的布尔值,如果非零表示调用。:如果定时器回调正在执行,的函数运行于中断上下文(

weixin_42369760的博客 1252

FPGA实现DDR接口

verilog// DDR2控制器状态机// 初始化序列// 发出初始化命令endendendend// 自动预充电end// 其他状态...endcaseendend。

whm128的博客 998

高温环境下(100℃以上)相机的几种保障方案

高温环境下相机保障措施摘要:针对120℃以上高温环境,相机需采取多重防护:1.散热设计采用金属机身、散热鳍片或风扇;2.关键部件选用耐高温材料(铝合金、特种玻璃);3.电子元件需军规级芯片并做三防处理;4.建议外接电源或耐高温电池。工业相机(如FLIR A655sc、Basler ace)及特种机型(Ximea xiQ)具备高温适应性,普通相机可加装隔热套件配合冷却系统。选择时需关注传感器信噪比和全局快门性能,并设置温度监控保护机制。注意高温会加速设备老化,需定期检测维护。(149字)

start_up_go的博客 1586

【Linux】Linux5.4.70内核定时器的使用

文章目录1. 定时器简介2. Timer相关API介绍3. Timer时间单位4. Timer Demo测试验证5. 定时器内部机制简单分析6. 参考资料 1. 定时器简介 本篇文章介绍内核定时器是基于内核Linux5.4.70版本,它是内核用来控制再未来某个时间点(基于jiffies)调度执行某个函数的一种机制,代码实现位于include/linux/timer.h和kernel/time/timer.c文件中。 定时器数据结构,如下: struct timer_list { /* * All fi

ZHONGCAI0901的博客 7757

PDAF相位对焦原理

pdaf光路图

camerall 1万+

Linux驱动学习—内核定时器

比如,现在是10点5分,我要定时5分钟,那么定时就是10点5分+5分钟=10点10分。HZ的值我们是可以设置的,也就是一秒对应的时钟拍数我们是可以设置的,Linux内核会使用CONFIG_HZ来设置自己的系统时钟。宏HZ就是CONFIG_HZ,因此HZ=100,表示一秒的节拍数是100,在编译Linux内核的时候可以通过图形化界面设置系统节拍率,按照如下路径打开配置界面。通过上图我们可以发现可选的系统节拍率为100HZ,200HZ,250HZ,300HZ、500HZ和1000HZ.默认是100HZ。

suifen_的博客 2337

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

16 Linux 内核定时器

一般周期性的工作都是用到了定时器,Linux 内核定时器采用系统时钟来实现。Linux 内核定时器只要给出超时时间(定时值)和定时器处理函数。当超时时间到了,设置的定时函数就会执行。需要注意的是,内核定时器不是周期性的,它是运行完就自动关闭,如果想要周期性运行定时器,那么需要在定时处理函数中重新开启定时器。/**//* 定时器超时时间,单位是节拍数 *//* 定时处理函数*/u32 flags;/* 标志位 */#endif。

Toutiegongzhu的博客 1397

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

如何使用 Linux 内核定时器

内核定时器

安迪西_嵌入式攻城狮 1482

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Linux内核定时器

本文介绍了Linux内核定时器的核心特性和应用方法。主要内容包括:1)定时器特征:基于系统心跳节拍、支持多段定时但精度不高;2)核心数据结构timer_list及其成员解析;3)时间转换函数和定时器操作API(初始化、注册、注销等);4)实际应用示例,重点展示了如何利用定时器实现按键消抖功能,通过中断触发定时器并在回调函数中检测稳定状态,有效解决了机械抖动问题。文中提供了完整的驱动代码实现方案,包括定时器初始化、中断处理和状态读取等关键环节。

m0_67219632的博客 1441

linux内核定时器

一、内核定时器简介: Linux 内核定时器使用很简单,只需要提供超时时间(相当于当前时刻)和定时处理函数即可,当超时时间到了以后设置的定时处理函数就会执行。在使用内核定时器的时候要注意一点,内核定时器并不是周期性运行的,超时以后就会自动关闭,因此如果想要实现周期性定时,那么就需要在定时处理函数中重新开启定时器。 二、几个基础概念 linux系统上,有两个非常重要的时间,墙上时间和系统运行时间。 系统运行时间:自系统启动开始所经过的时间 墙上时间:指当前时刻,可以通过ntp服务器获取,获取后可

wwwlyj123321的博客 3646

Linux内核定时器简介及定时器API函数

Linux内核定时器简介及Linux内核短延时函数

wojiaxiaohuang2014的博客 1203
上一篇: Linux字符设备驱动及设备节点自动创建
下一篇: Linux内核工作队列实例
Chasing_Chasing
博客等级 码龄10年 233粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值