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);毫秒延时函数
 *********************************************************/
相关推荐
马剑威(威哥爱编程)2 小时前
Linux驱动开发13个实用案例
linux·运维·驱动开发
sukalot3 小时前
Windows 图形显示驱动开发-上下文监视
驱动开发
W说编程2 天前
嵌入式Linux系统UART驱动移植专题详解(3000+字图文实战指南)
linux·c语言·驱动开发·嵌入式硬件
silent_dusbin2 天前
LCD Drive-IC ST7789V SPI-4line 调试
驱动开发
sukalot4 天前
Windows 图形显示驱动开发-WDDM 2.0 -GPU虚拟寻址概述
驱动开发
挥剑决浮云 -4 天前
Linux驱动层学习:LED 驱动开发
linux·驱动开发·笔记·学习
7yewh7 天前
嵌入式知识点总结 网络编程 专题提升(一)-TCP/UDP
网络·arm开发·驱动开发·物联网·网络协议·tcp/ip·udp
sukalot7 天前
Windows 图形显示驱动开发-WDDM 2.0 -GpuMmu 寻址方式
驱动开发
寰宇榛仁7 天前
功能机驱动开发步骤
驱动开发
忧虑的乌龟蛋7 天前
Linux 驱动开发:字符设备、块设备与网络设备驱动详解
linux·运维·驱动开发·嵌入式硬件·mcu·物联网·网络协议