Linux内核定时器--timer_list

简介: Linux内核定时器--timer_list

定时器:

linux操作系统提供了一个内核定时器
内核定时器可在未来的某个特定时间点调度执行某个函数,完成指定任务
linux内核定时器提供了一种异步处理的机制
用户通过设置将来某一时刻的滴答值来实现定时功能
假设HZ的值为200,Linux定时器最短定时时间为5ms,小于该时间的定时可直接通过硬件定时器完成

定时器使用过程:
定时器接口函数介绍:

#include <linux/timer.h>

定时器结构体类型

struct timer_list

{

    struct list_head entry;//链表节点,由内核管理

    //定时器到期时间(指定一个时刻)

    unsigned long expires;

    // 定时器处理函数

    void (*function)(unsigned long);

    // 作为参数被传入定时器处理函数

    unsigned long data;

    ......

};

初始化定时器

    void init_timer(struct timer_list *timer);

添加定时器。定时器开始计时

    void add_timer(struct timer_list * timer);

删除定时器,在定时器到期前禁止一个已注册定时器

    int del_timer(struct timer_list * timer);

如果定时器函数正在执行则在函数执行完后返回(SMP)

    int del_timer_sync(struct timer_list *timer);

更新定时器到期时间,并开启定时器

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

查看定时器是否正在被调度运行

    int timer_pending(const struct timer_list*timer);

    /*返回值为真表示正在被调度运行*/

实例代码:
驱动端:

include <linux/module.h>

include <linux/kernel.h>

include <linux/init.h>

include <linux/fs.h>

include <asm/uaccess.h>

include <linux/device.h>

include <linux/errno.h>

include <linux/timer.h>

include <linux/jiffies.h>

define DRIVER_NAME "timer_test"

define err(msg) printk(KERN_ERR "%s: " msg "\n", DRIVER_NAME)

