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. 功能
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. 功能
相关文章推荐
- winform中利用反射实现泛型数据访问对象基类(1)
- 7种GRE填空的快速解题方法
- MYSQL的存储过程入门游标
- 字符创去除首尾空格,合并串中的多个空格为一个空格
- Linux下rar命令详解
- 二分插入排序
- Spring Model
- 前台字符串过滤_前台进行条件查询
- sublime基本命令和使用
- 那些逐步掌握的JavaScript(开篇)
- block与刷新(collectionView、tableview)
- [Unity3d]打包Assetbundle并加载
- LaTeX中使用包subfig引用子图标号
- Linux中断分层工作队列学习
- javaweb学习总结——使用Cookie进行会话管理
- 《Windows服务器配置与管理》 web发布
- Win10 Build 10154新版曝光:99%的正式版
- ORA-00980: synonym translation is no longer valid
- 架构师推荐学习的一些知识体系
- iOS画图 简单划线