一、简介

中断:是指 CPU 在执行程序的过程中, 出现突发事件去处理, CPU 需要停止当前程序的执行, 转去处理突发 事件, 处理完成之后再返回原程序部分。

中断源:是指引发中断的原因。

硬件中断:一般指外设发出的中断请求以及内部硬件产生的中断(计算溢出, 除数为 0, 掉电等)

软件中断: 典型的是中断处理程序的下半部操作.

硬件中断的分类
内部中断: 内部硬件产生的中断(例如: 除数为 0)
外部中断: 外设产生的中断(重点)

外部中断的触发方式
上升沿触发和下降沿触发电平触发

中断优先级
系统根据中断事件的重要性和紧迫程度, 将中断源分为若干个等级, 优先级高的先执行。

中断处理函数
中断产生之后执行的一段代码。

中断向量号
中断源的识别标志, 是跳往中断程序的“入口地址”。

中断向量和非中断向量
硬件提供中断处理函数的地址
软件通过判断之后, 提供中断处理函数的最终地址

向量中断和非向量中断的判断方法
一般一个中断号对应一个中断函数就是向量中断(独立按键) 多个中断函数共用一个中断号(矩阵键盘)

中断处理程序架构
操作系统中会产生很多中断, 如果每一个中断都全部处理完之后再向后执行, 是不可能的, 所以就将中断处理程序分解为上半部和下半部。上半部一般是和硬件紧密相关的代码, 下半部一般是耗时的一些操作。
例如给 PC 插入 U 盘会产生中断, 接收之后, 硬件会马上响应, 中断操作会很快执行上半部分, 然后就向上半部分通知系统调用对应的驱动程序。 后面调用驱动的这个过程可以称之为下半部分。

二、按键原理图

三、驱动代码

