Linux的中断服务程序

原创 2015年07月16日 16:11:32

1.几个重要的数据结构:

///////////////////////////////////////////////
1.struct irq_desc; 表示一个中断号

31struct irq_desc;
32typedef void (*irq_flow_handler_t)(unsigned int irq,
33                             struct irq_desc *desc);

175struct irq_desc {
176        unsigned int            irq; //中断号
177        struct timer_rand_state *timer_rand_state;
178        unsigned int            *kstat_irqs;
179#ifdef CONFIG_INTR_REMAP
180        struct irq_2_iommu      *irq_2_iommu;
181#endif
182        irq_flow_handler_t      handle_irq; //该中断号对应的公共处理程序
183        struct irq_chip         *chip; //中断控制器
184        struct msi_desc         *msi_desc;
185        void                    *handler_data; //handle_irq公共处理程序的参数
186        void                    *chip_data; 
187        struct irqaction        *action; //该中断线上已经注册的中断处理程序链表
188        unsigned int            status; //中断线此时的状态
189
190        unsigned int            depth;
191        unsigned int            wake_depth;
192        unsigned int            irq_count;
193        unsigned long           last_unhandled;
194        unsigned int            irqs_unhandled;
195        raw_spinlock_t          lock;
196#ifdef CONFIG_SMP
197        cpumask_var_t           affinity;
198        const struct cpumask    *affinity_hint;
199        unsigned int            node;
200#ifdef CONFIG_GENERIC_PENDING_IRQ
201        cpumask_var_t           pending_mask;
202#endif
203#endif
204        atomic_t                threads_active;
205        wait_queue_head_t       wait_for_threads;
206#ifdef CONFIG_PROC_FS
207        struct proc_dir_entry   *dir;
208#endif
209        const char              *name; //中断线的名字
210}

<全部中断号组成一个中断号数组>
216#ifndef CONFIG_SPARSE_IRQ
217extern struct irq_desc irq_desc[NR_IRQS];
218#endif

///////////////////////////////////////////
2.struct irqaction; 表示一个中断处理程序

98typedef irqreturn_t (*irq_handler_t)(int, void *);

113struct irqaction {
114        irq_handler_t handler; //中断处理程序
115        unsigned long flags;   //中断发生时的一些标志
116        const char *name; //中断程序名字
117        void *dev_id;  //设备标志
118        struct irqaction *next; //该中断线上的下一个中断处理程序
119        int irq;  //中断号
120        struct proc_dir_entry *dir;
121        irq_handler_t thread_fn;
122        struct task_struct *thread;
123        unsigned long thread_flags;
124};

///////////////////////////////////////
3.struct irq_chip; 表示一个中断控制器

111struct irq_chip {
112        const char      *name; //中断控制器的名字
113        unsigned int    (*startup)(unsigned int irq); //启动某条中断线
114        void            (*shutdown)(unsigned int irq); //关闭某条中断线
115        void            (*enable)(unsigned int irq); //允许某条中断线中断
116        void            (*disable)(unsigned int irq); //禁止某条中断线中断
117
118        void            (*ack)(unsigned int irq);
119        void            (*mask)(unsigned int irq);
120        void            (*mask_ack)(unsigned int irq);
121        void            (*unmask)(unsigned int irq);
122        void            (*eoi)(unsigned int irq);
123
124        void            (*end)(unsigned int irq);
125        int             (*set_affinity)(unsigned int irq,
126                                        const struct cpumask *dest);
127        int             (*retrigger)(unsigned int irq);
128        int             (*set_type)(unsigned int irq, unsigned int flow_type);
129        int             (*set_wake)(unsigned int irq, unsigned int on);
130
131        void            (*bus_lock)(unsigned int irq);
132        void            (*bus_sync_unlock)(unsigned int irq);
133
134        /* Currently used only by UML, might disappear one day.*/
135#ifdef CONFIG_IRQ_RELEASE_METHOD
136        void            (*release)(unsigned int irq, void *dev_id);
137#endif
138        /*
139         * For compatibility, ->typename is copied into ->name.
140         * Will disappear.
141         */
142        const char      *typename;
143};

