【内核笔记】中断

中断处理程序运行在 中断上下文中
上下文:内核运行环境,包括寄存器值、堆栈等数据。
进程上下文:一个进程在内核态执行时,CPU的所有寄存器
中的值、进程的状态以及堆栈中的内容等。
中断上下文:中断服务程序执行时所处的内核环境,CPU的
所有寄存器的值、中断相关的硬件参数(中断控制器的寄
存器中的值)、被打断进程的信息等。
中断上下文注意事项:
–不能使用导致睡眠的处理机制(信号量、等待队列等)
–不能与用户空间交互数据(copy_to/from_user)
–中断处理函数执行时间尽可能短
#include <linux/interrupt.h> //头文件
int request_irq(unsigned int irq, //申请中断
irqreturn_t(handler)(int,void),
unsigned long irqflag,
const char *devname,
void *dev_id);
参数1:中断号,所申请的中断向量,比如EXIT0中断等定
义在mach/irqs.h
参数2:中断服务程序(函数指针)
nt request_irq(unsigned int irq,
irqreturn_t(handler)(int,void),
unsigned long irqflag,
const char *devname,
void *dev_id);
参数3:中断属性设置,定义在linux/interrupt.h
IRQF_DISABLED, 用于保证中断不被打断和嵌套
IRQF_SHARED, 申请子中断时,共享中断源
IRQF_SAMPLE_RANDOM, 表示对系统熵有贡献,对系统获取随
机数有好处
参数4:中断名字,cat /proc/interrupts 可察看系统中断信息
参数5:私有数据。给中断服务函数传递的数据。
设置中断触发方式(外部中断)
int set_irq_type(int irq, int edge);
参数1:中断号
参数2:外部中断触发方式定义在linux/irq.h
IRQ_TYPE_LEVEL_LOW,
IRQ_TYPE_LEVEL_HIGH,
IRQ_TYPE_EDGE_FALLING,
IRQ_TYPE_EDGE_RISING,
IRQ_TYPE_EDGE_BOTH
 释放中断
void free_irq(unsigned int irq, void *dev_id);
参数1:所要清除中断服务程序的中断号
参数2:中断参数,同申请时的值一致
使能中断
void enable_irq(unsigned int irq);
关闭中断,并等待中断处理完成后返回
void disable_irq(unsigned int irq);
注意:当用户在中断处理函数中使用该函数会形成死锁
关闭中断,立即返回
void disable_irq_nosync(unsigned int irq);
中断服务程序
irqreturn_t handler(int irq,void *dev_id)
{
… // 中断处理
return IRQ_HANDLED;
}
参数1:中断号,不同中断共用一个中断服务程序时区分
各中断
参数2:私有数据。中断服务函数接收的数据。
返回值:IRQ_HANDLED在linux/irqreturn.h中定义

猜你喜欢

转载自blog.csdn.net/Flywithdawn/article/details/108792675