zoukankan      html  css  js  c++  java
  • [国嵌攻略][119][Linux中断处理程序设计]

    裸机中断:

    1.中断统一入口。

    2.注册中断处理程序。

    3.根据中断源编号,调用中断处理程序。

    Linux中断

    1.在entry-armv.S中的_irq_svc是中断统一入口。

    2.获取产生中断源的编号(中断号)。

    3.根据中断号,找到irq_desc结构

    4.从irq_desc描述结构中取出事先注册好的函数来运行。

    驱动程序需要做什么

    1.实现中断处理程序

    2.注册中断处理程序

    Linux中断处理程序设计

    1.中断注册

    request_irp函数用于注册中断。

    int request_irq(unsigned int irq,

    void (*handler)(int, void *, struct pt_regs *),

    unsigned long flags,

    const char *devname,

    void *dev_id

    )

    返回0表示成功,或者返回一个错误码。

    参数说明:

    1.1.unsigned int irq

    中断号

    1.2.void (*handler)(int, void *, struct pt_regs *)

    中断处理函数

    1.3.unsigned long flags

    与中断管理有关的各种选项

    在flags参数中,可以选择一些与中断管理有关的选项,例如:

    IRQF_DISABLED(SA_INTERRUPT)

    如果设置该位,表示是一个“快速”中断处理程序;如果没有设置该位,那么是一个“慢速”中断处理程序。

    快/慢速中断的主要区别在于:快速中断保证中断处理的原子性(不被打断),而慢速中断则不保证。换句话说,也就是”开启中断”标志位(处理器IF)在运行快速中断处理程序时是关闭的,因此在服务该中断时,不会被其他类型的中断打断;而调用慢速中断处理时,其他类型的中断仍可以得到服务。

    IRQF_SHARED(SA_SHIRQ)

    该位表明该中断号是多个设备共享的。

    在irq_desc结构中相同中断号的处理函数形成一个链表,但响应中断时,该链表上的中断函数都会被调用一遍。所以在编写中断处理程序时,首先检查设备是否产生中断,如果产生了中断,那么处理;如果没有,那么退出。

    IRQF_TRIGGER_FALLING

    下降沿产生中断

    1.4.const char *devname

    设备名

    1.5.void *dev_id

    共享中断时使用。

    2.中断处理程序

    中断处理程序的特别之处是在中断上下文中运行的,它的行为受到某些限制:

    2.1.不能使用可能引起阻塞的函数

    2.2.不能使用可能引起调度的函数

    3.中断处理流程:

    3.1.检测设备是否产生了中断

    3.2.清除中断产生标志

    3.3.相应的硬件操作

    4.注销中断

    当设备不再需要使用中断时(通常在驱动卸载时),应当把它们注销,使用函数:

    void free_irq(unsigned int irq, void *dev_id)

  • 相关阅读:
    python 爬虫 urllib模块 url编码处理
    python 爬虫 urllib模块 目录
    python 爬虫 urllib模块介绍
    python 爬虫 目录
    爬虫 介绍
    POJ 2533
    POJ 2531
    POJ 2524
    POJ 2505
    POJ 2521
  • 原文地址:https://www.cnblogs.com/d442130165/p/5254752.html
Copyright © 2011-2022 走看看