cat /proc/interrupts

发布时间:2024年01月22日

cat /proc/interrupts?

读取到的内容从左到右,分别为:1、逻辑中断号,2、中断在各CPU发生的次数,3、中断所属设备类名称,4、硬件中断号,5、中断处理函数。

如下图:

/proc/interrupts的具体实现查看代码kernel/irq/proc.c中函数show_interrupts
在这里插入图片描述?添加一个中断函数后/proc/interrupts的变化:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/kthread.h>
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/regmap.h>
#include <linux/device.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>
#include <linux/gpio/driver.h>
#include <linux/gpio/consumer.h>

int gpio_index;

static irqreturn_t handler_gpio(int irq, void *arg)
{
        printk("%s\n", __func__);

        return IRQ_HANDLED;
}

static int __init gpio_test_int_init(void)
{
        int irq;
        int ret;

        /* gpio 504 correspond to P0_4/EXP_IO2 of PCA6416 */
        gpio_index = 504;
        if(gpio_is_valid(gpio_index)) {
                ret = gpio_request_one(gpio_index, GPIOF_DIR_IN, "tca6416");
                if (ret) {
                        printk("gpio_request for %d fail\n", gpio_index);
                        return -EIO;
                }

                irq = gpio_to_irq(gpio_index);
                printk("irq is %d\n", irq);

                ret = request_any_context_irq(irq, handler_gpio,
                        IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING | IRQF_SHARED,
                        "gpio_x", &gpio_index);
                if (ret < 0) {
                        printk("request_irq for %d fail, ret=%d\n", irq, ret);
                        goto err;
                }
        } else {
                printk("gpio %d is not valid, do nothing\n", gpio_index);
        }

        printk("%s ok\n", __func__);
        return 0;

err:
        gpio_free(gpio_index);
        return -1;
}

static void __exit gpio_test_int_exit(void)
{
        int irq = gpio_to_irq(gpio_index);

        free_irq(irq, &gpio_index);
        gpio_free(gpio_index);

        printk("%s\n", __func__);
}
module_init(gpio_test_int_init);
module_exit(gpio_test_int_exit);
MODULE_AUTHOR("Frank Wang <lei.wang_15@nxp.com>");
MODULE_DESCRIPTION("pca6416 gpio test driver");
MODULE_LICENSE("GPL v2");

?硬中断和软中断

软中断

编程异常一般叫做软中断;

软中断是通信进程之间用来模拟硬中断的一种信号通信方式;

中断源发中断请求或软中断信号后,CPU或接收进程在适当的时机自动进行中断处理或完成软中断信号对应的功能

软中断是软件实现的中断,也就是程序运行时其余程序对它的中断;而硬中断是硬件实现的中断,是程序运行时设备对它的中断。操作系统软中断,也叫同步中断。软中断是由CPU执行中断产生指令时产生,是由程序预先实现好的,不是随机的。
硬中断,也叫异步中断。硬中断是由硬件设备依照CPU时钟信号产生的,即意味着中断发生具备随机性和突发性,可以在指令正在执行时发生。例如键盘中断。硬中断是由硬件产生的,好比,像磁盘,网卡,键盘,时钟等

进程由与系统相连的外设(好比网卡、硬盘)自动产生的。主要是用来通知操做系统系统外设状态的变化。好比当网卡收到数据包的时候,就会发出一个中断。咱们一般所说的中断指的是硬中断(hardirq)。

由与系统相连的外设(好比网卡、硬盘)自动产生的。主要是用来通知操做系统系统外设状态的变化。好比当网卡收到数据包的时候,就会发出一个中断。咱们一般所说的中断指的是硬中断(hardirq)。

【干货满满】软中断与硬中断的区别! - 知乎

文章来源:https://blog.csdn.net/l00102795/article/details/135741573
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。