中断处理的总结

1 中断处理程序
        响应特定函数内核执行的函数,称为中断处理程序;
        注册中断处理程序                   int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev);

2 共享的中断处理程序必须符合的要求
        a). request_irq();函数的flag参数设置为SA_SHIRQ;
        b). 对每个中断处理程序来说每个dev必须是唯一的,不能给共享的中断处理程序设置为NULL;
        c). 中断处理程序要能判断是否真正产生中断;

3 中断上下文:
    上半部 :实际响应中断的例程,也是用request_irq函数注册的处理例程;
    下半部 :被上半部调度的处理函数,也是在稍后更安全的时间内执行的例程; 

4中断下半部:
     软中断       是在编译期间静态分配的,主要用于执行频率高连续性高的情况下;软中断处理程序执行的时候,允许响应中断, 但它自己不能休 眠;引入软中断的主要原因是其可扩展性,如果不需要扩展到多个处理器,那么,就使用tasklet吧, tasklet本质上也是软中断,只 不过同一处理程序的多个实例不能在多个处理器上同时运行;
     
    tasklet       tasklet的本质是软中断,大多情况下使用tasklet效果不错,而且很容易使用。它有2类软中断代表HI_SOFTORQ和TASKLET_SOFTIRQ ,这两者的主要区别是HI_SOFTORQ软中断先于TASKLET_SOFTIRQ软中断执行;它既可以 静态的注册也可以 动态的注册,由于它是靠软中断实现的,所以tasklet不能睡眠,这就意味着你不能在tasklet中 使用信号量或者其他的阻塞式的函 数,如果你的tasklet和其他的tasklet或者软中断共享了数据, 你必须要进行适当的锁保护;
     
    工作队列     它是另外一种将工作推后执行的形式,它把工作推后给内核线程去执行,它允许重新调度甚至是睡眠; 它是唯一能够在进程上下文 运行睡眠的下半部实现机制;
     定时器

5 同步机制
    
    原子操作    不可分割的指令;有原子整数操作和原子位操作之分;
     
    自旋锁        只能被一个线程持有的锁机制,如果该所被其他线程持有,本进程将会进入死循环等待所持有线程的释放,
如果没有被其他线程持 有,则本线程会继续执行下去;自旋锁是为了防止多个执行线程同时进入临界区;
     
    信号量        它是一种睡眠锁,如果 有一个任务试图获得一个已经被占有的信号量时,信号量会将其推进一个等待队列,
然后让其睡眠,这时处 理器能重获自由,从而去执行其他的代码。当持有信号量的进程将信号量 释放后, 处于等待队列中的那个任务将被唤醒,并获得该 信号量。
                
                     从信号量的睡眠中我们得出一些结论:
                            1.由于争用信号量的进程在等待锁重新变为可用时会睡眠,所以信号量适用于锁会长时间持有的情况;
                            2.锁被短时间持有时,使用信号量就不太适宜了,因为睡眠、维护等待队列以及唤醒所花费的开销可能比锁 被占用的全部时间还要长;
                            3.由于执行线程在锁被争用时会睡眠,所以只能在进程上下文 中才能获取信号量,因为在中断上下文 是不能被调度的;
                            4.你可以持有信号量去睡眠(也可以不睡眠), 因为当其他的进程试图获得同一信号量时不会因此而死锁( 因为该线程也只是去睡眠而 已,而你最终会继续执行);       
                            5.在你占用信号量时不能同时占用自旋锁,因为在你等待信号时可能会睡眠,而持有自旋锁时是不允许睡眠的;                
         
    完成量        如果一个任务要执行一些工作时,另一个任务就会在完成变量上等待,当任务完成工作后,会使用完成变量去呼唤 在等待的任务。
                           完成变量的方法:
                            1.init_completion(struct completion *)                        初始化指定的动态创建的完成变量
                            2.wait_for_completion(structcompletion *)                     等待指定的完成变量接受信号
                            3.completion(struct completion *)                             发信号唤醒任何等待的任务       

6 定时器          定时器用于调度函数(定时器处理程序)在未来某个特定时间执行。与任务队列不同,你可以指定你的函数在未来 何时被调用, 但你不能确 定任务队列中的任务何时执行。
                       
                        Linux使用了两种定时器,所谓的“旧定时器”和新定时器:
                        1.旧定时器包括32个静态的定时器。旧定时器的数据结构包括一个标明活动的定时器的位屏蔽码和定时器数组, 数组的每个成员又包括一 个处理程序和该定时器的超时值。 旧的定时器结构的主要问题在于, 每个需要定时器 来延迟操作的设备都要 静态地分配给一个定时器
                        2.新的定时器被组织成双向链接表。这意味着你加入任意多的定时器。定时器包括它的timeout(超时)(单位是jiffies) 和超时时调用的函 数。定时器处理程序需要一个参数,该参数和处理程序函数指针本身一起存放在一个数据结构中。

