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);毫秒延时函数
 *********************************************************/
相关推荐
是摆烂第一名呀10 小时前
RK3576+GMSL摄像头底层适配与调试
linux·arm开发·驱动开发·嵌入式硬件·数码相机
小此方11 小时前
Re:Linux系统篇(四十三)信号篇·一:谁在敲进程的门?一篇带你了解信号概念与产生机制
linux·运维·驱动开发
sukalot1 天前
windows网络适配器驱动开发-NetAdapterCx 接收端缩放(中)
windows·驱动开发
是摆烂第一名呀2 天前
DRM驱动流转流程(RGB)
驱动开发
是摆烂第一名呀2 天前
【rk3506】U-Boot串口时钟未配置,导致串口彻底失效
linux·arm开发·驱动开发·嵌入式硬件
是摆烂第一名呀2 天前
Uboot阶段 文件系统分片下载功能实现详解(解决大镜像内存不足问题)
驱动开发
济6172 天前
I.MX6U Linux 驱动开发篇---零基础必看!中断实验(按键中断 + 定时器消抖 + 设备树配置实战教程)--- Ubuntu20.04
linux·驱动开发·嵌入式·嵌入式linux驱动开发
是摆烂第一名呀2 天前
【RK3506】RGB屏幕与背光调试记录
linux·arm开发·驱动开发·嵌入式硬件
普普通通的一名码农4 天前
TPS6120芯片说明
驱动开发·笔记·芯片手册
阿拉斯攀登5 天前
SPI 设备驱动开发
linux·驱动开发·嵌入式硬件·linux内核·嵌入式·linux驱动·spi