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中断管 ...
随机推荐
- Layui + tp3.2 配合表格搜索
html 部分 <!--搜索--><fieldset class="layui-elem-field layui-field-title" style=" ...
- agumaster 分页方案
本文例程下载:https://files.cnblogs.com/files/xiandedanteng/agumaster20200430-1.zip 之前的分页方案有点小瑕疵,这回修正了一下. 控 ...
- 本地模拟 gitlab ci 的 demo 项目
构建好的镜像能跑起来, 项目地址: https://github.com/szliugx/gitlab-ci-local 为了不每次提交,本地可以做一些模拟 gitlab ci 的测试≍,主要实现方式 ...
- 操作DOM对象
操作DOM对象 目录 操作DOM对象 1. 核心 2. 获得Dom节点 3. 更新节点 1. 操作文本 2. 操作CSS 4. 删除节点 5. 插入节点 1. 追加(将已存在的节点移到后面) 2. 创 ...
- 再深入一点|binlog和relay-log到底长啥样?
上一篇mysql面试的文章之后收到不少朋友的意见,希望深入讲讲复制.日志的格式这些,今天,我们就来深挖一下mysql的复制机制到底有哪一些,以及binlog和relay-log的结构到底是什么样子的. ...
- js去掉最右边的逗号
str=(str.substring(str.length-1)==',')?str.substring(0,str.length-1):str;
- Ubuntu修改默认Python版本,你了解多少~
目录 1 查看Python版本 1.1 查看装有哪些版本 1.2 查看默认版本 2 修改Python默认版本 2.1 基于文件修改 2.2 基于软链接修改 1 查看Python版本 1.1 查看装有哪 ...
- C#封装YOLOv4算法进行目标检测
C#封装YOLOv4算法进行目标检测 概述 官网:https://pjreddie.com/darknet/ Darknet:[Github] C#封装代码:[Github] YOLO: 是实现实时物 ...
- [程序员代码面试指南]递归和动态规划-最长公共子串问题(DP,LCST)
问题描述 如题. 例:输入两个字符串 str1="1AB234",str2="1234EF" ,应输出最长公共子串"234". 解题思路 状 ...
- nioServerChannel的的状态
转载自https://blog.csdn.net/zxhoo/article/details/17964353 Channel继承层次图分析上面提到的三个状态的时候,会去看Channel继承层次里某些 ...