7.相关接口函数

#include <linux/param.h>

HZ                                              HZ符号指出每秒钟产生的时钟滴答数。

 

volatile unsigned long jiffies                  jiffies变量每个时钟滴答后加1;因此它每秒增加1HZ

 

#include <linux/time.h>

void do_gettimeofday(struct timeval *tv);       该函数返回当前时间。1.2版的内核并不提供。

 

#include <linux/delay.h>

void udelay(unsigned long usecs);               udelay函数延迟整数数目的微秒数,但不应超过1毫秒。

 

#include <linux/tqueue.h>

void queue_task(struct tq_struct *task, task_queue *list);

void queue_task_irq();

void queue_task_irq_off();

这些函数注册延迟执行的任务。第一个函数,queue_task,总是可以被调用;第二个函数只能在不可重入的函数内被调用,而最后一个函数只有在关闭中断后才能被调用。新近的内核只提供第一种函数接口了

 

void run_task_queue(task_queue *list);           该函数运行任务队列。

 

task_queue tq_immediate, tq_timer, tq_scheduler; 这些预定义的任务队列在每个时钟滴答后并在内核调度新的进程前尽快地分别得到执行。

 

#include <linux/timer.h>

void init_timer(struct timer_list *timer);       该函数初始化新分配的定时器队列。

 

void add_timer(struct timer_list * timer);       该函数将定时器插入待处理的定时器的全局队列。

 

int del_timer(struct timer_list *timer);

del_timer函数将定时器从挂起的定时器队列中删除。如果队列中有该定时器,del_timer返回1,否则返回0

                                        
中断机制:硬件设备在产生事件的时候向内核发送信号(变内核主动为硬件主动)的机制;
#include <linux/interrupt.h>
int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id)
 irq:              中断号 arch/arm/plat-s3c64xx/include/plat/irqs.h
 handler:          中断处理函数指针 irqreturn_t handler(int irq, void *dev_id);
 irqreturn_t:      See include/linux/irqreturn.h
 irqflags:         See line 21-59 in include/linux/interrupt.h        使用IRQF_SHARED共享irq时, irqflags必须相同 

#include <asm/signal.h>       =============== request_irq函数的标志
          SA_INTERRUPT:要求安装一个快速的处理例程;
          SA_SHIRQ:安装一个共享的处理例程;
          SA_SAMPLE_RANDOM:中断时间戳可用来生产系统熵;
  
如:   request_irq(IRQ_EINT(0), handler1, IRQF_TRIGGER_FALLING | IRQF_SHARED, "dev1", &dev1);
         request_irq(IRQ_EINT(0), handler2, IRQF_TRIGGER_FALLING | IRQF_SHARED, "dev2", &dev2);
         devname:         设备名,   cat /proc/interrupts
         dev_id:              发生中断时将dev_id传递给handler函数, irqflags含有IRQF_SHARED时dev_id不能为NULL, 并且要保证唯一 dev_id 一般采用当前设备的结构体指针
注:
        不能在中断上下文和不允许阻塞的代码中调用request_irq()函数;kmalloc()函数是会休眠的函数。

void free_irq ( unsigned int irq, void * dev_id); 释放匹配irq和dev_id的中断, 如果irq有多个相同的dev_id, 将释放第一个 So, 共享中断的dev_id不是唯一时, 可能会释放到其它设备的中断 

启用可禁止单个指定的中断
void disable_irq(unsigned int irq);                     关闭指定irq号中断  (当前所有正在处理程序退出后才能返回)
void enable_irq(unsigned int irq);                      开启指定irq号中断  使用共享处理例程的驱动不能使用这两个函数;

无条件启动和禁止当前CPU的中断
void local_irq_disable(void);                               无条件关闭当前CPU中断
void local_irq_enable(void);                                无条件开启当前CPU中断

无条件启动和禁止当前CPU的中断,但是保存和恢复当前状态flag
void local_irq_save(unsigned long flags);         关闭当前CPU中断并保存当前状态到flags
void local_irq_restore(unsigned long flags);      传递flags保存的先前中断状态到当前CPU

