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

相关文章推荐

欢迎使用CSDN-markdown编辑器

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...

Linux的CFS(完全公平调度)算法

1.几个重要的概念: 每个进程都有一个nice值, 表示其静态优先级, nice值和进程的权重存在如下关系: static const int prio_to_weight[40] = { ...

为什么在Linux中断服务程序中不能睡眠

最近本人在实现TILE CPU架构上的中断子系统,抽出一点时间来仔细研究了下Linux上的中断设计。对内核有所了解的人都知道,在Linux中断ISR中不能睡眠,但是为什么不能睡眠呢? 其中一个比较流...

linux下的epoll服务程序实例

  • 2014年12月18日 10:55
  • 3KB
  • 下载

linux 下的串口服务程序。

  • 2009年08月12日 16:14
  • 30KB
  • 下载

linux下使用socket运行的服务程序

//获得本机IP地址 char* GetLocalAddr() { char szName[255]; char* addrIP; struct in_addr ad...

STM32红外解码中断服务程序

  • 2013年12月16日 23:07
  • 1KB
  • 下载

linux 设置开机启动服务程序

我最近在搭建一个网站,     我是在阿里云上租了一个小型低配的主机(真的很低配,1G内存,单核,1M带宽)没钱租得起好的服务器就这样-_-     因为我要提供网页访问服务,还有文件上传功能,所...

nRF401无线收发串口中断服务程序

  • 2011年08月31日 23:10
  • 268KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux的中断服务程序
举报原因:
原因补充:

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