linux定时器

Linux内核中的jiffies及其作用介绍及jiffies等相关函数详解

跟風遠走 提交于 2020-04-07 07:27:02
在LINUX的时钟中断中涉及至二个全局变量一个是xtime,它是timeval数据结构变量,另一个则是jiffies,首先看timeval结构 struct timeval { time_t tv_sec; /***second***/ susecond_t tv_usec;/***microsecond***/ } 到底microsecond是毫秒还是微秒?? 1秒=1000毫秒(3个零),1秒=1000 000微秒(6个零),1秒=1000 000 000纳秒(9个零),1秒=1000 000 000 000皮秒(12个零)。 秒用s表现,毫秒用ms,微秒用us表示,纳秒用ns表示,皮秒用ps表示,他们的分级单位是千,即每次3个零。 混淆的原因找到了,由于毫秒用ms表示,所以我老是以为microsecond是毫秒,所以就把tv_usec理解错了。 microsecond查词霸也是微秒的意思(microsecond!=ms,microsecond==us),看来单位的表示迷惑了我,也迷惑了大多数人,请朋友们牢记这里,非常重要。 xtime是从cmos电路中取得的时间,一般是从某一历史时刻开始到现在的时间,也就是为了取得我们操作系统上显示的日期。这个就是所谓的“实时时钟”,它的精确度是微秒。 jiffies是记录着从电脑开机到现在总共的时钟中断次数

Linux下的微秒级定时器: usleep, nanosleep, select, pselect

痴心易碎 提交于 2020-03-31 00:38:16
Linux下的微秒级定时器: usleep, nanosleep, select, pselect 标签: linux null delay struct date 2012-02-07 23:29 4979人阅读 评论 (0) 收藏 举报 分类: Linux 系统编程(26) 版权声明:本文为博主原创文章,未经博主允许不得转载。 今天在公司代码中看到了使用select函数的超时功能作定时器的用法,便整理了如下几个Linux下的微秒级别的定时器。在我的Ubutu10.10 双核环境中,编译通过。 [cpp] view plain copy /* * @FileName: test_sleep.c * @Author: wzj * @Brief: * * * @History: * * @Date: 2012年02月07日星期二22:20:00 * */ #include<stdio.h> #include<stdlib.h> #include<time.h> #include<sys/time.h> #include<errno.h> #include<string.h> #include<unistd.h> #include<sys/types.h> #include<sys/select.h> int main( int argc, char **argv) {

linux 内核定时器 timer_list详解

允我心安 提交于 2020-03-30 01:20:20
http://www.linux-cn.com/html/linux/kernel/20070412/1886.shtml http://linux.ccidnet.com/art/741/20061116/952655_1.html Linux内核2.4版中去掉了老版本内核中的静态定时器机制,而只留下动态定时器。相应地在timer_bh()函数中也不再通 过run_old_timers()函数来运行老式的静态定时器。动态定时器与静态定时器这二个概念是相对于Linux内核定时器机 制的可扩展功能而言的,动态定时器是指内核的定时器队列是可以动态变化的,然而就定时器本身而言,二者并无本质的 区别。考虑到静态定时器机制的能力有限,因此Linux内核2.4版中完全去掉了以前的静态定时器机制。 7.6.1 Linux内核对定时器的描述 Linux在include/linux/timer.h头文件中定义了数据结构timer_list来描述一个内核定时器: struct timer_list { struct list_head list; unsigned long expires; unsigned long data; void (*function)(unsigned long); }; 各数据成员的含义如下: (1)双向链表元素list:用来将多个定时器连接成一条双向循环队列。 (2

蜕变成蝶~Linux设备驱动之中断与定时器

拜拜、爱过 提交于 2020-03-25 07:40:55
  “我叮咛你的 你说 不会遗忘 你告诉我的 我也全部珍藏 对于我们来说 记忆是飘不落的日子 永远不会发黄 相聚的时候 总是很短 期待的时候 总是很长 岁月的溪水边 捡拾起多少闪亮的诗行 如果你要想念我 就望一望天上那 闪烁的繁星 有我寻觅你的 目光” 谢谢你,曾经来过~   中断与定时器是我们再熟悉不过的问题了,我们在进行裸机开发学习的 时候,这几乎就是重难点,也是每个程序必要的模块信息,那么在Linux中,我们又怎么实现延时、计数,和中断呢? 一、中断 1.概述   所谓中断是指cpu在执行程序的过程中,出现了某些突发事件急待处理,cpu必需暂停执行当前执行的程序,转去处理突发事件,处理完之后cpu又返回原程序位置并继续执行,根据中断来源,中断分为内部中断和外部中断,软中断指令等属于内部中断,中断还可以分为可屏蔽中断和不可以屏蔽中断。Linux 的中断处理分为顶半部和底半部,顶半部完成尽可能少得的比较紧急的功能,往往只是简单的完成“登记中断”的工作,就是将底半部处理程序挂到该设备的底半部处理队列中去,中断处理机制如下图: 2、中断编程 2.1 申请和释放中断 (1) 申请irq int request_irq (unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname

Linux设备驱动程序学习(10) -时间、延迟及延缓操作

僤鯓⒐⒋嵵緔 提交于 2020-03-06 08:46:15
度量时间差 时钟中断由系统定时硬件以周期性的间隔产生,这个间隔由内核根据 HZ 值来设定,HZ 是一个体系依赖的值,在 <linux/param.h>中定义或该文件包含的某个子平台相关文件中。作为通用的规则,即便如果知道 HZ 的值,在编程时应当不依赖这个特定值,而始终使用HZ。对于当前版本,我们应完全信任内核开发者,他们已经选择了最适合的HZ值,最好保持 HZ 的默认值。 对用户空间,内核HZ几乎完全隐藏,用户 HZ 始终扩展为 100。当用户空间程序包含 param.h,且每个报告给用户空间的计数器都做了相应转换。对用户来说确切的 HZ 值只能通过 /proc/interrupts 获得:/proc/interrupts 的计数值除以 /proc/uptime 中报告的系统运行时间。 对于ARM体系结构:在<linux/param.h>文件中的定义如下: #ifdef __KERNEL__ # define HZ CONFIG_HZ /* Internal kernel timer frequency */ # define USER_HZ 100 /* 用户空间使用的HZ,User interfaces are in "ticks" */ # define CLOCKS_PER_SEC (USER_HZ) /* like times() */ #else # define

Linux内核定时器

佐手、 提交于 2020-03-01 11:51:55
Linux内核定时器 一、内核定时器介绍   内核定时器是内核用来控制在未某个时间点(基于jiffies(节拍总数))调度执行某个函数的一种机制,相关函数位于<linux/timer.h> 和 kernel/timer.c 文件中。    当内核定时器定时时间到达时,会进入用户指定的函数,相当于软中断。内核定时器注册开启后,运行一次就不会再运行(相当于自动注销),我们可以重新设置定时器的超时时间,让定时器重复运行。   每当时钟中断发生时,全局变量jiffies(一个32位的unsigned long 变量)就加1,因此jiffies记录了linux系统启动后时钟中断发生的次数,驱动程序常利用jiffies来计算不同事件间的时间间隔。内核每秒钟将jiffies变量增加HZ次。因此,对于HZ值为100的系统,jiffy+1等于隔了10ms,而对于HZ为1000 的系统, jiffy+1仅为1ms。   注意: jiffies 变量不能被修改,修改会出现错误。 二、内核定时器相关API 1、内核定时器结构体 struct timer_list { /* * All fields that change during normal runtime grouped to the same cacheline */ struct hlist_node entry ; unsigned

内核定时任务timer_list

孤人 提交于 2020-02-29 19:35:54
使用定时器任务,可以让内核在将来的一个指定时刻执行一段指定的代码。内核定时器相关的接口在linux/timer.h文件中。 本文将会先介绍定时任务的使用,然后在此基础上了解其内部的实现逻辑。 一、定时任务结构体表示: struct timer_list { struct list_head entry; //用于链接到内核定时器链表中 unsigned long expires; //定时任务过期时间 void (*function)(unsigned long); //定时任务的工作函数 unsigned long data; //定时任务工作函数参数 struct tvec_base *base; //定时任务关联的内核定时器 #ifdef CONFIG_TIMER_STATS void *start_site; char start_comm[16]; int start_pid; #endif #ifdef CONFIG_LOCKDEP struct lockdep_map lockdep_map; #endif }; 二、定时任务相关的接口: 1. 初始化定时任务 #define TIMER_INITIALIZER(_function, _expires, _data) { \ .entry = { .prev = TIMER_ENTRY_STATIC }, \

linux定时器crontab

别等时光非礼了梦想. 提交于 2020-02-27 02:20:21
linux定时器crontab用法: 1、基本格式 :   *  *  *  *  *  command   分 时 日 月 周 命令   第1列表示分钟1~59 每分钟用*或者 */1表示   第2列表示小时1~23(0表示0点)   第3列表示日期1~31   第4列表示月份1~12   第5列标识号星期0~6(0表示星期天)   第6列要运行的命令 2、创建定时器crontab -e,例如输入:   30 2 1 * * /usr/bin/certbot renew >> /var/log/le-renew.log   35 2 1 * * /usr/bin/systemctl reload nginx   如果不需要填的选项就写 * ,不能空着不然会报错的,例如:   "/tmp/crontab.cNLTYQ":1: bad month   errors in crontab file, can't install 3、crontab -l查看系统已设置的定时器内容 4、定时器文件的位置:/var/spool/cron 来源: https://www.cnblogs.com/waterlufei/p/7261807.html

时间子系统三——低精度定时器和高精度定时器

纵然是瞬间 提交于 2020-02-17 05:32:48
先有低精度定时器,后来引入了高精度定时器。低精度定时器只能提供毫秒级别的定时时间,因为它实际上是依赖于jiffies的,一个jiffies的时间,就是其能够提供的最小定时时间,比如CONFIG_HZ配置为250,那么一个jiffies就是4ms,所以低精度定时器的精度就是4ms;而高精度定时器则不一样,它不依赖于jiffies,甚至jiffies是依赖于高精度定时器的,因为jiffies的累加实际上也是通过一个特殊的高精度定时器来实现的,高精度定时器只依赖于硬件timer,所以可以提供纳秒级别的精度。那么除了从函数接口上看到的定时事件精度的差异之外,高精度定时器和低精度定时器还有哪些不一样呢?下面通过实例来探讨一下。 高精度定时器测试代码 #include <linux/module.h> #include <linux/kernel.h> #include <linux/time64.h> #include <linux/hrtimer.h> #include <linux/timekeeper_internal.h> #define GET_TIME_SAMPLES_CNT 32 #define HRTIMER_TIMEOUT_NSECOND 1000000000 static int g_get_time_index = 0; static struct hrtimer g

《Linux系统调用:setitimer,getitimer,alarm》

流过昼夜 提交于 2020-02-07 09:07:39
一、介绍 setitimer()创建一个间隔式定时器(interval timer),会在未来某个点到期,并于此后每隔一段时间到期一次 getitimer()获取定时器了解当前状态、距离下次到期的剩余时间 alarm()为创建一次性实时定时器提供简单的一个接口 二、接口函数 #include <unistd.h> unsigned int alarm(unsigned int seconds); 参数: seconds: 表示定时器到期的秒数,到期时会产生SIGALRM信号并发送给进程,因为是实时和setitimer中的ITIMER_REAL一样 注意: alarm 和 settimer都是针对同一进程的共享实时定时器,也就是两者改变都会影响对方 调用alarm()会覆盖定时器前一个设置,调用alarm(0)会屏蔽现有定时器 alarm()返回值是定时器前一个设置距离到期的剩余次数,如未设置定时器则返回0 返回值: alarm()返回的是剩余定时器时间 #include <sys/time.h> int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value); 参数: which: 指定不同类型的定时器 ITIMER_REAL: 创建以真实时间倒计时的定时器