in_interrupt();         如果在中断上下文中,则返回非0;如果在进程上下文中,则返回0;
in_irq();               如果当前正在执行的中断处理程序,则返回非0,否则返回0;
注: 没有关闭和开启所有CPU中断的函数(没必要);   















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《基于Xilinx FPGA的中断处理》是一本介绍基于Xilinx FPGA的中断处理的PDF文档。中断是一种硬件机制,用于实现多任务并发处理,通过中断处理,系统能够及时响应设备的请求,并及时处理,提高系统的响应速度和效率。 该PDF首先介绍了FPGA(Field-Programmable Gate Array)的基本概念和原理。FPGA是一种可编程逻辑门阵列,通过在芯片上配置逻辑门的连接,可以实现不同的电路功能。因此,FPGA具有可重构和高度并行的特点,非常适合用于实现中断处理的硬件。 接下来,PDF详细介绍了中断的概念和原理。中断可以分为硬件中断和软件中断,硬件中断由外部信号触发,而软件中断由程序控制。PDF对中断的触发机制、中断的分类和中断处理过程进行了深入讲解。 在此基础上,PDF介绍了如何在Xilinx FPGA上实现中断处理。Xilinx FPGA提供了丰富的资源和工具,可以方便地实现中断处理电路。PDF详细介绍了如何使用Xilinx FPGA的开发工具进行中断处理电路设计和编程,并给出了实例演示。 最后,PDF总结了基于Xilinx FPGA的中断处理的优势和应用场景。基于Xilinx FPGA的中断处理可以提高系统的响应速度和效率,特别适用于需要实时响应和并发处理的应用领域,如数字信号处理、通信系统等。 《基于Xilinx FPGA的中断处理》PDF通过深入浅出的方式,详细介绍了基于Xilinx FPGA的中断处理的原理、方法和应用。对于学习和研究FPGA中断处理的人员来说,具有很高的参考价值。 ### 回答2: 《基于 Xilinx FPGA 的中断处理》是一本介绍在 Xilinx FPGA 系统中实现中断处理的指南。本书详细讲解了中断的概念、中断请求和中断响应的原理、中断向量表和中断优先级的设置,以及如何在 Xilinx FPGA 中建立中断处理机制。 首先,本书简要介绍了中断的概念和基本原理。中断是一种计算机硬件或软件的机制,用于打断正在执行的程序,以处理紧急事件。中断可以分为外部中断和内部中断,并且可以根据优先级进行处理。读者将了解到中断请求(IRQ)和中断响应(ISR)的基本原理。 接下来,本书详细讲解了在 Xilinx FPGA 中实现中断处理的步骤。首先,读者将学习如何设置中断请求源(Interrupt Request Source),通过配置和连接中断控制器(Interrupt Controller)和处理器(Processor)进行响应。然后,读者将了解如何建立中断向量表,其中包含了中断服务程序的地址信息。此外,本书还介绍了如何通过设置中断优先级来处理同时发生的多个中断请求。 最后,本书通过实例和代码示例展示了如何实现具体的中断处理功能。读者将通过参考实例代码了解如何在 Xilinx FPGA 中编写和编译中断服务程序。同时,本书还介绍了如何使用 Xilinx 提供的工具和资源,如 Vivado 开发环境和 AXI 中断控制器 IP 核等。 总之,这本《基于 Xilinx FPGA 的中断处理》通过详细的解释和实例演示,为读者提供了在 Xilinx FPGA 系统中实现中断处理的指南。读者可以通过阅读本书,了解中断的基本原理和实现步骤,掌握在 Xilinx FPGA 上开发中断处理功能的技巧和方法。 ### 回答3: 《基于Xilinx FPGA的中断处理》PDF 是介绍在Xilinx FPGA上如何进行中断处理的文档。中断处理是一种处理器与外设之间通信的重要机制,通过中断处理可以提高系统性能和响应速度。 在Xilinx FPGA上,中断处理的流程一般包括以下几个步骤: 1. 硬件配置:首先需要对FPGA进行硬件配置,将中断控制器模块(如AXI Interrupt Controller)添加到设计中,并配置中断通道、中断触发条件等参数。 2. 中断源设置:接下来需要确定哪些外设会触发中断,并配置相关的中断源。可以在设计中增加适当的中断源模块,或者在设计中使用已有的外设模块,如串口通信模块、以太网模块等。 3. 中断处理程序编写:针对每个中断源,需要编写相应的中断处理程序。中断处理程序一般包括中断服务程序和中断服务例程。中断服务程序是用来处理中断请求的,而中断服务例程则是在中断服务程序的基础上进行更加复杂的操作,如数据处理、状态更新等。 4. 中断配置和启用:在硬件配置好并编写好相应中断处理程序后,需要对中断进行配置和启用。通过编程方式,将中断配置信息写入到中断控制器的寄存器中,然后使能中断使能位,使系统能够正常响应中断。 通过以上步骤,可以在Xilinx FPGA上实现中断处理中断处理的好处是能够实现异步通信,提高系统的并发性,减少对处理器的轮询,节约系统资源和功耗。同时,中断处理也能提高系统的实时性,使系统能够更加及时地响应外设的事件。 总而言之,《基于Xilinx FPGA的中断处理》PDF提供了在Xilinx FPGA上实现中断处理的详细方法和步骤,对于需要在FPGA中实现中断的开发者和工程师来说,是一份非常有价值的文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值