您的位置:首页 > 其它

ARM9中断处理学习

2015-06-26 16:35 204 查看
裸机中断流程:

1.当硬件发生中断会跳转到异常向量表,然后跳转到IRQ异常处理标号处

2.进入IRQ异常处理后首先保护中断现场,然后跳转到中断处理函数,接着读取中断源编号(C读取或者汇编读取都可以)

3.根据不同的中断源编号调用中断处理函数



Linux中断发生后处理流程:

内核代码:entry-arm.S文件中,_irq_svc标号处为中断统一入口

进入irq_svc

1 拿到产生中断源的编号(中断号)

2 根据中断号找到用户注册在内核中,相同中断号的结构体(irq_desc结构体)

3 从找到的中断号结构体中取出事先注册好的中断处理函数

(利用中断号找到irq_desc结构体然后调用action中存储的中断函数)



Linux中断处理函数:

1 中断注册函数:

request_irq(unsigned int irq, void(*handler)(int,void*, struct pt_regs *), unsigned long flags, const char *devname, void *dev_id)

注册成功返回0,失败返回错误码

irp 中断号

handler 中断处理函数

flags:IRQF_DISABLED(SA_INTERRUPT)、IRQF_SHARED(SA_SHIRQ)

IRQF_DISABLED(SA_INTERRUPT)如果设置该位,表示中断处理程序为快速中断(系统在处理快速中断函数时是不允许被打断(原子性))

IRQF_SHARED(SA_SHIRQ)如果设置该位,表示共享中断(表示多个设备可以同时使用一个中断源(中断号)),该调用哪个设备的中断函数判别方法:判断是设备是否发生中断。

devname:中断设备名

dev_id:共享中断使用



当设备不再需要使用中断时(通常在驱动卸载时),应当把他们注销,使用函数:

void free_irq(unsigned int irq, void *dev_id)



中断处理程序的特别之处是在中断上下文中运行的,它的行为受到某些限制:

1.不能使用可能硬气阻塞的函数(获取信号量等)

2.不能使用可能引起调度的函数



中断处理函数编写顺序:

1。检查设备是否产生了中断

2。清除中断产生标志

3。相应的硬件操作



Linux中断函数设计流程:

1. 实现中断函数

2. 注册中断函数



按键中断函数:_irqreturn_t key_init(int irq, void *dev_id)

1. 检查是否发生了按键中断

2. 清除已经发生的按键中断

3. 功能
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: