精华内容
下载资源
问答
  • 10.5 外部中断的处理过程 我们之前已经学习了内部中断的处理方法,那么外部中断和内部中断总体上是很类似的。只是在一些具体的处理细节上和硬件的连接方式上有所不同。那我们现在就来看一看外部中断是如何处理的。 ...

    计算机组成

    10 输入输出设备

    10.5 外部中断的处理过程

    Screen Shot 2018-09-30 at 10.49.24 am

    我们之前已经学习了内部中断的处理方法,那么外部中断和内部中断总体上是很类似的。只是在一些具体的处理细节上和硬件的连接方式上有所不同。那我们现在就来看一看外部中断是如何处理的。

    Screen Shot 2018-09-30 at 10.49.33 am

    外部中断,也叫做硬件中断。这是由CPU外部的中断请求信号启动的中断。以x86 CPU为例,连到外部的中断请求信号一共有两个。一个信号叫做NMI,这就是非屏蔽中断的缩写。另一个信号叫INTR,这就是中断这个词的缩写,相对于非屏蔽中断,我们一般也称它为可屏蔽中断。不光是x86,其他很多别的体系结构的CPU也往往提供这两种类型的中断引脚。

    Screen Shot 2018-09-30 at 10.49.42 am

    这两个信号,是对应了CPU上真实存在的两个管脚。来自外设的中断请求信号就可以通过主板上的连线,连到这两个管脚上。这个NMI,也就是非屏蔽中断,一般会连接一个在这个系统当中非常重要,不希望被屏蔽的中断请求信号。那至于什么是非常重要,就取决于系统设计者的观点。例如在某些计算机当中,会将表示电池即将没电的这个信号连接到NMI上。电池马上就要没电了,确实是一个非常紧急的情况。因为非屏蔽中断是不受中断允许标志的影响,即使CPU现在将IF标志位设为0,关闭对外部中断的响应,CPU仍然会响应这个NMI的中断请求。这样就可以调用中断服务程序,在断电之前把一些重要的信息保存到硬盘上去。当然不同的系统可能会连接不同的中断请求信号到NMI上,但都会是一些非常重大,不处理就会导致严重错误的事件。

    一般的外设,它的中断请求都会连接到可屏蔽中断上,但是CPU的可屏蔽中断信号的请求输入只有一根,那就需要通过一些转换电路。现在计算机当中比较常见的是使用中断控制器这个芯片。中断控制器会将外设输出的中断请求信号作为它的输入连接进来,然后输出一根信号连接到CPU的可屏蔽中断请求信号上。这个中断控制器也可以看作是一个I/O接口,它内部也有一些被称为I/O端口的寄存器,CPU可以访问这些端口,对中断控制器进行配置。例如可以配置这些外设的中断请求,哪个优先级高,哪个优先级低,或者可以在这些中断请求当中,屏蔽其中的一部分。这些都是中断控制器的基本功能。

    Screen Shot 2018-09-30 at 10.49.50 am

    因为这样的中断控制器是可以由编写程序进行配置的,所以又称为可编程中断控制器,简称PIC。有一个广泛使用的可编程中断控制器,就是英特尔的8259。我们可以看到8259上,从IR0一直到IR7,一共有8个中断请求的输入可以用来连接外设的中断请求信号。然后它还有一些地址和数据信号,用以连接到系统总线上。CPU对I/O端口的访问,就通过这些信号线来传递。INT信号则是由中断控制器发出的中断请求信号,连接到CPU的可屏蔽中断请求信号上。实际上CPU在收到中断请求后,还会发出一个中断响应信号,这个信号会被连接到中断控制器的INTA引脚上。

    后来在8259的基础上,又有了一些升级和功能的扩充,这就是后来的高级可编程中断控制器,简称为APIC。

    那么再来看一看中断控制器在系统当中的连接情况。

    Screen Shot 2018-09-30 at 10.49.58 am

    IBM PC/XT当中,就使用了一片8259。8259和CPU之间,有中断请求信号和中断响应信号。而另一端,8259则连接了来自各个外设的中断请求信号。比如有来自定时器,有键盘,有串行接口,有硬盘,有软盘,还有打印机。那2号中断请求信号是被保留的,并没有连接外设,等一会儿我们还会提到,这根保留的中断请求信号用来做什么。这是三十多年前最早的个人计算机。在现在的个人计算机当中,有些设备都已经没有了,比如软盘,但是现代的计算机系统仍然要遵守最早的个人计算机当中确定的一些规则。那么就以键盘所对应的这个中断为例,来看一看现在最新的个人计算机当中的情况。

    Screen Shot 2018-09-30 at 10.50.15 am

    如果我们在一台装了Windows操作系统的个人计算机上,调出设备管理器,然后在设备管理器中找到键盘,用右键看这个键盘的属性。我们就会发现,它的中断请求信号仍然是连接到中断控制器的1号接口,仍然遵守三十多年前IBM PC所制定的规范。

    Screen Shot 2018-09-30 at 10.50.28 am

    那在刚才的那个例子中我们可以看到,一个中断控制器最多可以连接七个外设。如果有更多的外设应该怎么办呢?我们可以在系统中再增加一个中断控制器,这个中断控制器的请求信号不是连接到CPU的,而是连接到原有的中断控制器的2号中断请求信号上。那在这个中断控制器上,又可以再连接更多的外设。这样两级中断控制器的结构,在早期的个人计算机当中使用了很长时间。

    Screen Shot 2018-09-30 at 10.50.37 am

    不过现在情况有一点不太一样,因为很多I/O接口都集成到了南桥当中。所以,这些I/O接口的中断请求信号实际上都是在南桥内部了。因此,在南桥内一般也会实现一个中断控制器,当然现在是APIC这样的中断控制器了。这个中断控制器负责接收所有I/O接口的中断请求信号,包括南桥内部集成的,和在外部独立的I/O接口。它会将中断请求信号再送到CPU中去。而现在的计算机当中,往往有多个CPU,其实每个CPU当中,都还会带一个中断控制器。因为现在的CPU不但要接受中断请求信号,它也会发出中断,现在CPU发出的中断,是用来跟别的CPU进行交互的。比如两个CPU要进行一些协同的工作,其中一个CPU在处理完了内存当中的一部分数据,它就可以通过发出中断请求来通知另一个CPU进行后续的工作。因此,在现代的个人计算机当中,可能已经找不到一个独立的中断控制器的芯片了,但其实中断控制器的功能已经变得更为丰富,数量也变得更多了。

    Screen Shot 2018-09-30 at 10.50.51 am

    我们还是回到简单的情况,来看看这些来自外设的,可屏蔽中断的处理过程。当外设有中断的需求,它就会通过中断控制器向CPU发出中断请求信号,而CPU则会中断当前正在执行的程序,向中断控制器发出中断响应信号,然后中断控制器再会通过其他的信号线,将对应外设的中断类型码发给CPU。而这个类型码,其实也是在系统初始化时,通过写入中断控制器的I/O端口而设置的。CPU在得到了中断类型码之后,后续的处理过程就和内部中断是一样的了。我们快速地浏览一遍。

    CPU将相关的寄存器压栈,然后清除IF和TF标志位,再取得对应的中断向量。然后程序就会跳转到中断服务程序,在中断服务程序当中,可以在适当的时机通过设置IF标志位,开放中断。一旦开放了中断,就意味着在执行这个中断服务程序的过程中,CPU还可能会响应其他外设发来的中断。那在中断服务程序执行完之后,就会执行中断返回指令,将返回地址等信息从堆栈中弹出,然后就可以回到刚才被中断的位置继续执行了。如果在这个中断服务程序当中,开放中断后,外设又发来中断,那其实CPU是会中断这个中断服务程序的执行,转而去响应这个新发生的中断。这种情况就被称为中断嵌套

    Screen Shot 2018-09-30 at 10.50.59 am

    当然,要想发生中断嵌套的情况,必须要有比当前正在处理的中断优先级更高的中断请求,那这时CPU就会去响应这个优先级更高的中断请求,在执行完这个新的中断服务程序之后,再返回到刚才的中断服务程序当中继续执行。

    我们再根据图示来看一看这个过程。假设在一段主程序当中,开始是关闭了中断响应的。然后在这里打开了中断响应(STI),之后就发生了中断,于是CPU就会转向中断服务程序(第一层)。那么在这里CPU的硬件已经自动设置了IF标志位为0,屏蔽了外部的中断请求,如果在这个中断服务程序的某个地方(指第一层中的STI处)又打开了中断响应,而且在这个过程中又有外设发起了更高优先级的中断请求,那CPU又会去处理这个新的中断(第二层)。我们要注意,对于CPU来说,现在在执行的这个中断服务程序也就像是一个普通的程序,所以在这个过程中如果发生了中断请求,它依然会进行同样的那些处理步骤,比如压栈、关中断、保存现场等等,然后根据取回的中断向量进入到第二层的中断服务程序。那如果在这个中断服务程序当中没有开中断,或者开了中断但是没有更高优先级的外设发起中断请求,那一直执行到中断返回指令(IRET),CPU就会回到刚才发生中断的地方继续执行,也就是第一层的中断服务程序。如果之后没有再遇到中断请求,就会一直执行到第一层中断服务程序的中断返回指令(IRET),再返回到刚才主程序中断的地方。这就是一个简单的两层中断嵌套的过程。

    Screen Shot 2018-09-30 at 10.51.08 am

    现在我们已经知道了内部中断和外部中断是如何协同工作的,而在现代的计算机系统当中大量地使用了中断来控制输入输出设备。至于如何进行中断优先级的调配,什么时候能屏蔽中断,什么时候不能屏蔽中断,这些问题都是值得深入研究的。

    转载于:https://www.cnblogs.com/houhaibushihai/p/9745217.html

    展开全文
  • DSP28335外部中断配置过程

    千次阅读 2019-04-15 21:59:24
    28335外部中断基本特点 ...外部中断的触发方式可选上升沿或下降沿触发 **外部中断外设和其他外设不一样,在中断函数中只用清除PIE中断即可不用清除外设中断**。 外部中断配置过程 其实28335的外部中断配...

    28335外部中断基本特点

    7个可屏蔽中断源和1个不可屏蔽外部中断源
    GPIO0-31可选的中断源为XINT1(可屏蔽中断),XINT2和XNMI(不可屏蔽中断)
    GPIO32-GPIO63可选的中断源为XINT3-7
    外部中断的触发方式可选上升沿或下降沿触发
    **外部中断外设和其他外设不一样,在中断函数中只用清除PIE中断即可不用清除外设中断**。
    

    外部中断配置过程

    其实28335的外部中断配置相对其他外设的配置来说比较简单。不过需要注意XNMI和CPU定时器1中断一起使用时,需要将其中断的映射位置配置好。

    **首先将需要配置的GPIO端口配置为通用输入端口**。**上拉不上拉**,采样次数和与不与系统时钟同步都无所谓,不会影响中断的配置。不过如果噪声过大的话,建议使能上拉和选择合适的输入采样滤波。这里以GPIO34为例,将其配置为上升沿触发XINT3的中断输入源。下面所有寄存器的配置受到EALLOW的保护,因此需要解除保护在进行设置。
    GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; //相应端口配置为通用IO
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 0; //输入
    GpioCtrlRegs.GPBCTRL.bit.QUALPRD0 = 1; //输入滤波采样周期为2*1 Tsysclk(系统时钟)
    GpioCtrlRegs.GPBQSEL1.bit.GPIO34 = 1; //三次采样
    GpioCtrlRegs.GPBPUD.bit.GPIO34 = 0; //使能内部上拉
    将GPIO配置到响应的中断源上。
    //下面这句话按手册应该赋值为2,但是写34也没错,想一想为什么?
    GpioIntRegs.GPIOXINT3SEL.bit.GPIOSEL = 34; //选择34端口为外部中断3中断源
    选择触发中断的方式。
    XIntruptRegs.XINT3CR.bit.POLARITY = 1; //上升沿触发
    使能外部中断
    XIntruptRegs.XINT3CR.bit.ENABLE = 1; //使能外部中断
    最后使能PIE中断和CPU中断,如果需要还可以重新定义中断入口函数。
    PieCtrlRegs.PIEIER12.bit.INTx1 = 1; //使能PIE外部中断3
    IER |= M_INT12; //使能第十二组CPU中断
    PieVectTable.XINT3 = &Xint3_ISR; //从新定义中断入口函数
    上面基本上已经完成了外部中断的配置,但是对于XNMI来说需要加入下面这句话,以防止CPUTimer1中断连接到不可屏蔽中断上。
    XIntruptRegs.XNMICR.bit.SELECT = 0; //Timer1连到int13,XNMI连接到NMI
    
    展开全文
  • 外部中断配置过程

    多人点赞 2020-06-22 00:47:04
    开启所有外部中断源管脚对应GPIO时钟和AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx|RCC_APB2Periph_AFIO, ENABLE) 定义GPIO初始化结构变量, GPIO_InitTypeDef GPIO_InitStructure; 赋值结构变量...

    ①初始化GPIO;
    ②初始化NVIC;;
    ③初始化EXTI
    ④编写中断服务函数。

    ①初始化GPIO

    1. 开启所有外部中断源管脚对应的GPIO时钟和AFIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx|RCC_APB2Periph_AFIO, ENABLE)
    
    1. 定义GPIO初始化结构变量,
    GPIO_InitTypeDef GPIO_InitStructure;
    
    1. 赋值结构变量各成员
    GPIO_InitStructure.GPIO_Pin=管脚号0~15 ; .mode= GPIO_Mode_IN_FLOATING(浮空输入);
    
    1. 调用GPIO初始化函数:GPIO_Init(& GPIO_InitStructure);
    2. 如果有多个中断源,重复步骤3~4。

    ②初始化NVIC;

    1. 设置优先级分组
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_n);
    
    1. 定义NVIC初始化结构变量,并赋值结构变量各成员
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel =中断号;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =抢占优先级;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =子优先级;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    
    1. 调用NVIC初始化函数。
    NVIC_Init(&NVIC_InitStructure);
    
    1. 如果有多个中断源,重复步骤2~3

    ③初始化EXTI

    1. 定义EXTI初始化结构变量 EXTI_InitTypeDef EXTI_InitStructure;
    2. 选择EXTI的信号源,设置外部中断配置寄存器AFIO_EXTICR相关位
    GPIO_EXTILineConfig()
    
    1. 赋值结构变量各成员
    EXTI_InitStructure.EXTI_Line =信号源
    EXTI_InitStructure.EXTI_Mode =中断模式
    EXTI_InitStructure.EXTI_Trigger =触发方式
    
    1. 调用EXTI初始化函数
    EXTI_Init(&EXTI_InitStructure);
    

    如果有多个外部中断源,重复步骤2~4.

    ④编写中断服务函数。

    • 在启动文件startup_stm32f10x_hd.s 中我们预先为每个中断都写了一个中断服务函数,只是这些中断函数都是为空,为的只是初始化中断向量表。实际的中断服务函数都需要我们重新编写,为了方便管理,可以把中断服务函数统一写在stm32f10x_it.c 这个库文件中。
    • 关于中断服务函数的函数名必须跟启动文件里面预先设置的一样,如果写错,系统就在中断向量表中找不到中断服务函数的入口,直接跳转到启动文件里面预先写好的空函数,并且在里面无限循环,实现不了中断。
    • 对每个中断号编写中断服务函数,对于EXTI9-5 和EXTI15-10,多个中断源公用同一个中断号时,可以在中断服务函数中判断具体是哪一个中断源被触发,然后根据中断源编制相应的响应程序。
    void EXTIx_IRQHandler(void); void EXTI9_5_IRQHandler(void)
    • 重要提醒,中断服务函数中,为确保确实产生了中断请求,通常需要检查一下状态标识位确认确实产生了该中断。同时,为避免一次中断请求执行多次中断服务程序,中断服务程序最后需要清除该中断标识位。例如:

    if(EXTI_GetITStatus(KEY3_INT_EXTI_LINE) != RESET) //确保是否产生了EXTI Line中断
    {EXTI_ClearITPendingBit(KEY3_INT_EXTI_LINE); //清除中断标志位
    }
    
    展开全文
  • 设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0中断程序将被中断去执行外部中断1中断程序(数码管加1显示程序)。 #include<...

    设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管加1显示程序)。

    #include<reg51.h>
    #define uchar unsigned char;
    sbit key1=P3^2;
    sbit key2=P3^3;
    unsigned int i;
    uchar led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
    uchar tube[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

    void delay1s(unsigned char time)
    {
    unsigned int i,j,k;
    for(i=0;i<time;i++)
    for(j=0;j<1000;j++)
    for(k=0;k<144;k++);
    }

    int main(void)
    {
    IT0=1;
    IT1=1;
    EA=1;
    EX0=1;
    EX1=1;
    PX0=1;
    PX1=0;
    while(1);
    }
    void int1(void) interrupt 0
    {
    while(!key1);
    for(i=0;i<10;i++)
    {
    P1=0x00;
    P2=tube[i];
    delay1s(1);
    }
    }
    void int2(void) interrupt 2
    {
    while(!key2);
    for(i=0;i<8;i++)
    {

    	P0=led[i];
    	delay1s(1);
    }
    

    }
    视频:
    https://www.bilibili.com/video/BV1jK411u7JH/

    展开全文
  • 要想正确地执行2440的外部中断,一般需要完成两个部分内容:中断初始化和中断处理函数。 在具体执行中断之前,要初始化好要用中断。2440的外部中断引脚EINT与通用IO引脚F和G复用,要想使用中断功能,就要把相应...
  • STM32每个IO都可以作为外部中断输入。 STM32中断控制器支持19个外部中断/事件请求: 线0~15:对应外部IO口输入中断。 线16:连接到PVD输出。 线17:连接到RTC闹钟事件。 线18:连接到USB唤醒事件。 每个...
  • ARM Linux外部中断处理过程

    千次阅读 2008-08-04 10:39:00
    muxiaowei 整理:Nathan.Yu 最近在学习arm linux的整套外部中断的处理过程
  • linux外部中断过程

    千次阅读 2016-05-05 11:37:05
    内核在linux-2.6.22.6\init\main.c\start_kernel函数中调用trap_init、init_IRQ 两个函数来设置异常处理函数。asmlinkage void __init start_kernel(void) { ... trap_init(); ... init_IRQ(); ... }1.linux-...
  • 声明:【51单片机学习过程记录】全是我自己学习、实践所记录的过程,我只是菜鸟,所有论点和观点仅代表我个人,不能确定是这个技术的真理。我的目的是学习和有可能成为可以向别人分享的经验,因此有错误我会虚心接受...
  • 外部中断1完整配置一次,以供参考 函数功能是, 在外部信号持续输入情况下,且下降沿触发外部中断。 每隔一段时间,GPIO0和GPIO1LED等闪烁。 在一段时间后,系统停止,LED灯停止闪烁。 #include &...
  • 在S3C2440A中怎样去实现外部中断的过程? 1、配置对应的引脚为外部中断模式:外部中断跟外部引脚F和G复用。要把相应的引脚配置为中断模式 2、配置完引脚后,还需要配置具体的中断功能。我们要打开某一中断的...
  • 使用cubemx工具进行配置外部中断时 第一步 只需将IO口设置为外部中断模式 第二步配置好中断的触发方式 第三步 设置中断优先级 第四步 只需要自己编写一个回调函数就可以了(里面放置中断发生时需要做的操作) ....
  • S3C6410外部中断 中断在嵌入式里面是很常见的一个功能了。通过这个功能,可以让CPU减轻很多负担,不用不断的查询设备的状态。...中断的过程如下:   中断源检测中断信号产生,然后将中断信号发送给中断控制器
  • 第4课,外部中断 一、32的外部中断简述 32中断可能有很多个,其通过端口映射,可以将很多端口都作为外部中断端口。其次,其中断数受它中断通道数目影响,有两种中,一种是多对一,一种是一对一。多对一是...
  • 28335外部中断基本特点 ...外部中断的触发方式可选上升沿或下降沿触发 外部中断外设和其他外设不一样,在中断函数中只用清除PIE中断即可不用清除外设中断。 外部中断配置过程 其实28335的外部中断配...
  • 本周的学习内容主要是PWM,外部中断和定时器中断,了解了PWM的基本功能以及外部中断,定时器中断的执行过程.     一·PWM 1.PWM一般是指脉冲宽度调制,通过PWM功能就能调节输出电压。     2.占空比指的是...
  • STM32的每个 I/O口都可以作为外部中断的输入,中断线0~15对应外部I/O口的中断输入,每个外部中断线可以独立配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用状态位。 16条中断线只能使用7个中断服务...
  • 声明:【51单片机学习过程记录】全是我自己学习、实践所记录的过程,我只是菜鸟,所有论点和观点仅代表我个人,不能确定是这个技术的真理。我的目的是学习和有可能成为可以向别人分享的经验,因此有错误我会虚心接受...
  • 内部中断是不可屏蔽的中断 软中断优先级最高 外部中断是可屏蔽中断 比如软中断 就可以屏蔽 不响应 还有响应中断的话 是必须联和设置才可以响应 否则不会响应 比如ss:sp 这个联合设置 代码举例 ...中断的过程: 1.cpu...
  • 外部中断:是处理器外设发出中断请求,如定时器中断,UART接收中断,外部中断一般都可以通过中断控制器进行屏蔽;1.ITC功能概述:……所有IO引脚都具有外部中断能力,每个端口都有独立中断向量以及独立标志;...
  • 外部中断

    2007-05-31 15:57:00
    环境:cpu:mcf5307 os:NuCleus对外部中断源(称为ext)来说,最重要是中断向量(IntVector)。ext 一定要物理上连接在cpuIRQ管脚上。IntVector处应该放置中断服务函数...这样一个过程就把外部中断对应到了中...
  • LPC2478的外部中断使用

    2014-10-17 21:35:00
    也就是说,port0和2支持外部中断,EINT0-2是三个独立管脚中断,而EINT3则是port0和2所有中断共同拥有向量 对于port0和2不需要刻意去把引脚配置为中断模式,将他配置到输入模式然后启动中断就可以了,对于独立...
  • 12外部中断

    2012-02-18 16:27:00
    12.1外部中断简介 中断是处理器处理外部突发事件的一个重要技术。它能使处理器在运行过程中对外部事件发出的中断请求及时地进行处理,处理完成后又立即返回断点,继续进行处理器原来的工作。引起中断的原因或者说...
  • Arduino 定时器中断 外部中断

    千次阅读 2019-04-09 17:29:31
    但如果此时发生了某一件事件B请求CPU迅速去处理(中断发生),CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务),待CPU将事件B处理完毕后,再回到原来被中断的地方继续执行程序(中断返回),这一过程成...
  • 重要声明: 以下代码有粘贴 截取他人劳动成果的成分 如有雷同 不胜荣幸 如您不能容忍 请不要独自忍受@weChat:iisssssssssii 联系小民 主动删除  中断含义:  ...引起中断的原因或者说发出中断请求的
  • 从v都是vs

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,187
精华内容 474
关键字:

外部中断的过程