中断申请函数
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev)
有下面几个参数。
参数 unsigned int irq: irq 是中断号
参数 irq_handler_t handler: handler 是向系统登记的处理函数
参数 unsigned long flags: irqflags 是触发标志位(

/IRQ_TYPE_EDGE_RISING(上升沿)

/IRQ_TYPE_EDGE_BOTH(上升、下降沿)

/IRQ_TYPE_LEVEL_HIGH(高电平)

/ IRQ_TYPE_LEVEL_LOW(低电平)

/IRQ_TYPE_SIMPLE(Simple中断)

/IRQ_TYPE_PERCPU(Per CPU中断):

参数 const char *name: devname 是中断名称, 可以通过注册之后可以通过“cat /proc/interrupts”查看
参数 void *dev: dev_id 是设备
和上面中断申请函数对应的就是中断释放函数 free_irq, 卸载驱动的时候需要调用, 如下图所示, 也是在头文件“include/linux/interrupt.h”中。

#include <linux/init.h>
#include <linux/module.h>#include <linux/kernel.h>
#include <linux/fs.h>
#include <mach/gpio.h>
#include <plat/gpio-cfg.h>
#include <linux/miscdevice.h>
#include <linux/platform_device.h>
//#include <mach/gpio-bank.h>
#include <mach/regs-gpio.h>
#include <asm/io.h>
#include <linux/regulator/consumer.h>
//#include "gps.h"
#include <linux/delay.h>//中断头文件
#include <linux/irq.h>
#include <linux/interrupt.h>#define DPRINTK(x...) printk("keyirq DEBUG:" x)#define DRIVER_NAME "keyirq"static irqreturn_t eint9_interrupt(int irq,void *dev_id)
{printk("receive a interrupt 9!\n");return IRQ_HANDLED;
}static irqreturn_t eint10_interrupt(int irq,void *dev_id)
{printk("receive a interrupt 10!\n");return IRQ_HANDLED;
}static int keyirq_probe(struct platform_device *pdev)
{//int ret, i;char *banner = "keyirq Initialize\n";printk(banner);//注册中断request_irq(IRQ_EINT(9),eint9_interrupt,IRQ_TYPE_EDGE_FALLING,"my_eint9",pdev);request_irq(IRQ_EINT(10),eint10_interrupt,IRQ_TYPE_EDGE_FALLING,"my_eint10",pdev);return 0;
}static int keyirq_remove (struct platform_device *pdev)
{free_irq(IRQ_EINT(9),pdev);free_irq(IRQ_EINT(10),pdev);return 0;
}static int keyirq_suspend (struct platform_device *pdev, pm_message_t state)
{DPRINTK("keyirq suspend:power off!\n");return 0;
}static int keyirq_resume (struct platform_device *pdev)
{DPRINTK("keyirq resume:power on!\n");return 0;
}static struct platform_driver keyirq_driver = {.probe = keyirq_probe,.remove = keyirq_remove,.suspend = keyirq_suspend,.resume = keyirq_resume,.driver = {.name = DRIVER_NAME,.owner = THIS_MODULE,},
};static void __exit keyirq_exit(void)
{platform_driver_unregister(&keyirq_driver);
}static int __init keyirq_init(void)
{return platform_driver_register(&keyirq_driver);
}module_init(keyirq_init);
module_exit(keyirq_exit);
MODULE_LICENSE("Dual BSD/GPL");

四、添加设备

vim arch/arm/mach-exynos/mach-itop4412.c

五、运行

cat /proc/interrupts (查看中断)

十八、中断之独立按键相关推荐

  1. 四、51单片机控制独立按键

    1.按键简介 按键相关知识. 1.1.按键工作原理 (1)按键内部是机械结构,也就是内部是没有电路的.按键对外表现位四个引脚,但本质上只是两个,引脚是两两连在一起的.按键按下内部引脚导通,松开内部断开 ...

  2. 蓝桥杯51单片机之利用中断同时控制流水灯、数码管、独立按键、蜂鸣器【单片机开发初学者有趣综合案例】

    文章目录 一.流水灯与数码管 二.独立按键.数码管.流水灯.蜂鸣器 一.流水灯与数码管 流水灯不断左移,通过外部中断0来控制数码管的显示. #include <reg52.h> #defi ...

  3. 51单片机(二十五)—— 独立按键控制LED

    在51单片机的前面的文章中,我们主要讲述了单片机IO口的输出功能的应用,如LED控制.数码管控制等.这篇文章我们来讲解如何用单片机的IO口读取按键的状态,并根据按键的状态来控制LED.关于51单片机按 ...

  4. 蓝桥杯单片机之独立按键+外部中断

    独立按键原理 一般情况下,独立按键有两个引脚,其中一个通过上拉电阻接到单片机的I/O端口,另外一端接地.也就是说,平时按键没有动作的时候,输出的是高电平,如果有按下动作发生,则输出的是低电平.那么,我 ...

  5. 【OS学习笔记】三十八 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----微型内核汇代码

    本文是以下几篇文章对应的微型内核代码汇编代码: [OS学习笔记]三十四 保护模式十:中断和异常区别 [OS学习笔记]三十五 保护模式十:中断描述符表.中断门和陷阱门 [OS学习笔记]三十六 保护模式十 ...

  6. S5P4418裸机开发(十二):IRQ (按键中断) 串口中断

    S5P4418 64个中断源,按键的GPIO口是GPIOB28-30,中断号为54: Interrupt Controller相关寄存器 寄存器 功能 VICIRQSTATUS R,相关位为1表示该I ...

  7. 第十六讲:完美主义身心健康 第十七讲:身心健康:运动与冥想 第十八讲:睡眠,触摸和爱情的重要性

    (注:此为课程第十六课,更新于2017年6月29日) 早上好! 我们今天要把完美主义讲完,然后开始讲精神肉体(Mind and Body).这个学期对我来说挺不错的,基本上没有什么东西让我后悔做过.不 ...

  8. AutoLeaders控制组—51单片机学习笔记(LED控制、独立按键、数码管)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 根据测试,目 ...

  9. 读书笔记:汇编语言 第三版 王爽 清华出版社 章十六 章十七 章十八

    第十六章 直接定址表16.1 描述了单位长度的标号地址标号,表征了位置的偏移地址label:数据标号,表征了一段内存空间的物理地址和长度,增强型地址标号段地址,数据标号所在段的关联段寄存器,assum ...

最新文章

  1. php 的opcode缓存apc以及其安装
  2. Extjs 基础篇—— Function基础
  3. 在 Linux“.NET研究” 操作系统中运行 ASP.NET 4 (下)
  4. InfoPath发布要点
  5. OPENCV学习笔记2-5_扫描图像并访问相邻像素
  6. kafka消费者接收分区测试
  7. mysql event 变量_mysql 中event的用法
  8. sqoop job入门 与sqoop增量导入
  9. webpack配置路径问题 1
  10. PLSQL下载及安装
  11. SPSS学习资料汇总
  12. CUBA平台使用感想 - 架构师角度
  13. PHP微信公众号开发之:获得和缓存access_token,原理及代码
  14. 坐标转换源代码,C++/C, 极为精确地大地坐标系转地心坐标系,地心坐标系转站心坐标系
  15. 10019---记录一次壮烈牺牲的阿里巴巴面试
  16. tplinkwr710n改无线打印服务器,TP-Link TL-WR710N V1无线路由器AP模式设置
  17. UltraEdit+Masm--打造自己的汇编IDE
  18. Unity3d游戏中实现阿拉伯语文字正常显示
  19. 用Python从零复现A星寻路算法 | 手撕代码#1
  20. chrome点击书签栏书签_如何充分利用Chrome书签栏

热门文章

  1. Split字符串分割函数
  2. CentOS系统安装桌面
  3. LED适用范围及寿命
  4. Simple Introduction to Dirichlet Process
  5. 电动力学每日一题 2021/10/10
  6. UA MATH523A 实分析3 积分理论例题 集合的特征函数L2收敛的条件
  7. ArcGIS 桌面版安装和ArcMap添加mdb库表基本操作
  8. 常用的正则表达式总结
  9. pthread调度策略,优先级和竞争范围
  10. FreeRTOS知识点