中断与时钟

中断处理中断指CPU在执行程序的过程中,出现了某些突发事件时CPU必须暂停执行当前的程序,转去处理突发事件,处理完毕后CPU又返回原程序被中断的位置并继续执行。中断分类:外部中断 VS 内部中断可屏蔽中断 VS 不可屏蔽中断向量中断 VS 非向量中断LINUX中处理中断程序的架构如果中断本身要处理的工作很少,则直接在顶半步完成。中断实现在Linux驱动程序中,为设备实现一个中断包含两个步骤:1.向内核注册中断2.实现中断处理函数中断注册在<linux/interrupt.h
摘要由CSDN通过智能技术生成

中断处理

中断指CPU在执行程序的过程中,出现了某些突发事件时CPU必须暂停执行当前的程序,转去处理突发事件,处理完毕后CPU又返回原程序被中断的位置并继续执行。

中断分类:
外部中断 VS 内部中断
可屏蔽中断 VS 不可屏蔽中断
向量中断 VS 非向量中断

LINUX中处理中断程序的架构

在这里插入图片描述
如果中断本身要处理的工作很少,则直接在顶半步完成。

中断实现

在Linux驱动程序中,为设备实现一个中断包含两个步骤:
1.向内核注册中断
2.实现中断处理函数

中断注册

在<linux/interrupt.h>头文件中申明的下列函数用于实现中断的注册功能:

int request_irq(unsigned int irq, irqreturn_t (*handler)(int irq, void *dev_id),  unsigned long flags, const char *device,  void *dev_id)

返回0表示成功,或者返回一个错误码
unsigned int irq : 中断号。
void (*handler)(int irq, void *dev_id): 中断处理函数。
unsigned long flags :与中断管理有关的各种选项。 对内部中断,是指快速中断或者共享中断,对外部中断,是指中断触发模式等,如IRQ_TYPE_EDGE_BOTH, IRQ_TYPE_EDGE_RISING
const char *device : 传递给request_irq的字符串,用于在/proc/interrupts中显示中断的拥有者
void *dev_id :共享中断时使用,该参数会传给中断函数,一般设为指向本设备的结构体指针或者直接为NULL。
unsigned long flags : 与中断管理有关的各种选项。

1、对内部中断,是指快速中断或者共享中断等,定义在linux/irq.h通常使用:SA_SHIRQ 该位表明中断可以在设备间共享。
如ADC中的中断申请:

ret = request_irq(IRQ_ADC, adcdone_int_handler, IRQF_SHARED, DEVICE_NAME, &adcdev);

2、对外部中断,是指中断触发模式等,如IRQ_TYPE_EDGE_BOTH, IRQ_TYPE_EDGE_RISING
如按键中断申请:

 ret = request_irq(KeyIrqArray[3],key4_interrupt,IRQ_TYPE_EDGE_FALLING,“key_zsy”,NULL
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值