精华内容
下载资源
问答
  • 2018-11-12 23:13:23

    外部中断事件

    众所周知,CPU在计算机系统中,除了能够执行指令,进行运算外,还应该有输入输出功能。比如说,我现在在打字输入‘a’,CPU他会处理这个按键,并在你的屏幕上显示‘a’。我们想想,它能显示,是不是打印机工作了,打印机工作。是不是CPU给它指令了,那是不是我们按键,然后CPU处理并执行。

            那么,CPU现在要处理键盘(也就是外设的输入),很明显要解决两个问题。

    1. 我们是不是随时按按键他都能执行,那么CPU如何得知。
    2. CPU如何得到外设的输入,以及他如何区别键盘输入的内容。

    接口和端口

            CPU和外设的联系是通过端口实现并控制外设的输入和输出。外设的输入不直接送入内存和CPU,而是先送到相应接口芯片的端口中:输出也是如此。CPU向外设输出控制指令也是如此。

    中断信息

            我们现在知道了,外设的输入是存放在端口中,但是它随时都有可能发生,那么CPU如何及时的知道。也就是我们提出的第一个问题。这时,CPU提供中断机制来满足这种需求。 当CPU内部需要有处理的事情发生的时候,将产生终端信息,引发中断过程,中断过程此处不多讲。这种中断信息被称为内部中断。

            还有一种中断信息,来自于CPU外部,比如说外设的输入到达。CPU在执行完当前指令的时候,会读取中断控制器信息,引发中断过程,处理外设输入

    PC系统中外中断过程(可屏蔽):

    1. 取中断类型码;
    2. 标志寄存器入栈,IF = 0,TF = 0;
    3. CS,IP入栈;
    4. 得到中断服务程序的入口地址(IP) = (n*4),(cs) = (n*4+2)
    5. 处理中断服务程序

    PC系统中外中断过程(不可屏蔽):中断类型码固定为2,所以在中断过程中不需要取中断类型码

    1. 标志寄存器入栈,IF = 0,TF = 0;
    2. CS,IP入栈
    3. (IP) = (8),(CS) = (0AH)。

    这里主要举个键盘的外部中断例子

    键盘事件:int 09h中断

         当键盘输入到端口地址60h,相关控制芯片会向CPU发出中断类型号为9的可屏蔽外部中断信息,如果此时IF(中断屏蔽标志位)为1则执行相应的中断处理。处理如下

    1. 读出60h端口中的扫描码
    2. 将扫描码和字符码送入BIOS键盘缓冲区;如果是控制键他会将其转换成状态字节(二进制)送入存储键盘状态的单元(0040:17);
    3. 对键盘系统发出相关的控制。

    编写int 9 中断例程 :

    更多相关内容
  • 中断是当进程或事件需要立即引起注意时由硬件或软件发出的信号。它向处理器发出高优先级进程警报, 要求中断当前工作进程。在I/O设备中, 总线控制线之一专用于此目的, 称为总线控制线。中断服务程序(ISR). 当设备...

    中断是当进程或事件需要立即引起注意时由硬件或软件发出的信号。它向处理器发出高优先级进程警报, 要求中断当前工作进程。在I/O设备中, 总线控制线之一专用于此目的, 称为总线控制线。中断服务程序(ISR).

    当设备在进程i引发中断时, 处理器首先完成指令i的执行。然后, 它向程序计数器(PC)加载ISR的第一条指令的地址。在向程序计数器加载地址之前, 被中断指令的地址将被移至临时位置。因此, 在处理了中断之后, 处理器可以继续处理i + 1。

    在处理器处理中断时, 它必须通知设备其请求已被识别, 以便停止发送中断请求信号。此外, 保存寄存器以便将来可以恢复被中断的过程, 从而增加了接收中断到开始执行ISR之间的延迟。这称为中断延迟。

     

    硬件中断:

    在硬件中断中, 所有设备都连接到中断请求线。一条请求线用于所有n个设备。要请求中断, 设备会关闭其关联的开关。当设备请求中断时, INTR的值是来自各个设备的请求的逻辑或。

    处理IRQ涉及的事件顺序:

    1. 设备发出IRQ。
    2. 处理器中断当前正在执行的程序。
    3. 通知设备其请求已被识别, 并且设备停用请求信号。
    4. 所请求的动作已执行。
    5. 启用中断, 并恢复被中断的程序。

     

    处理多个设备:

    当多个设备发出中断请求信号时, 则需要其他信息来确定首先考虑哪个设备。以下方法用于决定选择哪个设备:轮询, 向量中断和中断嵌套。这些解释如下。

     

    轮询:

    在轮询中, 遇到IRQ位置1的第一个设备是首先要服务的设备。调用适当的ISR来提供相同的服务。这很容易实现, 但是通过查询所有设备的IRQ位会浪费很多时间。

     

    向量中断:

    在向量中断中, 请求中断的设备通过在总线上向处理器发送特殊代码来直接标识自己。这使处理器能够识别产生中断的设备。特殊代码可以是ISR的起始地址, 也可以是ISR在内存中的位置, 称为中断向量。

     

    中断嵌套:

    在这种方法中, I/O设备按优先级结构进行组织。因此, 识别出来自较高优先级设备的中断请求, 而不是来自较低优先级设备的请求。为了实现这一点, 每个进程/设备(甚至是处理器)。处理器仅接受优先级高于其的设备/进程的中断。

    处理器优先级编码在PS(进程状态寄存器)的几位中。可以通过写入PS的程序指令对其进行更改。仅在执行OS例程时, 处理器才处于监督模式。在执行应用程序之前, 它将切换到用户模式。

    更多操作系统相关内容请参考:lsbin - IT开发技术https://www.lsbin.com/

    查看以下操作系统相关的内容:

    展开全文
  • 引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转...对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。
  • STM32的中断事件

    万次阅读 2017-07-12 18:53:36
    学习单片机一贯的套路,搞完时钟和GPIO...1.2 异常是指由于cpu本身故障、程序故障或者请求服务等引起的错误,异常属于不正常现象。Cortex-M3内核总共支持256个中断,其中包含16个内核异常和240个外部中断,但是各个芯

    学习单片机一贯的套路,搞完时钟和GPIO就要折腾中断了。

    1. 中断和异常的区别

    1.1 中断是指系统停止当前正在运行的程序转而其他服务,可能是程序接收了比自身高优先级的请求,或者是人为设置中断,中断是属于正常现象。
    1.2 异常是指由于cpu本身故障、程序故障或者请求服务等引起的错误,异常属于不正常现象。

    Cortex-M3内核总共支持256个中断,其中包含16个内核异常和240个外部中断,但是各个芯片产商在设计芯片的时候会对CM3内核的芯片进行精简设计,如STM32F103系列,所搭载的异常响应系统,包含10个系统异常和60个外部中断,用一张表将它们管理起来,编号0~15位系统异常,16以上称为外部中断。

    系统异常清单:
    这里写图片描述
    外部中断清单:
    这里写图片描述

    这里写图片描述

    外部中断信号从核外发出,信号最终要传递到NVIC(嵌套向量中断控制器)。NVIC跟内核紧密耦合,它控制着整个芯片中断的相关功能。

    2. 中断优先级

    STM32支持两种优先级:抢占优先级和子优先级。所有优先级可编程的中断源都需要指定这两种优先级。
    抢占优先级决定是否可以产生中断嵌套,子优先级决定中断响应顺序,若两种优先级一样则看中断源在中断向量表中的偏移量,偏移量小的先响应。
    对这句话的解释为:

    (1)抢占优先级高的中断源可以中断抢占优先级低的中断处理函数,进而执行高优先级的中断处理函数,执行完毕后再继续执行被中断的低优先级的处理函数。
    (2)当两个中断源的抢占优先级相同时,即这两个中断将没有嵌套关系,当一个中断到来后,若此时cpu正在处理另一个中断,则这个后到来的中
    断就要等到前一个中断处理函数处理完毕后才能被处理,当这两个中断同时到达,则中断控制器会根据它们的子优先级决定先处理哪个。
    (3)如果它们的抢占优先级和子优先级都相等,则根据它们在中断表中的排位顺序决定先处理哪一个。

    每个中断源都需要被指定抢占优先级和子优先级,自然需要相应的寄存器来记录。在NVIC中有一个专门处理中断优先级的寄存器NICV_IPRx,用于配置中断源的优先级。IPR的宽度为8Bit,对于CM3内核来说,因为它支持的中断源为256个,那么原则上每个外部中断源可配置的优先级位0~255,数值越小优先级越高。但是因为绝大多数CM3芯片都会精简设计,所以不会使用到全部位,在STM32F103中只使用4Bit。
    这里写图片描述
    注意,个别系统系统的优先级是固定的,所以它们的中断优先级是不可编程的。

    2.1 CM3核的优先级分组方式
    CM3中定义了8个Bit用于设置中断源的优先级,这8个Bit可以分配为:

    (1)8bit用于响应优先级
    (2)最高1位用于指定抢占优先级,最低7位用于执行子优先级
    (3)最高2位用于指定抢占优先级,最低6位用于执行子优先级
    (4)最高3位用于指定抢占优先级,最低5位用于执行子优先级
    (5)最高4位用于指定抢占优先级,最低4位用于执行子优先级
    (6)最高5位用于指定抢占优先级,最低3位用于执行子优先级
    (7)最高6位用于指定抢占优先级,最低2位用于执行子优先级
    (8)最高7位用于指定抢占优先级,最低1位用于执行子优先级

    CM3核的优先级分组方式,使用的设置函数

    NVIC_SetPriorityGrouping()

    在Libraries\CMSIS\CM3\CoreSupport\core_cm3.h文件中实现:

    static __INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
    {
      uint32_t reg_value;
      uint32_t PriorityGroupTmp = (PriorityGroup & 0x07);                         /* only values 0..7 are used          */
    
      reg_value  =  SCB->AIRCR;                                                   /* read old register configuration    */
      reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk);             /* clear bits to change               */
      reg_value  =  (reg_value                       |
                    (0x5FA << SCB_AIRCR_VECTKEY_Pos) | 
                    (PriorityGroupTmp << 8));                                     /* Insert write key and priorty group */
      SCB->AIRCR =  reg_value;
    }

    该函数写在.h文件中,且声明为内联函数(__INLINE),内联函数跟宏替换差不多,可以避免函数调用的压栈出栈等开销。PriorityGroup的取值为0~7。

    2.2 STM32的优先级分组方式
    CM3核的优先级分组方式是针对256个中断全部用上的场合,但是Cortex-M3也允许在具有较少中断源时用较少的寄存器位指定中断源的优先级。STM32并没有使用Cortex-M3内核嵌套向量中断全套东西,而是使用了它的一部分:

    (1)STM32F103系列有16个内核异常和60个外部中断
    (2)STM32F107系列有16个内核异常和68个外部中断

    STM32的优先级分组使用标准库函数

    NVIC_PriorityGroupConfig()

    该函数在Libraries\STM32F10x_StdPeriph_Driver\src\misc.c中实现:

    void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
    {
      /* Check the parameters */
      assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
    
      /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
      SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
    }

    可见,这个函数也是在设置SCB->AIRCR寄存器,只是这里的取值为:

    (1)NVIC_PriorityGroup_0:0bit for 抢占优先级,4bit for 子优先级,即有24次方个子优先级
    (2)NVIC_PriorityGroup_1:1bit for 抢占优先级,3bit for 子优先级,即有23次方个子优先级
    (3)NVIC_PriorityGroup_2:2bit for 抢占优先级,2bit for 子优先级,即有22次方个子优先级
    (4)NVIC_PriorityGroup_3:3bit for 抢占优先级,1bit for 子优先级,即有21次方个子优先级
    (5)NVIC_PriorityGroup_4:4bit for 抢占优先级,0bit for 子优先级,即有20次方个子优先级

    3. NVIC操作相关函数

    NVIC的描述结构体在core_cm3.h中:

    typedef struct
    {
      __IO uint32_t ISER[8];        /* 中断使能寄存器(Interrupt Set Enable Register),Offset: 0x000 */
           uint32_t RESERVED0[24];                                   
      __IO uint32_t ICER[8];        /* 中断清除寄存器(Interrupt Clear Enable Register),Offset: 0x080 */
           uint32_t RSERVED1[24];                                    
      __IO uint32_t ISPR[8];        /* 中断使能挂起寄存器(Interrupt Set Pending Register),Offset: 0x100 */
           uint32_t RESERVED2[24];                                   
      __IO uint32_t ICPR[8];        /* 中断清除挂起寄存器(Interrupt Clear Pending Register),Offset: 0x180 */
           uint32_t RESERVED3[24];                                   
      __IO uint32_t IABR[8];        /* 中断有效位寄存器(Interrupt Active bit Register ),Offset: 0x200 */
           uint32_t RESERVED4[56];                                   
      __IO uint8_t  IP[240];        /* 中断优先级寄存器(Interrupt Priority Register),Offset: 0x300 (8Bit wide) */
           uint32_t RESERVED5[644];                                  
      __O  uint32_t STIR;           /* 软中断触发寄存器(Software Trigger Interrupt Register),Offset: 0xE00 */
    }  NVIC_Type;

    编程中常用的是ISER、ICER和IP这三个寄存器。ISER和ICER分别用于enable、disable中断,IP用于控制中断优先级。
    同在core_cm3.h中,定义了对结构体成员的操作函数,这是针对Cortex-M3内核芯片都适用的函数:

    (1)设置优先级分组寄存器: NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
    (2)从NVIC中断控制器得到优先级分组设置值: NVIC_GetPriorityGrouping(void)
    (3)使能中断: NVIC_EnableIRQ(IRQn_Type IRQn) 
    (4)失能中断: NVIC_DisableIRQ(IRQn_Type IRQn) 
    (5)获取挂起中断编号: NVIC_GetPendingIRQ(IRQn_Type IRQn) 
    (6)设置中断挂其位: NVIC_SetPendingIRQ(IRQn_Type IRQn) 
    (7)清除中断挂起位: NVIC_ClearPendingIRQ(IRQn_Type IRQn) 
    (8)NVIC_GetActive(IRQn_Type IRQn)
    (9)设置中断源的中断优先级: NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) 
    (10)获取中断源的中断优先级: NVIC_GetPriority(IRQn_Type IRQn) 
    (11)编码一个中断的优先级,不知道干嘛: NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
    (12)解码一个中断的优先级,不知道干嘛: NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) 
    (13)系统复位: NVIC_SystemReset(void)

    在外设库misc.h定义了针对STM32的NVIC的初始化描述结构体:

    typedef struct
    {
      uint8_t NVIC_IRQChannel;                    /* 中断源 */
      uint8_t NVIC_IRQChannelPreemptionPriority;  /* 抢占优先级 */
      uint8_t NVIC_IRQChannelSubPriority;         /* 子优先级 */
      FunctionalState NVIC_IRQChannelCmd;         /* 中断使能或者失能 */   
    } NVIC_InitTypeDef;

    misc.c也定义了针对STM32的NVIC的操作函数:

    (1)设置优先级分组寄存器: NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
    (2)初始化NVIC_InitTypeDef类的结构体: NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
    (3)设置中断向量表位置和偏移: NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset)
    系统可以选择从SRAM启动,也可以选择从flash启动,对应的启动地址会映射到0地址处,而中断向量表是要被放在0地址处的,所以要将中      断向量表放在SRAM/flash的起始位置。函数参数一的取值为NVIC_VectTab_RAM/NVIC_VectTab_FLASH,参数二的取值必须是0x200的整数倍(STM32就是这么规定的)。
    (4)选择进入低功耗模式的条件: NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState) 
    参数一取值NVIC_LP_SEVONPEND/NVIC_LP_SLEEPDEEP/NVIC_LP_SLEEPONEXIT,参数二取值ENABLE/DISABLE

    4. EXTI–外部中断和事件控制器

    EXTI有20个中断/事件线,每个GPIO都可以被设置为中断/事件的输入线,占用EXTI0~EXTI15,还有另外4根用于特定的外设事件的EXTI16~EXTI19:
    这里写图片描述
    注意,EXTIx与GPIOx的对应关系,EXTI0只能和P[x]0绑定(x = A、B、C、D…),
    这里写图片描述
    实现绑定操作的函数声明位于标准库Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h中:

    GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
    参数一GPIO_PortSource的取值为GPIO_PortSourceGPIOx (x = A..G),
    参数二GPIO_PinSource的取值为GPIO_PinSourcex(x = 0..15)

    这个函数在一般初始化EXTI寄存器时候调用。因为外部中断是GPIO引脚的复用功能,所以同时要开启GPIO复用功能的时钟:

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE)

    5. EXTI描述结构体的初始化

    EXTI描述结构体声明在标准外设库Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_exti.h中:

    typedef struct
    {
      uint32_t EXTI_Line;               /* 中断事件线 */
      EXTIMode_TypeDef EXTI_Mode;       /* EXTI模式,事件/中断 */
      EXTITrigger_TypeDef EXTI_Trigger; /* 触发类型 */
      FunctionalState EXTI_LineCmd;     /* EXTI使能 */ 
    }EXTI_InitTypeDef;

    与EXTI操作相关的函数有:

    (1)去除EXTI_InitTypeDef结构体的初始化:EXTI_DeInit(void)
    (2)初始化EXTI_InitTypeDef结构体: EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct) 
    (3)默认初始化:EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct) 
    (4)EXTI_GenerateSWInterrupt(uint32_t EXTI_Line) 产生一个软件中断
    (5)获取产生中断的标志:EXTI_GetFlagStatus(uint32_t EXTI_Line) 
                       EXTI_GetITStatus(uint32_t EXTI_Line)
    (6)清除中断产生标志:EXTI_ClearFlag(uint32_t EXTI_Line) 
                      EXTI_ClearITPendingBit(uint32_t EXTI_Line)

    获取/清除产生中断的标志的实现是一样的,但是为什么要分成两组函数?
    也许这是STM32标准外设库设计者出自于为兼容性考虑吧。有的ARM芯片的中断体系分为两层,也就是说中断信号要抵达NVIC需要两层筛选,同理清除中断标志也需要清除两层。但是在CM3核的ARM只设计了一层,STM32为了兼容其他芯片,依旧还是将函数设计成两层,只不过这两层的实现体是一致的。

    6. 编程实现按键中断

    下来编程操作STM32的中断。未能免俗,还是以按键中断为例。
    实验采用正点原子miniSTM32硬件平台,
    这里写图片描述

    按键KEY0(PC5)和KEY1(PA15)的原理图:
    这里写图片描述
    这里写图片描述
    这里写图片描述

    LED0(PA8)和LED1(PD2)的原理图:
    这里写图片描述
    这里写图片描述

    实验实现按键产生外部中断,在中断处理函数中实现反向控制LED灯。编程的要点为:

    (1)初始化用来产生中断信号的GPIO
    (2)初始化中断/事件控制器EXTI
    (3)配置NVIC
    (4)编写中断服务函数

    EXTI用于设置中断源的触发方式、中断/事件类型和具体是哪一个中断源。
    中断信号产生后最终传递到NVIC,NVIC控制中断源优先级、中断线通道等,以便比对中断信号、根据优先级调用中断服务函数。
    实验采用MDK4集成开发环境,工程的目录结构如下:
    这里写图片描述

    exti_led.h声明实验中用到的函数:

    #ifndef __EXTI_LED_H__
    #define __EXTI_LED_H__
    
    #include "stm32f10x_conf.h"
    
    void TimeDelay(void);
    void Led_CfgInit(void);
    void Exti_CfgInit(void);
    void NVIC_CfgInit(void);
    void Key_CfgInit(void);
    
    #endif /* __EXTI_LED_H__ */

    mian.c实现各个功能模块:
    (1)初始化外接LED的GPIO引脚

    //PA8-->LED0,PD2-->LED1
    void Led_CfgInit(void)
    {
        GPIO_InitTypeDef GPIO_InitTypeStu;
    
        //开启PA和PD端口的时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD, ENABLE);
    
        //初始化PA8引脚为推挽输出
        GPIO_InitTypeStu.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitTypeStu.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitTypeStu.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitTypeStu);
        GPIO_SetBits(GPIOA,GPIO_Pin_8);         //LED0初始状态为灭
    
        //初始化PD2引脚为推挽输出
        GPIO_InitTypeStu.GPIO_Pin = GPIO_Pin_2;
        GPIO_Init(GPIOD, &GPIO_InitTypeStu);
        GPIO_SetBits(GPIOD,GPIO_Pin_2);         //LED1初始状态为灭
    }

    (2)初始化外接按键的引脚

    void Key_CfgInit(void)
    {
        GPIO_InitTypeDef GPIO_InitTypeStu;
    
        //开启PC和PA的时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE);
    
        //初始化PC5为上拉输入
        GPIO_InitTypeStu.GPIO_Mode = GPIO_Mode_IPU; // GPIO_Mode_IN_FLOATING;   
        GPIO_InitTypeStu.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitTypeStu.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitTypeStu);
    
        //初始化PA15为上拉输入
        GPIO_InitTypeStu.GPIO_Mode = GPIO_Mode_IPU; // GPIO_Mode_IN_FLOATING;   
        GPIO_InitTypeStu.GPIO_Pin = GPIO_Pin_15;
        GPIO_InitTypeStu.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitTypeStu);
    }

    一开始我是设置PC5和PA15为浮空输入的,因为只需要考虑到按键按下是低电平,但是实验表明,浮空输入并不能确定引脚状态,即使在按键按下以后也不能触发中断,所以还是要将它们设置为上拉/下拉输入。

    (3)初始化EXTI

    void Exti_CfgInit(void)
    {
        EXTI_InitTypeDef EXTI_InitStu;  
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    
        //EXTI5
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5); //将具体GPIO和外部中断事件线绑定
        EXTI_InitStu.EXTI_Line = EXTI_Line5;
        EXTI_InitStu.EXTI_Mode = EXTI_Mode_Interrupt;               //中断模式
        EXTI_InitStu.EXTI_Trigger = EXTI_Trigger_Rising;            //上升沿触发
        EXTI_InitStu.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStu);
    
        //EXTI15
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15);    
        EXTI_InitStu.EXTI_Line = EXTI_Line15;
        EXTI_InitStu.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStu);
    }

    GPIO用于传输外部中断信号属于GPIO复用部分的功能,所以需要打开RCC_APB2Periph_AFIO的时钟。

    (4)初始化NVIC

    void NVIC_CfgInit(void)
    {
        NVIC_InitTypeDef NVIC_InitTypeStu;
    
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置中断分组
        NVIC_InitTypeStu.NVIC_IRQChannel = EXTI9_5_IRQn;        //外部中断线EXTI5属于共享中断
        NVIC_InitTypeStu.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
        NVIC_InitTypeStu.NVIC_IRQChannelSubPriority = 1;        //子优先级
        NVIC_InitTypeStu.NVIC_IRQChannelCmd = ENABLE;   
        NVIC_Init(&NVIC_InitTypeStu);
    
        NVIC_InitTypeStu.NVIC_IRQChannel = EXTI15_10_IRQn;      //外部中断线EXTI15属于共享中断
        NVIC_InitTypeStu.NVIC_IRQChannelSubPriority = 2;
        NVIC_Init(&NVIC_InitTypeStu);
    }

    (5)延时函数,这里只是简单延时,并没有精准计算

    void TimeDelay(void)
    {
        int i, j;
    
        for (i = 0; i < 100; i++)
            for (j = 0; j < 1000; j++);
    }

    (6)main函数

    int main(void)
    {
        Led_CfgInit();
        Key_CfgInit();
        Exti_CfgInit();
        NVIC_CfgInit();
    
        while(1);
        return 0;
    }

    当用户按下KEY0时,会进入EXTI9_5_IRQHandler()处理函数中,按下KEY1则进入EXTI15_10_IRQHandler()处理函数。这两个函数名是在启动文件写的,详细可参考文章http://blog.csdn.net/qq_29344757/article/details/74932235。处理函数的实现如下:

    void EXTI9_5_IRQHandler(void)
    {   
        //int i = 50;
        TimeDelay();    //延时去抖动
    
        if (!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5) && EXTI_GetFlagStatus(EXTI_Line5))
        {
            GPIO_WriteBit(GPIOA, GPIO_Pin_8, ((BitAction)!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)));
    
            //清中断
            //EXTI_ClearFlag(EXTI_Line5);
            EXTI_ClearITPendingBit(EXTI_Line5);
        }
    }
    
    void EXTI15_10_IRQHandler(void)
    {   
        TimeDelay();    //延时去抖动
    
        if (!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15) && EXTI_GetFlagStatus(EXTI_Line15))
        {
            GPIO_WriteBit(GPIOD, GPIO_Pin_2, ((BitAction)!GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_2)));
    
            //清中断
            //EXTI_ClearFlag(EXTI_Line15);
            EXTI_ClearITPendingBit(EXTI_Line15);
        }
    }

    函数可在用户自定义的文件实现,也可以在标准库提供的工程模板文件stm32f10x_it.c中实现。由于是共享中断,所以需要调用EXTI_GetFlagStatus()函数来判断是否为目的中断源。其实在其他很多非共享中断的场合也有使用EXTI_GetFlagStatus()函数判断目的中断源,无关紧要了。

    STM32的中断系统非常强大,每一个外设都可以产生中断。关于STM32中断/事件部分的学习就先告一段落,详细内容可参考STM32F10X-中文参考手册》、《 Cortex-M3 内核编程手册》的4.3章节。下一个学习任务–系统定时器SysTick。

    展开全文
  • CPU正常运行程序时,由于内部或外部某个紧急事件的发生,使CPU...引起中断事件(外设或内部原因),称为中断源 处理中断源,完成其所要求功能的程序,称为中断服务程序 给每个中断源指定一个优先权,称为中断优先权
  • 单片机中断控制.doc

    2022-06-19 18:47:20
    中断的有关概念 中断的定义——由预先安排好的内部或外部事件触发引起CPU中止正在正常执行的程序, 而转去执行另一段为触发事件而编写的程序,等为触发事件而编写的程序执行完后再返 回到打断处继续执行。...
  • 所以也有人把操作系统称为是由“中断驱动”或者“(中断)事件驱动”的。 由于中断机制的实现必须依靠相关的硬件支持,所以硬件中断装置是操作系统运行环境中的一个极为重要的组成部分。中断的实现是硬件中断装置和...

    中断机制是操作系统中极为重要的一个部分。操作系统在管理输入输出设备时,在处理外部的各种事件时,都需要通过中断机制进行处理。所以也有人把操作系统称为是由“中断驱动”或者“(中断)事件驱动”的。

    由于中断机制的实现必须依靠相关的硬件支持,所以硬件中断装置是操作系统运行环境中的一个极为重要的组成部分。中断的实现是硬件中断装置和相应的中断处理软件共同完成的。在本节中,首先介绍中断的概念,然后叙述中断系统的工作原理,最后分析中断处理的过程。

    一、中断与异常的概念

    1、中断与异常

    (1)中断的概念

    所谓中断是指处理器对系统中或系统外发生的异步事件的响应。异步事件是指无一定时序关系的随机发生的事件,如外部设备完成了数据传输任务,某一实时控制设备出现异常情况等。

    “中断”这个名称来源于:当发生某个异步事件后,中断了处理器对当前程序的执行,而转去处理该异步事件(称作执行该事件的中断处理程序)。在该异步事件处理完了之后,处理器再转回原程序的中断点继续执行。这种情况很像我们日常生活中的一些情况。例如,某人正在看书,此时电话响了(异步事件),于是用书签记住正在看的那一页(中断点),再去接电话(响应异步事件并进行处理),接完电话后再从被打断那页继续向下看(返回原程序的中断点执行)。

    最初,中断技术是用于向处理器报告某个“设备已完成操作”的一种手段,以免处理器不断地测试设备状态而消耗大量宝贵的处理器时间,后来,中断技术的应用越来越广泛。中断是所有要打断处理器的正常工作次序,并要求其去处理某一事件的一种常用手段。我们把引起中断的事件称为中断事件或中断源;中断源向处理器发出的请求信号称为中断请求;而把处理中断事件的程序称为中断处理程序;发生中断时正在执行的程序的暂停点叫作中断断点;处理器暂停当前程序转而处理中断的过程称为中断响应中断处理结束之后恢复原来程序的执行被称为中断返回

    一个计算机系统提供的中断源的有序集合一般被称为中断字,这是一个逻辑结构,在不同的处理器有着很不相同的实现方式。在一台计算机中有多少中断源,是根据各个计算机系统的需要安排的。 Intel的x86微处理器能处理256种不同的中断。

    为了使得中断装置可以找到恰当的中断处理程序,专门设计了中断处理程序入口地址映射表,又称中断向量表。表中的每一项称为一个中断向量,主要由程序状态字PSW和指令计数器PC的值组成。不同性质的中断源需要用不同的中断处理程序来处理,也就是对应不同的中断向量。通过中断向量,可以找到中断处理程序在内存中的位置。

    中断技术解决了主机和外设并行工作的问题,消除了因外设的慢速而使得主机等待的现象,为多机操作和实时处理提供了硬件基础。一般来说中断具有以下作用。

    能充分发挥处理器的使用效率。因为输入输出设备可以用中断的方式同处理器通信,报告其完成处理器所要求的数据传输的情况和问题,这样可以免除处理器不断地査询和等待,从而大大提高处理器的效率。

    提高系统的实时能力。因为具有较高实时处理要求的设备,可以通过中断方式请求及时处理,从而使处理器立即运行该设备的处理程序(也是该中断的中断处理程序)。所以目前的各种微型机、小型机及大型机均有中断系统。

    从用户的角度来看,中断正如字面的含义,即正常执行的程序被打断,当完成中断处理后再恢复执行。这完全由操作系统控制,用户程序不必做任何特殊处理。这一过程可以用图24示意。

    (2)异常

    最早中断和异常并没有区分,都把它们叫作中断。随着它们的发生原因和处理方式的差别愈发明显,才有了现在的中断和异常之分。

    中断是由外部事件引发的,而异常则是由正在执行的指令引发的

    2、中断与异常的分类

    无论是哪种计算机都有很多中断源,不同的系统依据这些中断源引起的中断特点等方面的不同,划分为若干个不同中断类型。这种分类在不同的系统中往往差异比较大。

    典型的中断包括

    1)时钟中断,由处理器内部的计时器产生,允许操作系统以一定规律执行函数,如时间片到时、硬件实时钟到时等;

    2)输人输出(IO)中断,由LO控制器产生,用于通知一个L/O操作的正常完成或者发生的错误;

    3)控制台中断,如系统操作员通过控制台发出命令等;

    4)硬件故障中断,由掉电、存储器校验错等硬件故障引起等

    异常发生的时间以及位置具有确定性,典型的异常包括:

    1)程序性中断,在某些条件下由指令执行结果产生,例如算术溢出、被零除、目态程序试图执行非法指令、访问不被允许访问的存储位置、虚拟存储中的缺页等;

    2)访管指令异常,目的是要求操作系统提供系统服务。

    由于中断与异常的硬件机制工作原理类似,为方便起见,之后的叙述中以中断涵盖两个概念

    二、中断系统

    中断系统是现代计算机系统的核心机制之一,它不是单纯的硬件或者软件的概念,而是硬件和软件相互配合、相互渗透而使得计算杋系统得以充分发挥能力的计算模式。

    中断的发生会激活很多事件,这包括硬件和软件的方面的事件,所以对于整个中断事件的接收、响应和处理需要有计算机的硬件和软件两方面的配合,共同完成。

    可以把中断系统分为两大组成部分:中断系统的硬件中断装置和软件中断处理程序。硬件中断装置负责捕获中断源发出的中断请求,并以一定的方式响应中断源,然后将处理器的控制权移交给特定的中断处理程序。中断处理程序则针对对中断事件的性质而执行相应的系列操作。

    1、中断请求的接收

    中断系统如何接收中断源的中断请求,这往往因机器而异。不过从原理上讲,它们是通过在计算机硬件的中断逻辑线路和中断寄存器实现的

    中断逻辑线路用于接收中断信号,并把收到的中断信号寄存在线路中的硬件触发器中。在中断逻辑线路中有若干个专门接受中断信号的触发器,每个触发器称为一个中断位。通常规定,一个触发器的值为1时,表示该触发器收到中断信号,为0时表示无中断信号。这些触发器的全体称为中断寄存器,所以中断寄存器是由若干个中断位组成的。

    在有的计算机中,为了不丢失和区分每个中断信号,对每个中断源都用一个固定的触发器来寄存中断信号。而在有的计算机中,对某些没有得到响应的、不重要的中断信号,就不予保存下来,而把它丢弃掉。

    2、中断响应

    中断请求的响应机制如下。处理器的控制部件中设置有中断信号扫描结构,它在每条指令执行周期内的最后时刻扫描中断寄存器,查看是否有中断信号到来。若无中断信号,处理器就继续执行下一条指令。若有中断到来,处理器接收由硬件中断装置发来的中断向量代号。

    接着,处理器开始为后续的软件处理中断做必要的准备工作:保存中断点的程序执行上下文环境(又称保存现场)。这是因为中断处理结束之后,处理器还要继续被中断程序的执行,所以原有中断点程序执行的所有必要信息都必须保存下来。这个上下文环境通常包括程序状态字PSW、程序计数器PC中的下一条指令位置和一些寄存器的值。它们一般保存在个专门的系统堆栈中。处理器状态此时被切换到管态。

    处理器根据中断向量代号查询中断向量表,获得与该中断源相联系的中断处理程序的入口地址,并将PC置成该地址。随后控制权转移到中断处理程序。

    整个中断请求的响应过程,如图25所示。

    图25中的中断请求响应的工作过程是:

    ①处理器接收中断信号;

    ②保护现场,将中断断点的程序状态字PSW和程序计数器PC值存入系统堆栈;

    ③分析中断向量,取得中断处理程序的入口地址;

    ④将处理器的PC值置为中断处理程序的入口地址;

    ⑤调用中断处理程序。

    3、中断处理

    这里讨论在中断信号已经被中断系统的硬件中断装置接收和响应之后,对应的软件中断处理程序进行中断处理的具体过程

    在处理器的控制权转移到中断处理程序之后,中断处理程序开始工作,其中包括检查I/O相关的状态信息,操纵I/O设备或者在设备和内存之间传送数据等。具体的中断处理程序的内容,完全是依据中断请求的类别和要求的不同,而分别设计的。

    在中断处理程序结束工作之后,处理器会检测到一条中断返回指令。在执行中断返回指令时,处理器会把原先被中断的程序的上下文环境从系统堆栈中恢复。处理器状态也从管态恢复成被中断时的目态。整个中断处理结束。处理器开始一个新的指令周期,继续执行原来被中断的程序。

    上述整个中断信号的接收、响应和处理过程,可以简要地归纳为:接收和响应中断,保护中断断点现场,分析中断向量,调用中断处理程序,中断处理结束恢复现场,原有程序继续执行

    4、几种典型中断的处理

    这里介绍几种计算机系统中比较典型的中断处理,包括I/O中断、时钟中断、硬件故障中断、程序性中断和系统服务请求(自愿性中断)

    (1)I/O中断

    I/O中断一般由I/O设备的控制器或者通道发出。I/0中断通常可分成两大类:I/O操作正常结束以及I/O异常。对于前者来说,如果要继续进行I/O操作,则需要在准备好以后重新启动I/O。若请求I/O的程序正处于等待I/O的状态,则应该将其唤醒。对于后者,常常需要重新执行失败的I/O操作,不过这个重试的次数常常有一个上限,因为错误可能由硬 件损伤引起,当重试次数过大的时候,系统将判定硬件故障,并通知管理员。

    比如,我们平常在PC上用 CD-ROM观看VCD或DVD的碟片时,有时会碰到读碟出错。在重复读碟几次之后,如果读碟岀错继续,系统就会停止读碟,并报告岀错,甚至退岀碟片。

    (2)时钟中断

    时钟中断是计算机系统多道能力的重要条件之一(有关时钟的概念,参看本章的后面部分)。时钟中断处理程序通常要做较多的与系统运转、管理和维护相关的工作,它们对于整个系统是非常重要的,主要内容如下。

    维护软件时钟。系统有若干个软件时钟,控制着定时任务以及进程的处理器时间配额,时钟中断需要维护,定时更新这些软件时钟。

    处理器调度。维护当前进程的时间片软件时钟,并在时间片到时后运行调度程序选择下一个被调度的进程。

    控制系统定时任务。通过软件时钟和调度程序定时激活一些系统任务,例如监测死锁、进行系统记账、对系统状况进行审计等。

    实时处理,例如产生系统“心跳”,激活系统看门狗等。

    当然,在不同的操作系统设计中,时钟中断处理的内容也不一样。很多系统的时钟中断通常只处理软件时钟,并在一定条件下激活系统调度程序。

    一般来说,调度程序并不在时钟中断里,因为时钟中断的优先级往往比较高,而且频繁发生,如果时钟中断处理时间过长,就会使一些较低优先级的中断丢失。

    (3)硬件故障中断

    硬件故障一般是由硬件的问题引起的,排除此类故障通常需要人工的干预,例如复位硬件或者更换设备等。

    硬件故障中断处理程序需要做的工作是保存现场,使用一定的手段警告管理员并提供些辅助的诊断信息。此外在高可靠的系统中,中断处理程序还需要评估系统的可用性,并尽可能地恢复系统。

    例如,使用 WindowsXP的系统在关键硬件发生故障时,会出现系统蓝屏死机。这时操作系统实际上进入了相应的故障处理程序,并发现这个故障是不可恢复的,于是在屏幕上打印出了发生故障时的程序位置(通常在某个管态驱动程序中),并且开始进行内存转储(将定范围的内存内容写到磁盘上去,实际上是系统发生故障时的全系统“快照”),以备日后进行程序调试级故障诊断。

    (4)程序性中断

    程序性中断多数是程序指令出错、指令越权或者指令寻址越界而引发的系统保护。它的处理方法可以依据中断是否可以被用户程序自行处理,而分成两类。

    第一类为程序性中断,只能由操作系统完成。这种情况多为程序试图做自己不能做的操作引起的系统保护,例如访问合法的但是不在内存的虚地址引发的缺页中断等。这时候的处理一般由操作系统的相关扩展功能模块完成。

    第二类为程序性中断,可以由程序自己完成。例如一些算术错误。因为不同的程序可能有不同的处理方法,所以很多操作系统提供由用户自行处理这类中断的“绿色通道”。一般来说,系统调试中断,如断点中断、单步跟踪等,用以支持各种程序的调试,是可以被用户程序处理的。

    (5)系统服务请求(自愿性中断)

    系统服务请求一般由处理器提供的专用指令(又称访管指令)来激发。例如x86处理器提供int指令,用来激发软件中断,其他的不少处理器则专门提供系统调用指令 syscall执行这些指令的结果是系统被切换到管态,并且转移到一段专门的操作系统程序处开始执行。这种指令的格式通常是指令名加上请求的服务识别号(有时是中断号)。操作系统利用处理器提供的这种接口建立自己的系统服务体系。处理器一般不负责定义系统调用所传递的参数格式。因为不同的系统会提供不同的系统调用,而不同的系统调用需要不同的参数,所以给系统服务例程传递什么样的参数,以及如何传递这些参数都由操作系统规定。

    这方面的实例可以看一下 MS-DOS定义的2h号中断的系统服务功能以及参数列表,这可以在有关MS-DOS程序设计的书的附录中查到。

    现代操作系统一般不会提供直接使用系统调用指令的接口,通常的做法是提供一套方便、实用的应用程序函数库(又称为应用程序设计接口API。这些函数从应用的较高层面重新封裝了系统调用,一方面屏蔽了复杂的系统调用传参问题(用汇编语言传参),另一方面是高级语言接口,有助于快速开发。还有的系统在更高层面提供了系统程序设计的模板库和类库。

    三、中断优先级、中断屏蔽与中断嵌套

    1.多级中断与中断优先级

    现代的微处理器都提供有多级中断系统,从硬件上看,多级中断系统表现为有多根中断请求线从不同设备连接到中断逻辑线路上。连接在不同中断请求线上的中断信号,表示它们有不同的中断级别。中断信号的级别代表了该中断信号是否具有被优先处理的特权,以及这个特权的大小。可见,在多级中断系统中,硬件决定了各个中断的优先级别。

    多级中断的第一个作用是,对各类中断信号依据其紧急程度和重要性划分级别。在需要处理的各类中断信号中,它们的紧急程度和重要性是不同的。系统当然应该优先处理最紧急的或者最重要的中断信号。而中断信号本身的紧急或重要性,则由该中断的级别的高低来标识。在多级中断系统中,在同时有多个中断请求时,处理器接收中断优先级为最高的中断(如果其中断优先级高于当前运行程序的中断优先级时),而忽略其中断优先级较低的中断。比如,计算机的电池即将没有电了,这种掉电中断显然应该有非常高的优先级别。

    多级中断的第二个作用是,解决如果有重要程度相当的多个中断信号同时到达时,如何选择首个被处理的中断信号的问题。比如,在一套计算机系统上接有一台打印机和一台扫描仪,在打印机发出了打印完毕的信号的同时,扫描仪也发出了扫描完毕的信号。在一般情况下,这两个中断信号具有同等的优先级。

    如果在同一中断级中的多个设备接口中同时都有中断请求时,一般有两种办法可以采用

    1)固定的优先数:给每个设备接口安排一个不同的、固定的优先顺序。比如以该设备在总线中的位置来定优先顺序,离处理器近的设备,其优先数高于离处理器远的设备。

    2)轮转法:用一个表格,依次轮转响应,这是一个较为公平合理的方法。

    2、中断屏蔽

    在整个中断系统中,可以允许或者禁止中断系统对某些类别中断的响应。我们已经知道,在程序状态字PSW中设计有中断屏蔽位,主机是否允许响应或禁止某些中断,则由PWS中的中断屏蔽位决定,这些屏蔽位标识了被屏蔽的中断类或者中断。

    一旦某个I/O中断被程序状态字PSW中的中断屏蔽位加以屏蔽,那么此时即使有I/O中断信号,处理器也不予响应。

    对于被屏蔽的中断信号,通常仍然保存在中断寄存器中,有些可以在以后继续响应,而有些将被简单地丢弃。

    很显然,有了中断屏蔽,中断系统中原先由硬件事先给定的中断优先级,就可能发生改变。例如,在一个计算机系统中,由CD-ROM到硬盘的数据传送的优先级别低于硬盘内部的数据操作。但是,如果一旦机器正在进行 CD-ROM到硬盘的数据传送,对硬盘内部的其它数据操作就被暂时屏蔽,这些硬盘操作必须在该 CD-ROM到硬盘的数据传送结束之后才能进行。换句话说,此时 CD-ROM到硬盘的数据传送的优先级别高于硬盘内部的数据操作。

    还有一类中断信号是不可屏蔽的,一般这类中断信号属于机器故障中断。比如内存奇偶校验错,以及掉电等使得机器无法继续操作一类的故障。一旦发生这类不可屏蔽的中断,不管管程序状态字中的屏蔽位是否建立,处理器都要立即响应这类中断,并进行处理。

    3、中断嵌套

    一般的计算机系统中都有多个中断源,在这样的系统中,如果一个中断的处理过程中又发生了中断,那么将引起多个中断处理问题。对多个中断的处理策略一般有如下两种。

    对于多个中断进行处理的第一种策略是,正当处理一个中断时禁止其他中断,此时系统将对任何新发生的中断置之不理。在这期间发生的中断将保持挂起状态。当处理器再次允许中断时,这个新的中断信号会被处理器检测到,并做出处理。

    这种处理方法可以用软件简单地实现,只要在任何中断处理之前使用禁止中断指令,在处理结束之后,再使用开放中断指令就可以了。这样,所有的中断将严格地按照发生的顺序被处理。不过,这样的处理策略没有考虑到中断信号的紧急程度,无法达到比较严格的中断处理时间要求。

    对于多个中断进行处理的第二种策略是中断嵌套。即中断按照优先度分级,允许优先级较高的中断打断优先级较低的中断处理过程,于是引起中断处理的嵌套,如图26所示。

    只要合适地定义中断的优先级别,第一种策略的弊端大都可以被第二种中断嵌套策略所克服。

    由于在中断嵌套中优先级较高的中断可以打断优先级较低的中断处理过程,因此必须把优先级较低的中断处理过程的现场也保存起来。这些被保护现场的次序,与恢复现场的次序正好相反,所以应该采用堆栈作为现场保护区 域。堆栈应该处于系统空间中,以防止被破坏,又称为系统堆栈。

    在中断发生时,硬件中断装置将程序状态字PSW、指令计数器PC的值以及其他重要现场信息压入系统堆栈。如果发生中断嵌套,被中断的处理的程序状态字PSW、指令计数器PC的值,以及其他重要现场信息也被压入系统堆栈。

    每发生中断嵌套一次,就保护一次被中断的处理过程的现场,进行相关的压栈操作。而每结束一层嵌套的处理时,就从系统堆栈中弹出对应的程序状态字PSW、指令计数器PC的值以及其他重要现场信息,逐层恢复现场。

    作为中断嵌套策略的一个例子,考虑在一个系统中存在总线、硬盘以及扫描仪三个设备同时操作时的处理情况。假定三者的中断优先级依次分别为9、5、3,其中数字大的具有较高的优先级。扫描动作的处理从某个时间开始,它的处理时间较长,其间发生了一次网络数据的传送请求,于是扫描仪中断处理被打断,处理器转而去处理网络通信时的总线服务请求。在处理网络通信的总线服务请求期间,用户恰好提交了一个硬盘存储文件的请求。但是因为硬盘中断优先级较低,于是硬盘中断的处理就被推迟到总线请求处理完之后,同时由于它的优先级高于扫描仪的中断,所以对硬盘中断的处理优先于对扫描仪中断的处理。在硬盘中断处理完毕之后,处理器才回到原先对扫描仪中断处理的程序上。这个中断处理的过程中发生了三重中断嵌套。

     

    展开全文
  • 51单片机中断课件.pdf

    2022-06-19 12:09:06
    电脑鼠走迷宫创新实验室 培训 第七讲 单片机的中断应用 主讲人:赵牧天 2015-12-13 一、中断的概念 2015-12-13 一、中断的概念 引起CPU中断的根源,称为中断源(中断发生)。中断 源向CPU提出的中断请求。CPU暂时...
  • 中断中断处理流程

    千次阅读 2020-12-20 04:41:20
    发出这样的信号称为进行中断请求(interrupt request,IRQ)。硬件中断导致处理器通过一个上下文切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为CPU指令集中的一...
  • 中断系统.pdf

    2019-09-01 09:43:43
    或由程序的预先安排,引起CPU暂时中断当前程序的 运行而转去执行为内部/外部事件或预先安排的事件 服务的子程序,待中断服务子程序执行完毕后,CPU 再返回到暂停处(断点)继续执行原来的程序。  实现中断功能的...
  • 1.什么是中断 先举一个一个例子说明,当你正在处理A事情的时候,这时候发生了...(1)中断源:可以引起中断的事情称为中断源。51单片机有5个中断源,分2个优先级,这5个中断源按自然优先级从高到低依次是:外部中断
  • C51中断讲解

    2021-06-01 23:28:10
    待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。...
  • STM32的"异常“、“中断”和“事件”区别和理解

    千次阅读 多人点赞 2018-01-18 11:34:35
    1 异常与中断(Cortex-M3)1.1 异常与中断原话: Cortex‐M3 在内核水平上搭载了一个异常响应... 所有能打断正常执行流的事件称为异常。异常的概念包含中断的概念,即中断是异常的子集。异常与中断都是硬件支持的
  • 计算机原理之中断简介

    千次阅读 2020-06-21 18:23:07
    • 当CPU正在正常运行时,外部发生的某一随机事件请求CPU去处理,于是CPU暂时中止现行程序的运行而处理所发生的事件,处理完毕后,再回到原来中止的地方继续执行,这种能力和行为称为中断。系统为实现中断而采取的...
  • 中断优先级

    千次阅读 2021-07-25 04:32:43
    为使系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性和紧迫程度,硬件将中断源分为若干个级别,称作中断优先级。在实际系统中,常常遇到多个中断源同时请求中断的情况,这时CPU必须确定首先为哪...
  • 中断类型分析

    千次阅读 2020-07-18 16:06:49
    中断类型分析 IBM公司的机器,通常把中断源分为6类:  1.重新启动中断  这是为操作人员重新启动一个重新用的,在一般情况下,处理机不能禁止这类中断。...程序性错误引起中断  主要包括指令或数
  • 简单来讲,就是外设请求或人为干预等当前执行指令之外的因素所引起中断。 二、内中断中断也常称作异常(exception),指的是CPU执行当前指令时所发生的中断,一般分为两种: 1.自愿中断。比如当前执行的是trap...
  • stm32异常、中断事件的区别

    千次阅读 2019-08-20 09:36:28
    异常是指由于CPU本身故障、程序故障或者请求服务等引起的错误,异常属于不正常现象。 Cortex-M3内核总共支持256个中断,其中包含16个内核异常和240个外部中断,但是各个芯片产商在设计芯片的时候会对CM3内核的芯片...
  • 硬件中断,软件中断

    千次阅读 2020-08-10 09:54:21
    二、原因 一般来说,软中断是由内核机制的触发事件引起的(例如进程运行超时),但是不可忽视有大量的软中断也是由于和硬件有关的中断引起的,例如当打印机端口产生一个硬件中断时,会通知和硬件相关的硬中断,硬...
  • 操作系统-中断机制

    千次阅读 2020-05-28 22:13:23
    所以也有人把操作系统称为是由“中断驱动”或者“(中断)事件驱动”的。由于中断机制的实现必须依靠相关的硬件支持,所以硬件中断装置是操作系统运行环境中的一个极为重要的组成部分。中断的实现是硬件中断装置和相应...
  • 如果要你讲一下中断,你会怎么去描述一个中断的触发流程呢? 最基础的可能就是:保护现场 - 中断处理 - 恢复现场... 那保护现场做了什么事情?中断处理需要注意什么事情?恢复现场又做了什么事情? 相对应的,...
  • 中断系统

    千次阅读 2015-07-05 15:47:10
    中断:CPU中止正在执行的程序,转去处理随机提出的要求,待处理完后,再回到原先打断的程序继续恢复执行的过程称为中断。 响应和处理各种中断的软硬件的总体称为中断系统,它是计算机系统的重要组成部分。中断系统...
  • 第五章 中断系统;本章重点; 中断是指在计算机执行过程中当出现...5.2 中断的基本概念 通常将CPU在正常情况下运行的程序称为主程序把引起中断的设备或事件叫做中断源由中断源向CPU发出的请求中断信号称为中断请求信号C
  • 中断之访管中断

    千次阅读 2021-05-20 19:46:08
    中断:CPU中止正在执行的程序,转去处理随机提出的请求,待处理完后,再回到原先打断的程序继续回复执行的过程。 访管指令:访管指令是一条可以在目态下执行的指令,用户程序中凡是要调用操作系统功能时就安排一...
  • 51单片机之中断实验

    千次阅读 2019-11-07 21:48:34
    中断是指CPU在执行当前程序的过程中,由于某种随机出现的外设请求或CPU内部的异常事件,使CPU暂停正在执行的程序而转去 执行相应的服务处理程序;当服务处理程序运行完毕后,CPU再返回到暂停处继续执行原来的程序。 ...
  • 学习单片机一贯的套路,搞完时钟和GPIO就要折腾中断了。...1.2 异常是指由于cpu本身故障、程序故障或者请求服务等引起的错误,异常属于不正常现象。 Cortex-M3内核总共支持256个中断,其中包含16个内核异常和
  • 定时器中断实验

    2012-01-31 22:12:14
    引起中断的原因或发出中断请求的来源,称为中断源。 单片机一般允许有多个中断源,当几个中断源同时向CPU请求中断时,就存在CPU优先响应哪一个中断请求源的问题(优先级问题),一般根据中断源的轻重缓急排队,优先...
  • 【计算机组成原理】CPU中断系统

    千次阅读 2022-02-07 12:51:08
    1、引起中断的各种因素 (1)人为设置的中断 这种中断一般称为自愿中断,因为它是程序中人为设置的,故一旦机器执行这种人为中断,便自愿停止现行程序而转入中断处理。 (2)程序性事故 如定点溢出、浮点溢出...
  • 中断中断的应用

    千次阅读 2019-12-01 23:03:31
    什么是中断? 一个程序只会做自己的事情,当需要输入或者输出时就要用到外部设备,而外部设备相比于处理器要慢得多。在等待的时候,处理器只能不停的观察外部设备的状态变化。 为了能够更加高效的运用硬件资源,...
  • 中断通常定义为一个事件,该事件能够改变处理器执行指令的顺序。 1.1 操作系统中断举例 计算机操作系统自然离不开外部设备:鼠标、键盘、网卡、磁盘等等。 就拿网卡来讲,我计算机并不知道时候数据包会来到,我能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,330
精华内容 21,732
关键字:

引起中断的事件被称为