linux内核定时器

linux内核定时器

任务的延后处理,在内核空间中做到精确延时后执行函数,通过软件中断实现,所以也不可中断。

定时器结构体,在include/linux/timer.h中定义

struct timer_list {
	struct list_head entry; 			//定时器列表
	unsigned long expires; 				//定时器到期时间,jiffies
	void (*function)(unsigned long); 	 //定时器处理函数
	unsigned long data; 				//作为参数被传入定时器处理函数
	struct timer_base_s *base;
};

实现流程:

  1. __init函数中定义并初始化
  2. 为timer赋值,最少赋值function
  3. timer中的expires赋值
  4. 在需要时向系统添加timer
  5. __exit函数中删除timer

相关函数:

	struct timer_list my_timer;
//初始化timer
	void init_timer(struct timer_list * timer);

//将func和timer绑定		
	static inline void setup_timer(struct timer_list * timer,
						void (*function)(unsigned long),
						unsigned long data);
//向系统增加和删除timer	
	void add_timer(struct timer_list * timer);	
	int del_timer(struct timer_list * timer);

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

例程:以3s为一次间隙,打印数据,限于板子主频为200M,所以最多定时到5ms。

#include <linux/module.h>    
#include <linux/init.h>    
#include <linux/timer.h>    
      
void timerFunc(unsigned long data);    
      
struct timer_list myTimer = {    
        .function = timerFunc,                                                                                              
        .data = 10,                                                                                                         };                                                                                                                          
                                                                                                                              
void timerFunc(unsigned long data)                                                                                          
{                                                                                                                           
        myTimer.expires = jiffies + 3*HZ;                                                                                   
        add_timer(&myTimer);                                                                                                
        printk("timer data = %lu\n", data);                                                                                 
        return ;                                                                                                            
}                                                                                                                           
                                                                                                                              
static __init int myTimer_init(void)                                                                                        
{                                                                                                                           
        printk("---------key1_init---------\n");                                                                            
        init_timer(&myTimer);                                                                                               
        myTimer.expires = jiffies + 3*HZ;
        add_timer(&myTimer);
           return 0;
}
  
static __exit void myTimer_exit(void)
{
        printk("---------key1_exit---------\n");
        return ;
}
  
module_init(myTimer_init);
module_exit(myTimer_exit);                 
                                             
MODULE_LICENSE("GPL");
MODULE_AUTHOR("HuiZhe");
MODULE_DESCRIPTION("myTimer test");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值