• Linux驱动开发8——中断处理


    中断包括软中断和硬中断两种,中断是一种异步I/O机制,即中断可以发生在任意时间点。

    1、硬中断

    硬件中断包括触发中断和处理中断两部分,而维系两者的是中断号,中断号是一种硬件资源。

    1.1、注册和释放中断

    #include <linux/interrupt.h>
    
    注册中断处理函数,将中断号与中断处理函数绑定在一起,成功返回0,失败返回负错误码
    int request_irq(
        unsigned int irq,
        irqreturn_t (*handler)(int irq, void *dev_id, struct pt_regs *regs),
        unsigned long flags,
        const char *dev_name,
        void *dev_id
    );
    参数说明:
    irq - 中断号
    handler - 中断服务函数
    flags - SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM
    dev_name - 设备驱动名称,在/proc/interrupts中可以显示设备驱动和中断号的对应关系
    dev_id - 用作共享中断号的指针,如果中断号没有被共享,置为NULL 释放中断号
    void free_irq(unsigned int irq, void *dev_id);

     1.2、使能和禁止中断

    #include <asm/irq.h>
    
    使能中断
    void enable_irq(int irq);
    
    等待当前执行的中断处理完成,然后禁止中断
    void disable_irq(int irq);
    
    不等待当前执行的中断处理完成,立即禁止中断
    void disable_irq_nosync(int irq);
    
    调用任一函数可能更新在PIC中特定IRQ的掩码,从而使能或者禁止特定中断。
    
    
    #include <asm/system.h>
    
    禁止所有中断,并保存中断状态
    void local_irq_save(unsigned long flags);
    
    禁止所有中断,不保存中断状态
    void local_irq_disable(void);
    
    恢复所有中断,并恢复中断状态
    void local_irq_restore(unsigned long flags);
    
    恢复所有中断
    void local_irq_enable(void);

     1.3、中断顶半部和底半部

    tasklet和工作队列,待补充

  • 相关阅读:
    MySQL在大数据Limit使用
    debian非正常关机进不了图形界面的解决方法
    debian 系统备份
    数据库对内存的存储与读取
    QT: QByteArray储存二进制数据(包括结构体,自定义QT对象)
    Mysql数据库备份和按条件导出表数据
    QTableWidget控件总结
    Mysql数据库导入命令Source详解
    Mysql数据库导出压缩并保存到指定位置备份脚本
    Mysql导出表结构及表数据 mysqldump用法
  • 原文地址:https://www.cnblogs.com/justin-y-lin/p/10694505.html
Copyright © 2020-2023  润新知