在驱动中利用中断

1.利用中断号产生中断

通过执行中断函数来达到利用中断

注册中断:

request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
	    const char *name, void *dev);

irq:中断号

handler:中断函数

flags:中断类型

#define IRQF_TRIGGER_NONE	0x00000000
#define IRQF_TRIGGER_RISING	0x00000001  //上升沿
#define IRQF_TRIGGER_FALLING	0x00000002  //下降沿
#define IRQF_TRIGGER_HIGH	0x00000004  //高电平
#define IRQF_TRIGGER_LOW	0x00000008  //低电平
#define IRQF_TRIGGER_MASK	(IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW | \
				 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)
#define IRQF_TRIGGER_PROBE	0x00000010

name:名字

dev:一般为NULL

注销中断:

void free_irq(unsigned int, void *);

利用中断时一定要小心这个问题:

参考我的博客:https://blog.csdn.net/qq_40732350/article/details/83213933

 

2.利用定时器产生中断

结构体:

struct timer_list {
	/*
	 * All fields that change during normal runtime grouped to the
	 * same cacheline
	 */
	struct list_head entry;//内核使用
	unsigned long expires; //设定的超时的值
	struct tvec_base *base;//内核使用

	void (*function)(unsigned long);//定时中断函数
	unsigned long data;

	int slack;
};

使用实例:

//注册
static struct timer_list timer;
init_timer(&timer);//初始化时钟
timer.function = s3cbutton_timer_handler;//时间到了要执行的函数

timer.expires = jiffies + (HZ/100);//设置为10毫秒检测一次按键的状态
add_timer(&timer);//添加到系统中

//注销
del_timer(&timer);

jiffies是Linux内核中的一个全局变量,用来记录自系统启动以来产生的节拍的总数。启动时,内核将该变量初始化为0,此后,每次时钟中断处理程序都会增加该变量的值。因为一秒内时钟中断的次数等于HZ,所以jiffies一秒内增加的值也就为HZ。系统运行时间以秒为单位计算,就等于jiffies/HZ。


    节拍率HZ是通过静态预处理定义的,在系统启动时按照HZ值对硬件进行设置。体系结构不同,HZ值就不同,在i386体系结构在include/asm-i386/param.h中定义如下:
#define HZ 1000

每秒钟时钟中断1000次,也就是说,在1秒里jiffies会被增加1000。因此jiffies + 2 * HZ表示推后2秒钟。

 

void init_timer(struct timer_list *timer);

该函数用来初始化定时器结构,其实它只将prev和next指针清零;

 

void add_timer(struct timer_list *timer);

该函数将定时器插入活动定时器的全局队列中,即激活定时器;

 

void mod_timer(&polling_timer, jiffies + new_delay);

需要更改已经激活的定时器的超时时间,则调用上面函数;

 

del_timer(&polling_timer);

如果需要在定时器超时前将定时器从链表中删除,则调用上面函数。注意:定时器超时后,系统会自动删除定时器,则不用调用上面函数。


在多处理器的情况下使用:del_timer_sync(&polling_timer);和del_timer函数类似,不同的是该函数确保在它返回时,定时器函数不在任何CPU上运行,大多数情况下使用该函数。再次注意:不需要为已经超时的定时器调用该函数,因为系统会自动删除。在已经从链表删除的定时器上调用del_timer()或del_timer_sync()没什么害处,所以说从定时器函数中删除定时器是一种很好的习惯。

可以参考这个:

https://blog.csdn.net/sanshiguan/article/details/49522753

 

 

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值