zoukankan      html  css  js  c++  java
  • 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和工作队列,待补充

  • 相关阅读:
    32位二进制IP地址与十进制IP地址互相转换
    在安装AndroidStudio时产生的问题
    Java 数列求和
    Java throws Exception、try、catch
    Java 语句循环
    Oracle OEM
    数据泵Expdp和Impdp
    java查询高斯数据库表某个字段值
    安全测试笔记(未更新完)
    工作笔记
  • 原文地址:https://www.cnblogs.com/justin-y-lin/p/10694505.html
Copyright © 2011-2022 走看看