中断概念
中断(Interrupt)是计算机硬件和操作系统中的一个重要概念,它能够使CPU在执行任务时暂停当前的运行,切换上下文从而响应硬件事件,处理输入输出数据或者承担其它任务,随后重新回到原来的上下文继续执行。这种机制使得计算机能够响应外部事件,并根据特定情况实时做出相应处理,是操作系统和应用程序正常运行的基础。
举一个实际的例子,比如当你在电脑上运行程序时,CPU在执行程序的指令,但是你突然按下了一个键盘上的按键,这时就会触发键盘对的中断信号,使得CPU暂停执行程序,切换上下文,去处理按键的输入信号,并通知对应的程序按键的具体信息,然后CPU会重新回到原来的上下文,结合应用程序运行状态继续执行指令。这个过程就是一个典型的中断流程,通过中断机制,计算机能够响应丰富多样的事件,从而控制设备的输入/输出、自动化控制、数据处理和通信等等。
简单说明一下,中断就是让计算机在做事情时候,停下来做其他事情,就叫中断。
查看中断情况
输入指令:cat /proc/interrupts
gpio中断
GPIO中断(GPIO Interrupt)是指在嵌入式系统中,通过将硬件中断与GPIO(通用输入/输出)引脚连接起来,使得在GPIO引脚发生电平变化时,能够触发相应的中断处理。这种机制使得系统能够对GPIO引脚的状态变化做出实时响应,从而实现对硬件设备的控制和数据采集等功能。
例如,在树莓派(Raspberry Pi)中,可以使用GPIO引脚来连接外部设备,如按键、传感器、显示屏等等。通过配置GPIO引脚为输入模式,并将其与中断连接,可以实现对外部设备的状态进行实时监测,一旦设备状态发生变化,就能够触发中断,通知系统进行相应处理。例如,当按键被按下时,GPIO引脚的电平会发生变化,从而触发中断,系统就可以在中断处理函数中执行相应的操作,如启动计时器、记录事件等等。
gpio中断的四种模式
在硬件中断处理中,不同的触发方式描述了外部信号引起中断的具体时机和条件。下面是四种常见的触发方式的区别:
- 上升沿触发(IRQF_TRIGGER_RISING):当外部信号从低电平(0)变为高电平(1)时触发中断。适用于需要在信号从低电平变为高电平时进行处理的情况。
- 下降沿触发(IRQF_TRIGGER_FALLING):当外部信号从高电平(1)变为低电平(0)时触发中断。适用于需要在信号从高电平变为低电平时进行处理的情况。
- 高电平触发(IRQF_TRIGGER_HIGH):当外部信号保持在高电平时触发中断。适用于需要当信号保持在高电平时进行处理的情况。
- 低电平触发(IRQF_TRIGGER_LOW):当外部信号保持在低电平时触发中断。适用于需要当信号保持在低电平时进行处理的情况。
根据实际情况和外部信号变化的时机,可以选择适合的触发方式来实现对中断的响应和处理。
设备树
&pio {
key_pins: key-pins{
pins = "PE3";
function = "gpio_in";
};
};
/ {
my_key: my-key{
status = "okay";
compatible = "allwinner,sunxi-pinctrl-key";
pinctrl-names = "default";
pinctrl-0 = <&key_pins>;
key-gpios = <&pio 4 3 GPIO_ACTIVE_HIGH>;
};
};
驱动实现gpio中断
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <asm/mach/map.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/