Linux内核驱动开发-006内核定时器

1驱动程序

c 复制代码
/*************************************************************************
	> File Name: timer.c
	> Author: yas
	> Mail: rage_yas@hotmail.com
	> Created Time: 2024年04月23日 星期二 19时20分42秒
 ************************************************************************/

#if 1
/*=========================The timer driver=========================*/

/*==========头文件包含==========*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/timer.h>

/*==========驱动函数声明==========*/
static int __init timer_driver_init(void);
static void __exit timer_driver_exit(void);

static void timer_out(unsigned long n);


/*==========全局变量==========*/

/* 1 定义内核定时器*/
static struct timer_list timer;


/*******************************************************************************
* 函 数 名	: timer_out
* 函数功能	: 
* 输    入  : 							
* 输    出  :
*******************************************************************************/
static void timer_out(unsigned long n)
{
    printk("%lu\n",n);

	//timer.data = jiffies;

    /*修改定时器的超时时间*/
    mod_timer(&timer,jiffies+3*HZ);//【目标定时器】【新的到期时间】
}


/*******************************************************************************
* 函 数 名	: timer_driver_init
* 函数功能	: 
* 输    入  : 							
* 输    出  :
*******************************************************************************/
static int __init timer_driver_init(void)
{
    /* 2 初始化内核定时器*/
	init_timer(&timer);

    /* 3个定时器成员变量初始化*/
    timer.function=timer_out;//回调函数,定时期满需要执行的代码
    timer.expires=jiffies+3*HZ;//定时期满=节拍初值+节拍增量(时间*节拍频率)
    timer.data=jiffies;//function成员的参数

    /* 3 启动定时器*/
    add_timer(&timer);

    return 0;
}


/*******************************************************************************
* 函 数 名	: timer_driver_exit
* 函数功能	: 
* 输    入  : 							
* 输    出  :
*******************************************************************************/
static void __exit timer_driver_exit(void)
{
    del_timer(&timer);//删除定时器
}


module_init(timer_driver_init);
module_exit(timer_driver_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("XXX");
/*=========================The timer driver=========================*/
#endif


/*=========================定时器========================*/
/* 1 基本概念:
 *  [HZ]: 计数频率 - 每秒几个节拍 - [include/asm-generic/param.h]
 *  [jiffies]: 本质上就是一个计数器,从系统启动开始计数,计数的周期系统默认配置为[1/200]
 *  所以定时精度是5ms
 * 2 定时原理:
 *  启动内核定时器后,从系统计数器当前状态开始,到达指定时间后,系统调用回调函数。
 * 3 补充:
 *  (1)提高[HZ]就可以获得更高的精度->高节拍率
 *  (2)高节拍率->中断频繁->不如不中断
 *
 *  (3)linux的几个延时函数:
 *      void ndelay(unsigned long nsecs);纳秒延时函数
 *      void udelay(unsigned long usecs);微秒延时函数
 *      void mdelay(unsigned long mseces);毫秒延时函数
 *********************************************************/
相关推荐
沫璃染墨15 小时前
《从零入门Linux系统篇(五十八):线程篇·十一——线程安全与死锁详解:从可重入到多锁管理》
linux·服务器·开发语言·c++·驱动开发·安全·架构
ebiobiz16 小时前
Zig 工具链编译 STM32 开发指南
驱动开发·stm32·嵌入式硬件
sukalot17 小时前
Windows 驱动实例分析系列:libwdi 驱动分析 - 应用篇(一)
windows·驱动开发
Carl_奕然17 小时前
【智能体】Loop 的四种设计模式之:Event-Driven Loop(2026 最新版)
人工智能·驱动开发·python·设计模式
gwf2161 天前
Completion Queue(CQ)与中断处理:轮询、中断聚合与错误码 —— 面向AI集群的驱动级深度剖析
驱动开发·性能调优·pcie·rdma·ai集群·中断聚合·cq
kakakahahahaha2 天前
Windows鼠标失灵排查:Ctrl Alt Delete、Mouse Keys、USB控制器与驱动修复
windows·驱动开发·电脑·笔记本电脑·软件需求
傲世仙尊2 天前
TCP报头全解-序号确认应答与可靠性是一个准数
驱动开发·网络协议·tcp/ip
sukalot3 天前
Windows 驱动实例分析系列:libwdi 驱动分析 - libwdi 篇(五)
windows·驱动开发
沫璃染墨3 天前
《从零入门Linux系统篇(五十六):线程篇·九——生产者消费者模型:从条件变量到BlockingQueue实现》
linux·服务器·c++·驱动开发·设计模式·架构·系统架构
傲世仙尊3 天前
UDP底层与守护进程化-报头结构体skbuff指针移动与自成会话
驱动开发·网络协议·udp