2.上述三个结构的关系:

这里写图片描述

3.中断发生时的执行过程:

这里写图片描述

1.键盘产生一个中断,通过中断线把信号(中断号)发给中断控制器

2.中断控制器把该中断号发给处理器,处理器停止当前工作

3.处理器调用common_interrup这个公共的中断处理程序,保存当前执行进程的环境,大概就是一些寄存器值,都保存到该进程的堆栈中

4.处理器调用do_IRQ()函数,该函数会调用struct irq_desc结构中的属于该中断线的公共处理程序,即 handle_irq字段指向的函数

5.handle_irq指向的函数最终会调用上述图片中所示的hand_IRQ_event函数,该函数会依次调用属于该中断线上的处理程序,即依次调用struct irq_desc结构中的action字段指向的属于该中断线上的中断处理程序链表上的处理程序
6.中断处理程序执行完后,调用上述图片中的ret_from_intr()函数,该函数返回到中断之前的现场环境

本文引述自 http://edsionte.com/techblog/archives/1618

linux下的自写shell与中断程序

  • 2011年07月17日 17:33
  • 79KB
  • 下载

Linux中断处理驱动程序编写

Linux中断处理驱动程序编写 中断与定时器: 中断的概念:指CPU在执行过程中,出现某些突发事件急待处理,CPU暂停执行当前程序,转去处理突发事件,处理完后CPU又返回原程序被中断的位...
  • jwc2436
  • jwc2436
  • 2014年12月23日 21:54
  • 1086

linux在ARM平台上的中断流程

当发生中断时,系统跳转到ARM平台的异常向量表(vector_irq位置): .section .vectors, "ax", %progbits __vectors_start: W(...
  • u011955950
  • u011955950
  • 2015年05月10日 10:58
  • 790

第五章 中断和中断服务程序

第五章  中断和中断服务程序 一,处理器与外围设备进行通信有两种方式:     1,轮询(效率低下)     2,中断 二,中断原理     当我们在敲击键盘的时候,键盘控制器会发送一个...
  • laohuang1122
  • laohuang1122
  • 2012年12月26日 14:07
  • 5827

中断服务程序的编写

...
  • duckzyf7758
  • duckzyf7758
  • 2007年09月10日 10:51
  • 1386

Linux-中断和中断处理

1.中断 #中断使得硬件得以发出通知给处理器,本质上是一种电信号 #中断随时可以产生,内核随时会被打断 #不同设备的中断不同,每个中断都通过一个唯一的数字标识,称为IRQ(中断请求)...
  • luoyhang003
  • luoyhang003
  • 2015年06月26日 08:18
  • 988

linux中断--内核中断编程

Linux中断内核编程 前言 在前面分析了中断的基本原理后,就可以写一个内核中断程序来体验以下,也可以借此程序继续深入来了解内核中断的执行过程 一.内核中断程序: 我们还是来看一看成程序: 在看程序之...
  • yusiguyuan
  • yusiguyuan
  • 2014年04月14日 19:24
  • 2353

[应聘笔记系列]中断处理过程和中断服务程序ISR的限制

     在程序员面试和笔试中中断是一个经常被问及的很基础的问题,本文对这次问题做一点简单说明。     中断处理过程:一次完整的中断过程由中断请求、中断响应和中断处理三个阶段组成。     中断处理...
  • cskywit
  • cskywit
  • 2011年05月26日 15:49
  • 2528

linux内核中断分析

知识要点 一、struct irq_chip、struct irq_desc[]、struct irqaction三者之间的关系 二、Linux内核中中断的初始化流程、中断的注册流程、中断的执行流程 ...
  • fridayLL
  • fridayLL
  • 2016年07月07日 21:31
  • 747

linux下avr单片机开发:中断服务程序

不管是什么单片机程序,中断总是非常重要的一部分 ,linux 下的avr开发,主要是依靠avr-gcc,以及avr-libc,它们对中断程序的格式要求,与window下的icc-avr以及win-av...
  • canyue102
  • canyue102
  • 2013年10月08日 19:24
  • 1849
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux的中断服务程序
举报原因:
原因补充:

(最多只允许输入30个字)