define __debug(fmt, arg...) printk(KERN_DEBUG fmt, ##arg)

static int major = 0;
static int minor = 0;
struct class *timer_class;
struct device *timer_device;

struct timer_list timer;

static void timer_handler(unsigned long dat)
{

static int sec = 0;

sec++;
printk("<kernel>: deal timer handler.... sec = %d\n", sec);        //打印测试信息
/*更新定时器到时时间,并开启定时器*/
mod_timer(&timer, jiffies+1*HZ);            
return;

}

static int timer_test_open(struct inode inode, struct file file)
{

__debug("<kernel>: start timer test...\n");

/* return value: 1 if the timer is pending, 0 if not.*/
if(!timer_pending(&timer)){        //查看定时器是否正在被调度运行
    timer.expires = jiffies + 1*HZ;
    add_timer(&timer);
}
    return 0;

}

static int timer_test_release(struct inode inode, struct file file)
{

del_timer_sync(&timer);
__debug("<kernel>: stop timer test...\n");
    return 0;

}

static struct file_operations timer_test_fops = {

.owner = THIS_MODULE,
.open = timer_test_open,
.release = timer_test_release,

};

static int __init timer_test_init(void)
{

int retval;

//__debug("in key_eint_init\n");


init_timer(&timer);            //初始化定时器
timer.data = 0L;                //设定定时器参数
timer.function = timer_handler;    //设定定时器服务函数


major = register_chrdev(major, DRIVER_NAME, &timer_test_fops);
if(major < 0){
    err("register char device fail!");
    retval = major;
    goto error;
}
timer_class=class_create(THIS_MODULE,DRIVER_NAME);
if(IS_ERR(timer_class)){
    err("class create failed!");
    retval =  PTR_ERR(timer_class);
    goto error_class;
}
timer_device=device_create(timer_class,NULL, MKDEV(major, minor), NULL,DRIVER_NAME);
if(IS_ERR(timer_device)){
    err("device create failed!");
    retval = PTR_ERR(timer_device);
    goto error_device;
}
__debug("register timer test OK! Major = %d\n", major);
return 0;

error_device:

class_destroy(timer_class);

error_class:

unregister_chrdev(major, DRIVER_NAME);

error:

return retval;

}

static void __exit timer_test_exit(void)
{

unregister_chrdev(major, DRIVER_NAME);
device_destroy(timer_class,MKDEV(major, minor));
class_destroy(timer_class);

return;

}

module_init(timer_test_init);
module_exit(timer_test_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Eric");

[点击并拖拽以移动]

应用层:

include <stdio.h>

include <stdlib.h>

include <fcntl.h>

include <unistd.h>

int main()
{
char *devname = "/dev/timer_test";
int fd;
unsigned int sec;

fd = open(devname, O_RDWR);
if(fd < 0){
printf("file open failed!\n");
return 1;
}
while(1);
close(fd);
}

相关文章
|
1天前
|
Linux 数据库
Linux内核中的锁机制:保障并发操作的数据一致性####
【10月更文挑战第29天】 在多线程编程中,确保数据一致性和防止竞争条件是至关重要的。本文将深入探讨Linux操作系统中实现的几种关键锁机制,包括自旋锁、互斥锁和读写锁等。通过分析这些锁的设计原理和使用场景,帮助读者理解如何在实际应用中选择合适的锁机制以优化系统性能和稳定性。 ####
14 6
|
1天前
|
机器学习/深度学习 负载均衡 算法
深入探索Linux内核调度机制的优化策略###
本文旨在为读者揭开Linux操作系统中至关重要的一环——CPU调度机制的神秘面纱。通过深入浅出地解析其工作原理,并探讨一系列创新优化策略,本文不仅增强了技术爱好者的理论知识,更为系统管理员和软件开发者提供了实用的性能调优指南,旨在促进系统的高效运行与资源利用最大化。 ###
|
4天前
|
算法 Linux 开发者
深入探究Linux内核中的内存管理机制
本文旨在对Linux操作系统的内存管理机制进行深入分析,探讨其如何通过高效的内存分配和回收策略来优化系统性能。文章将详细介绍Linux内核中内存管理的关键技术点,包括物理内存与虚拟内存的映射、页面置换算法、以及内存碎片的处理方法等。通过对这些技术点的解析,本文旨在为读者提供一个清晰的Linux内存管理框架,帮助理解其在现代计算环境中的重要性和应用。
|
2天前
|
缓存 网络协议 Linux
Linux操作系统内核
Linux操作系统内核 1、进程管理: 进程调度 进程创建与销毁 进程间通信 2、内存管理: 内存分配与回收 虚拟内存管理 缓存管理 3、驱动管理: 设备驱动程序接口 硬件抽象层 中断处理 4、文件和网络管理: 文件系统管理 网络协议栈 网络安全及防火墙管理
19 4
|
4天前
|
人工智能 算法 大数据
Linux内核中的调度算法演变:从O(1)到CFS的优化之旅###
本文深入探讨了Linux操作系统内核中进程调度算法的发展历程,聚焦于O(1)调度器向完全公平调度器(CFS)的转变。不同于传统摘要对研究背景、方法、结果和结论的概述,本文创新性地采用“技术演进时间线”的形式,简明扼要地勾勒出这一转变背后的关键技术里程碑,旨在为读者提供一个清晰的历史脉络,引领其深入了解Linux调度机制的革新之路。 ###
|
6天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
30 4
|
7天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
9天前
|
缓存 Linux
揭秘Linux内核:探索CPU拓扑结构
【10月更文挑战第26天】
27 1
|
9天前
|
缓存 运维 Linux
深入探索Linux内核:CPU拓扑结构探测
【10月更文挑战第18天】在现代计算机系统中,CPU的拓扑结构对性能优化和资源管理至关重要。了解CPU的核心、线程、NUMA节点等信息,可以帮助开发者和系统管理员更好地调优应用程序和系统配置。本文将深入探讨如何在Linux内核中探测CPU拓扑结构,介绍相关工具和方法。
11 0
|
7天前
|
缓存 算法 Linux
Linux内核中的内存管理机制深度剖析####
【10月更文挑战第28天】 本文深入探讨了Linux操作系统的心脏——内核,聚焦其内存管理机制的奥秘。不同于传统摘要的概述方式,本文将以一次虚拟的内存分配请求为引子,逐步揭开Linux如何高效、安全地管理着从微小嵌入式设备到庞大数据中心数以千计程序的内存需求。通过这段旅程,读者将直观感受到Linux内存管理的精妙设计与强大能力,以及它是如何在复杂多变的环境中保持系统稳定与性能优化的。 ####
14 0
下一篇
无影云桌面