我是靠谱客的博主 暴躁红酒,最近开发中收集的这篇文章主要介绍内核定时器timer的介绍及使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

timer的介绍及使用

        • 一、timer介绍
        • 二、timer的使用

问题:想在驱动程序中实现间隔3秒打印一次,所以涉及到了内核定时器timer的使用。

一、timer介绍

1.定义timer结构体

static struct timer_list timer;

2.初始化定时器

timer_setup(timer, callback, data);

timer:定时器结构体指针
callback:超时函数
data:传入超时函数的参数

3.修改超时时间

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

4.将定时器添加到内核中

add_timer(struct timer_list *timer);

5.删除定时器

del_timer(struct timer_list *timer)

二、timer的使用

1.定时器使用流程
(1)定义一个定时器
(2)编写定时器回调函数(如果需要定时器周期性运行的话就需要在回调函数中定义 mod_timer)
(3)定时器初始化
(4)将定时器添加到内核
(5)删除定时器

2.定时器使用示例代码
实现每间隔2s打印一次hello world.

#include <linux/module.h>
#include <linux/timer.h>
 
struct timer_list timer; /* 1.定义定时器 */
 
/* 3.定义定时器 */
static void timer_function(unsigned long data)
{
	 /* 在回调函数中编写定时器处理代码 */
        printk("%sn", (char *)data);
       /* 如果需要定时器周期性运行的话就使用 mod_timer,函数重新设置超时值并且启动定时器。*/
        mod_timer(&timer, jiffies + msecs_to_jiffies(2000));
        //mod_timer(&timer, jiffies + 2*HZ);也可
}
 
static int __init timer_init(void)
{
	    timer_setup(&timer, timer_function, (unsigned long)"Hello, world!");  /* 2.初始化定时器 */
	    add_timer(&timer);  /* 4. 启动定时器 */
        return 0;
}
 
static void __exit timer_exit(void)
{
        del_timer(&timer);
}
 
module_init(timer_init);
module_exit(timer_exit); 

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

就比如说需要每间隔3秒打印一次的话,就需要在超时函数中实现打印语句,并mod_timer()重新设置超时时间。每次等待超时,调用超时函数,打印,再设置超时时间,以此来实现循环间隔打印。

参考:
https://blog.51cto.com/u_12956289/2917032
https://blog.csdn.net/weixin_45309916/article/details/118584630

最后

以上就是暴躁红酒为你收集整理的内核定时器timer的介绍及使用的全部内容,希望文章能够帮你解决内核定时器timer的介绍及使用所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部