我是靠谱客的博主 知性冷风,最近开发中收集的这篇文章主要介绍Linux内核定时器简介及其简单使用1、内核定时器简介2、关于定时器的API函数3、定时器使用流程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

内核定时器简介

  • 1、内核定时器简介
  • 2、关于定时器的API函数
  • 3、定时器使用流程

1、内核定时器简介

定时器是一个很常用的功能,需要周期性处理的工作都要用到定时器。 Linux 内核定时器采用系统时钟来实现。Linux 内核定时器使用很简单,只需要提供超时时间(相当于定时值)和定时处理函数即可,当超时时间到了以后设置的定时处理函数就会执行,和我们使用硬件定时器的套路一样,只是使用内核定时器不需要做一大堆的寄存器初始化工作。在使用内核定时器的时候要注意一点,内核定时器并不是周期性运行的,超时以后就会自动关闭,因此如果想要实现周期性定时,那么就需要在定时处理函数中重新开启定时器。 Linux 内核使用 timer_list 结构体表示内核定时器, timer_list 定义在文件include/linux/timer.h 中

struct timer_list {
	/*
	 * All fields that change during normal runtime grouped to the
	 * same cacheline
	 */
	struct list_head entry;
	unsigned long expires;					/* 定时器超时时间,单位是节拍数 */
	struct tvec_base *base;

	void (*function)(unsigned long);		/* 定时处理函数 */
	unsigned long data;						/* 要传递给 function 函数的参数 */

	int slack;

#ifdef CONFIG_TIMER_STATS
	int start_pid;
	void *start_site;
	char start_comm[16];
#endif
#ifdef CONFIG_LOCKDEP
	struct lockdep_map lockdep_map;
#endif
};

timer_list 中有三个重要参数:
① unsigned long expires; /* 定时器超时时间,单位是节拍数 */
② void (function)(unsigned long); / 定时处理函数 /
③ unsigned long data; /
要传递给 function 函数的参数 */

2、关于定时器的API函数

函数原型作用
void init_timer(struct timer_list *timer)初始化 timer_list 类型变量
void add_timer(struct timer_list *timer)向 Linux 内核注册定时器
int del_timer(struct timer_list * timer)删除一个定时器(不管定时器有没有被激活,都可以使用此函数删除)
int del_timer_sync(struct timer_list *timer)函数用于删除一个定时器(会等待其他处理器使用完定时器再删除,del_timer_sync 不能使用在中断上下文中)
int mod_timer(struct timer_list *timer, unsigned long expires)mod_timer 函数用于修改定时值,如果定时器还没有激活的话, mod_timer 函数会激活定时器!

3、定时器使用流程

①、定义一个定时器
②、编写定时器回调函数(如果需要定时器周期性运行的话就使用 mod_timer)
③、定时器初始化
1、) 初始化定时器
2、) 设置定时处理函数
3、) 设置超时时间
4、) 设置处理函数的参数
5、) 启动定时器
④、删除定时器

框架如下:

struct timer_list timer; /* 定义定时器 */

/* 定时器回调函数 */
void function(unsigned long arg)
{
	 /*
	 * 定时器处理代码
	 */
 }
 
 /* 初始化函数 */
void init(void)
{
	 init_timer(&timer); /* 初始化定时器 */
	
	 timer.function = function; /* 设置定时处理函数 */
	 timer.expires=jffies + msecs_to_jiffies(2000);/* 设置超时时间 2 秒 */
	 timer.data = arg; /* 将设备结构体作为参数 */
	 add_timer(&timer); /* 启动定时器 */
}

/* 退出函数 */
void exit(void)
{
	 del_timer(&timer); /* 删除定时器 */
	 /* 或者使用 */
	 del_timer_sync(&timer);
}

最后

以上就是知性冷风为你收集整理的Linux内核定时器简介及其简单使用1、内核定时器简介2、关于定时器的API函数3、定时器使用流程的全部内容,希望文章能够帮你解决Linux内核定时器简介及其简单使用1、内核定时器简介2、关于定时器的API函数3、定时器使用流程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部