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);毫秒延时函数
*********************************************************/