linux 定时器_Linux内核定时器

硬件定时器提供时钟源,时钟源的频率可以设置,设置好后便周期性的产生定时中断,系统使用定时中断来计时,中断周期性产生的频率就是系统频率,也叫节拍率,1000Hz,100Hz等等,可以在编译Linux内核的时候通过图形化界面设置系统节拍率

->Kernel Features    ->Timer freqency([=y])

设置好后再内核源码根目录下.config文件有COINFIG_HZ的定义,默认100Hz,10ms一次,一次中断发生的最短为10ms,比如Mpu6050的dmp5ms硬件中断不可

jiffies

Linux内核使用jiffies来记录系统从启动一来的系统节拍数,系统启动的时候将jiffies初始化为0,jiffies在include/linux/jiffies.h中

extern u64 __jiffy_data jiffies_64;extern unsigned long volatile __jiffy_data jiffies;

jiffies_64与jiffies是同一个东西,jiffies_64用于64位系统,jiffies用于32位系统,jiffies就是jiffies_64的低32位

038e7ed509c93804cffa949557db2ba8.png

Hz表示每秒的节拍数,jiffies表示运行jiffies节拍数,所以jiffies/Hz就是系统运行恶的时间,单位为秒(S)。jiffies和jiffies_64都有溢出的风险,叫做绕回

timer_after(unknow,known);time_before(unknow,known);time_after_eq(unknow,known);time_before_eq(unknow,known);//unknow为当前的jiffies的值//known为需要对比的值//unkown 超过 known 的话, time_after 函数返回真//如果 unkown 没有超过 known 的话 time_before 函数返回真,否则返回假//time_after_eq 函数和 time_after 函数类似,只是多了判断等于这个条件。同理, time_before_eq 函数和 time_before 函数也类似
unsigned long timeout;timeout=jiffies+(2*HZ);//超时的时间点,if(timer_before(jiffies,timeout))//判断代码执行时间是不是超过了2秒{    /*超时未发生*/}else{    /*超时处理*/}

jiffies和ms、us、ns之间的转换函数

int jiffies_to_msecs(const unsigned long j);int jiffies_to_usecs(const unsigned long j);u64 jiffies_to_nsecs(const unsigned long j);long msecs_to_jiffies(const unsigned int m);long usecs_to_jiffies(const unsigned int u);unsigned long nsecs_to_jiffies(u64 n);
内核定时器

使用timer_list结构体表示内核定时器

struct tiemr_list{  struct list_head entry;  unsigned long expires; //定时超时时间,单位节拍数    struct tvec_base *base;    void (*function)(unsigned long);//定时处理函数    unsigned long data;//传递给function函数的参数    int slack;};//超时两秒 expires=jiffies+(2*HZ)

定时器api函数

void init_timer(struct timer_list *timer);//timer 初始化定时器//返回值,无
void add_timer(struct timer_list *timer);//timer 要注册的定时器//返回值 无//使用add_timer函数向内核注册定时器后,定时器就会开始运行
int del_timer(struct timer_list *timer);//tiemr 要删除的定时器//返回值 0,定时器还没被激活 1,定时器已经被激活//在多处理器系统上,定时器可能会在其他的处理器上运行,因此在调用del_timer 函数删除定时器之前要先等待其他处理器的定时处理器函数退出
int del_timer_sync(struct timer_list *timer);//timer 要删除的定时器//返回值 0,定时器还没被激活,1,定时器已经被激活//del_timer_sync 函数是 del_timer 函数的同步版,会等待其他处理器使用完定时器再删除,del_timer_sync 不能使用在中断上下文中
int mod_timer(struct timer_list *timer,unsigned long expires);//用于修改定时值,如果定时器还没有被激活,mod_timer会激活定时器//tiemr 要修改超时时间(定时值)的定时器//expires修改后的超时时间//返回值 0,调用mod_timer函数前定时器未被激活;1,调用mod_timer函数前定时器已被激活

定时器使用一般流程

struct timer_list timer;void function(unsigned long arg){    /*定时器处理函数*/    //如果要周期性的运行    mod_timer(&dev-timertest,jiffies+msecs_to_jiffies(2000));    //2ms周期}//初始化void init(void){    init_timer(&timer);    timer.function=function,    timer.expires=jiffies+msecs_to_jiffies(2000),    timer.data=(unsigned long)&dev;//将设备结构体作为参数  add_timer(&timer);//启动定时器}void exit(void){    del_timer(&timer);    //or    del_timer_sync(&timer);}

Linux内核短延时函数

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


http://www.niftyadmin.cn/n/922593.html

相关文章

Linux下搭建ntp时间服务器

NTP(Network Time Protocol)服务器是用于局域网服务器时间同步使用的,可以保证局域网所有的服务器与时间服务器的时间保持一致,应用于对时间实时性要求高的、必须统一时间事件。 NTP时间服务器是一个简单的常用的服务器&#xff0…

Linux下修改时间

我们一般使用“date -s”命令来修改系统时间。 比如将系统时间设定成1996年6月10日的命令: #date -s 06/10/96 将系统时间设定成下午1点12分0秒的命令: #date -s 13:12:00 注意,这里说的是系统时间,是linux由操作系统维护的。 …

单片机c语言必背代码_[ 爱找茬 ]都是C语言,单片机C语言和普通的C语言究竟有什么差异呢?...

许多小伙伴在学完C语言后想入门单片机,但学着学着发现明明都是C语言,为什么单片机C语言和我当初学的C语言有差异呢?今天小编就来梳理我们平时所学的C语言与单片机C语言的有什么样的不同。C语言:C语言是一门通用计算机编程语言&…

CentOS 7 yum安装出现/var/run/yum.pid 已被锁定

刚安装的CentOS 7 准备用yum安装一个ntp时间服务器,出现下面的错误: [rootlocalhost ~]# yum install ntp ntpdate -y 已加载插件:fastestmirror, langpacks /var/run/yum.pid 已被锁定,PID 为 3018 的另一个程序正在运行。 Anoth…

python爬虫运行时容易卡住_pycharm多线程爬虫调试没问题运行就卡住

[Python] 纯文本查看 复制代码import requestsfrom fake_useragent import UserAgentimport osimport threadingfrom lxml import etreefrom queue import Queueimport timeimport reclass Producer(threading.Thread):headers {"Referer": "https://www.隐藏.…

device eth0 does not seem to be present, delaying initialization

VMware虚拟机启动出错,就把这个虚拟机删除掉重新建立,系统虚拟硬盘使用之前的,启动系统后不能上网,通过ifconfig查看网卡没启动,遂启动网卡服务,但是出错,就是:device eth0 does not…

mac u盘无法写入_Mac上如何读写移动硬盘?三款NTFS读写软件分享给大家

NTFS是微软开发的,在目前使用的大部分电脑操作系统上,都支持此类格式的读写。然而Mac电脑上无法通过正规途径进行NTFS格式硬盘的写入,怎么解决这个难题呢?三款NTFS读写软件分享给大家,需要的朋友收藏起来吧&#xff01…

CentOS 7关闭firewalld启用iptables

在CentOS7中,有很多CentOS 6中的常用服务发生了变化。 其中iptables是其中比较大的一个。防火墙iptables被firewalld取代。 本文将介绍,如果采用systemctl关闭firewalld,开启iptables。 1.关闭firewalld [roothwcentos70-01 system]# systemc…