Linux中断驱动程序
1.中断概念
中断时一种电信号,由硬件设备产生,然后再由中断控制器向处理器发送相应的信号。处理器一经检测到该信号,便中断自己当前正在处理的工作,转而去处理中断。此后,处理器会通知操作系统已经产生中断。不同的设备,对应的中断不同,而每个中断都通过一个唯一的数字标识,这些值通常被称为中断请求线。
2.Linux2.6中断处理原理
- 获取中断号:中断处理程序的第一步要做两件事:
* 将中断号压栈
* 将当前寄存器信息压栈
- 中断串行化:将多个cpu同时产生的某一中断进行串行化
- 关中断条件下的中断处理:中断处理函数总是在关中断的情况下进行
- 开中断条件下的软中断
- 开中断下的tasklet:软中断很少直接被使用,开中断情况下进行的处理过程一般是由tasklet机制完成
3.Linux中断处理程序架构
- Linux系统将中断程序分成上半部和下半部:
* 顶半部:完成尽可能少,比较紧急的功能。往往只是简单读取寄存器中的中断状态并清除中断标志后就进行登记中断工作
* 底半部:中断处理大部分工作都在底半部完成。主要机制有:tasklet, 工作队列, 软中断
- tasklet
* 定义tasklet机器处理器,并将两者关联
void my_tasklet_func(unsigned long)
DECLARE_TASKLET(my_tasklet, my_tasklet_func, data)
* 调度
tasklet_schedule(&my_tasklet)
- 工作队列
* 定义一个工作队列
struct work_struct my_work;
void my_wq_functon(struct work_struct *work);
* 在初始化函数中通过INIT_WORK()初始化工作队列并将工作队列与处理函数绑定
INIT_WORK(&my_work, (void *)my_wq_func);
* 在适当的地方调度工作队列,一般在中断的上半部调度
schedule_work(&my_work);
- Linux 2.6中断API
* request_irq:向内核注册一个中断服务函数
* free_irq:从内核注销一个中断服务函数
* disable_irq:关闭指定中断,并等待中断服务函数运行结束才会返回
* disable_irq_nosync:关闭指定中断,不等待中断服务函数结束,调用完该函数立即返回
* enable_irq:打开指定中断
- 中断共享:指多个设备共享一根中断线的情况,中断共享使用方法如下:
* 在申请中断时,使用IRQF_SHARED标志
* 在中断到来时,会遍历共享此中断的所有中断处理程序
Linux中断驱动程序的更多相关文章
- Linux中断(interrupt)子系统之四:驱动程序接口层 & 中断通用逻辑层【转】
转自:http://blog.csdn.net/droidphone/article/details/7497787 在本系列文章的第一篇:Linux中断(interrupt)子系统之一:中断系统基本 ...
- linux网络设备驱动程序
4.linux网络设备驱动程序体系结构 -------------------------------------- | 数据包发送 | 数据包接收 | ----->网络协议接口层 | dev_ ...
- 15.linux按键驱动程序(二)
linux按键驱动程序 包含内容定时器延时去抖动,阻塞型设备驱动设计 一.定时器延时去抖 按键所用开关为机械弹性开关,当机械触点断开.闭合时,由于机械触点的弹性作用,开关不会马上稳定地接通或断开.因而 ...
- linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)
原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...
- 【转】linux设备驱动程序中的阻塞机制
原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...
- Linux中断(interrupt)子系统
Linux中断(interrupt)子系统之一:中断系统基本原理 Linux中断(interrupt)子系统之二:arch相关的硬件封装层 Linux中断(interrupt)子系统之三:中断流控处理 ...
- Linux中断分层技术
一.中断嵌套 当系统正在执行某中断处理函数时,又产生了一个新的中断,这就叫做中断嵌套.当中断为慢速中断时,新的中断会取代当前中断,即当前中断没有执行完就结束 了:当中断为快速中断时,新的终端就不会产 ...
- Linux中断管理 (2)软中断和tasklet
目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...
- Linux中断管理 (3)workqueue工作队列
目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...
随机推荐
- 13props 对象
props: { homeData: { type: Object, required: true } }, 父组件传递给子组件是对象homeData或者数组: homeData={name:'zs' ...
- 07vue 自定义全局组件 通用流程
1.全局组件的目录 2.loading/index.js import LoadingComp from './Loaiding' const compName=LoadingComp.name // ...
- SpringMVC-数据提交
数据提交 目录 数据提交 1. 前端的参数与controller中的参数名一致 2. 前端的参数与controller中的参数名不一致 3. 前端接收的是一个对象 4. 总结 5. 数据显示到前端 1 ...
- Git 沙盒模拟实战(基础篇)
Git 沙盒模拟实战 分支 现有一个主分支 创建分支 # 创建分支 $ git branch bugFix # 切换到指定分支 $ git checkout bugFix 或者 # 创建分支,并切换到 ...
- 修改mysql、oracle、sqlserver默认端口
一.修改mysql默认端口1202 1.修改mysql安装路径下的my.ini文件中的2个port值 2.修改后重启服务,win+r输入services.msc进入服务,重启服务 二.修改oracle ...
- [LeetCode]55. 跳跃游戏(贪心)
题目 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: tr ...
- 218。重复元素II(重复元素的下标差值<=K)(哈希)
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k. 示例 1: 输入: nums ...
- RFID了解
转载自为什么大家都抛弃传统标签选择RFID电子标签? rfid电子标签是一种非接触式的自动识别技术,它通过射频信号来识别目标对象并获取相关数据,识别工作无需人工干预,作为条形码的无线版本,RFID技术 ...
- 【vue】---- 新版脚手架搭建项目流程详解
一.概述 本文将介绍vue项目完整的搭建流程,在使用新版本的脚手架基础上,进行了一系列的完善和配置.主要内容如下: 1.项目初始化 安装脚手架 创建项目 项目结构 2.项目搭建配置 引入第三方插件 路 ...
- list、set、map的区别和联系
结构特点 List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合: List中存储的数据是有顺序的,并且值允许重复:Map中存储的数据是无序的,它的键是不允许重复的,但是值是允许 ...