[国嵌攻略][119][Linux中断处理程序设计]
裸机中断:
1.中断统一入口。
2.注册中断处理程序。
3.根据中断源编号,调用中断处理程序。
Linux中断
1.在entry-armv.S中的_irq_svc是中断统一入口。
2.获取产生中断源的编号(中断号)。
3.根据中断号,找到irq_desc结构
4.从irq_desc描述结构中取出事先注册好的函数来运行。
驱动程序需要做什么
1.实现中断处理程序
2.注册中断处理程序
Linux中断处理程序设计
1.中断注册
request_irp函数用于注册中断。
int request_irq(unsigned int irq,
void (*handler)(int, void *, struct pt_regs *),
unsigned long flags,
const char *devname,
void *dev_id
)
返回0表示成功,或者返回一个错误码。
参数说明:
1.1.unsigned int irq
中断号
1.2.void (*handler)(int, void *, struct pt_regs *)
中断处理函数
1.3.unsigned long flags
与中断管理有关的各种选项
在flags参数中,可以选择一些与中断管理有关的选项,例如:
IRQF_DISABLED(SA_INTERRUPT)
如果设置该位,表示是一个“快速”中断处理程序;如果没有设置该位,那么是一个“慢速”中断处理程序。
快/慢速中断的主要区别在于:快速中断保证中断处理的原子性(不被打断),而慢速中断则不保证。换句话说,也就是”开启中断”标志位(处理器IF)在运行快速中断处理程序时是关闭的,因此在服务该中断时,不会被其他类型的中断打断;而调用慢速中断处理时,其他类型的中断仍可以得到服务。
IRQF_SHARED(SA_SHIRQ)
该位表明该中断号是多个设备共享的。
在irq_desc结构中相同中断号的处理函数形成一个链表,但响应中断时,该链表上的中断函数都会被调用一遍。所以在编写中断处理程序时,首先检查设备是否产生中断,如果产生了中断,那么处理;如果没有,那么退出。
IRQF_TRIGGER_FALLING
下降沿产生中断
1.4.const char *devname
设备名
1.5.void *dev_id
共享中断时使用。
2.中断处理程序
中断处理程序的特别之处是在中断上下文中运行的,它的行为受到某些限制:
2.1.不能使用可能引起阻塞的函数
2.2.不能使用可能引起调度的函数
3.中断处理流程:
3.1.检测设备是否产生了中断
3.2.清除中断产生标志
3.3.相应的硬件操作
4.注销中断
当设备不再需要使用中断时(通常在驱动卸载时),应当把它们注销,使用函数:
void free_irq(unsigned int irq, void *dev_id)
[国嵌攻略][119][Linux中断处理程序设计]的更多相关文章
- [国嵌攻略][117][LED驱动程序设计]
LED程序设计 1.编写内核模块 2.搭建字符驱动框架 3.实现设备方法 头文件 <linux/io.h> writel() 1.编译/安装驱动 make cp leddev.ko ... ...
- [国嵌攻略][164][USB驱动程序设计]
USB驱动模型 1.USB host controller driver(主控器驱动):为USB主控制器提供驱动程序 2.USB core(USB核心):连接USB主控制器驱动和USB设备驱动 3.U ...
- [国嵌攻略][108][Linux内核链表]
链表简介 链表是一种常见的数据结构,它通过指针将一系列数据节点连接成一条数据链.相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入 ...
- [国嵌攻略][107][Linux进程管理子系统]
进程与程序 1.程序:存放在磁盘上的一系列代码和数据的可执行映像,是一个静止的实体. 2.进程:是一个执行中的程序,它是一个动态的实体. 进程四要素 1.有一段程序供其执行.这段程序不一定是某个进程所 ...
- [国嵌攻略][106][Linux内存管理子系统]
内存管理子系统 1.虚拟地址与物理地址的映射 2.物理内存的分配 Linux虚拟地址空间分布 设备最后访问的一定是物理地址,但Linux系统中使用的都是虚拟地址.虚拟地址简单的来说就是程序中使用的地址 ...
- [国嵌攻略][104][Linux内核模块设计]
内核模块示例 #inlcude <linux/init.h> #inlcude <linux/module.h> static int hello_init(){ printk ...
- [国嵌攻略][103][Linux内核模块基础]
什么是内核模块 Linux内核的整体结构非常庞大,其中包含的组件也非常多,如何使用这些组件.一种方式是把所有的组件都编译进内核文件,即zImage或bzImage,但这样会导致一个问题,占用内存过多. ...
- [国嵌攻略][099][Linux内核配置与编译]
为什么要配置内核 基于硬件和软件的需求选出需要的功能,去掉不要的功能. 内核配置的方法 make config:基于文本交互的配置. make menuconfig:基于图形菜单的配置. make m ...
- [国嵌攻略][098][Linux内核简介]
Linux系统架构 1.用户空间:应用程序.C函数库 2.内核空间:系统调用接口.内核.体系结构相关代码 Linux系统利用处理器不同的工作模式,使用其中的两个级别分别来运行Linux内核与应用程序, ...
随机推荐
- 豹哥嵌入式讲堂:ARM开发中有用的文件(1)- source文件
大家好,我是豹哥,猎豹的豹,犀利哥的哥.今天豹哥给大家讲的是嵌入式开发里的source文件种类. 众所周知,嵌入式开发属于偏底层的开发,主要编程语言是C和汇编.所以本文要讲的source文件主要指的就 ...
- Spring 自动装配及自动注册的相关配置
Spring支持好几种自动装配(Autowiring)的方式,以及自动扫描并注册Bean的配置(在beans.xml中配置). 下文我们进行一个小结. 1. <context: annotati ...
- Python第二十二天 stat模块 os.chmod方法 os.stat方法 pwd grp模块
Python第二十二天 stat模块 os.chmod方法 os.stat方法 pwd grp模块 stat模块描述了os.stat(filename)返回的文件属性列表中各值的意义,根据 ...
- UTC 通用格式时间 转换为 时间戳,并格式化为2017-01-01 12:00:00
在使用阿里云oss获取文件列表是,发现时间格式是这样的 2016-09-20T13:45:04.000Z (尼玛,是什么鬼), 经过度娘的解答,发现这就是传说中的 UTC通用格式时间 问题来了,怎么转 ...
- IDA Pro反编译代码类型转换参考
/* This file contains definitions used by the Hex-Rays decompiler output. It has type definitions an ...
- 【软件】关于Notepad++(32位)
1.Notepad++安装包 简介:NotePad++是一个轻量级的代码编辑器,占用内存少,运行速度快. 官网网址:https://notepad-plus-plus.org/ 百度网盘:https: ...
- UIViewController生命周期控制-开发规范
从网上各位iOS们收集并总结: 各方法使用: init 中初始化一些UI组件,比如UIButton,UILabel等 loadView 中 createFields 接受参数,初始化变量 create ...
- JavaScript Html页面加载完成
//一.Html页面加载完成的JS写法 //1. $(function () { alert("窗体Html页面加载完成方法一"); }); //2. $(document ...
- Hadoop 新生报道(四) WordCount
WordCount是hadoop里hello word级的第一个程序,作为一个萌新,我也来跑一跑这个,附带针对新人的说明. 所谓WordCount,就是统计一个或几个文档中相同的单 ...
- Caused by: org.xml.sax.SAXParseException; systemId: file:/home/hadoop/hive-0.12.0/conf/hive-site.xml; lineNumber: 5; columnNumber: 2; The markup in the document following the root element must be well
1:Hive安装的过程(Hive启动的时候报的错误),贴一下错误,和为什么错,以及解决方法: [root@master bin]# ./hive // :: INFO Configuration.de ...