精华内容
下载资源
问答
  • stm32f103中断系统的C语言库函数实现1.嵌套向量中断控制器NVIC一、pandas是什么?二、使用步骤1.引入库2.读入数据总结欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,助于目录的生成如何改变文本的样式...

    1.了解中断

    说到中断就必须要说为什么要中断; 中断即是中途断开,去做更重要的事。过程分为四步:

    1.中断请求(中断源对主程序(单个中断)或者对中断服务程序(前面已经发生了中断,再次遇到中断)提出中断要求)

    2.中断响应(是一个过程,收到中断请求后,由系统自动跳转到中断向量地址(一般是固定的),根据中断向量处的指令跳转到中断服务程序入口地址。C语言的库函数已经规定好响应外设的中断服务程序名,调用,在函数内编写相应的中断服务程序即可)

    3.中断服务(执行中断服务程序)

    4.中断返回(返回主程序或者次级中断服务程序)

    中断功能很好(大大提高了计算机的运行的效率(“同时”处理很多事)和实时性(中断来了可以很快得到处理))。

    stm32的中断性能就非常棒。STM32F10x系列最多有84个中断,当然,不是所有中断都可以被我们配置,少部分中断是系统的必要操作,比如复位、硬件失效、时钟安全系统等。但大多数中断是让用户配置的。
    以STM32F103为例,可配置(屏蔽)的中断有60个。

    2.嵌套向量中断控制器NVIC

    嵌套-即中断的嵌套,我们知道计算机的运行都是逻辑性特别强的,那么中断的嵌套也一定有一个规则来定义。在STM32中,把中断分为抢占优先级(打断其他中断的能力强弱,数值越小,优先级越高)和响应优先级,判断两个中断的优先级先看相应优先级,如果抢占优先级相同,就看响应优先级的高低(优先级数值越小,优先级越高),如果都相同,则比较中断向量地址(中断产生后自动跳转的地址,在程序中是固定的,不用设定)。
    我们的NVIC就是来定义中断的优先级的。说到这里我们还需要知道一种寄存器组(多个同类寄存器)-中断优先级寄存器组,在STM32F103系列中有15个这样的寄存器,一个寄存器为32位。一个中断(对了,我们这里的中断说的都是可屏蔽中断,也就是可以设置的中断)由8位控制,因此一个寄存器可以控制4个可屏蔽中断,一共有15x4=60 个可屏蔽中断。具体到单个8位中,只有高四位是有用的,通过这4位可以将中断优先级分为5组,分别为0、1、2、3、4、5组

    组别 优先级分配
    0 0位抢占优先级、4位响应优先级
    1 1位抢占优先级、3位响应优先级
    2 2位抢占优先级、2位响应优先级
    3 3位抢占优先级、1位响应优先级
    4 4位抢占优先级、0位响应优先级

    (注:”位“代表二进制位数,“级”代表优先级的高低。0位代表在此组中可以设置的该种(抢占或者响应)优先级没有202^{0}=1,全都一样相当于没有,不可以设置。1位代表可以设置的优先级可以为 212^{1},可以为0级和1级,以此类推)

    3、外部中断/事件控制器EXTI

    在这里插入图片描述
    STM32提供19个中断通道,其中16个可供用户自由支配,分别为EXTI0~EXTI15通道,EXTI16-EXTI18通道分配给了STM32的RTC,PVD以及USB的使用。其主要特性如下:

    1.每个中断事件都有独立的触发为和屏蔽位。
    2.每个中断通道都有专门的状态位。
    3.支持多达19个中断源请求。
    4.可以检测到脉冲宽度低于APB2时钟宽度的外部信号。

    外部中断信号从I/0口进入,可设置位上升沿有效,下降沿有效或者上升沿+下降沿有效。随后与软件中断寄存器相应位进行逻辑或运算。之后的信号便分为两路。途中上路信号为中断请求,下路信号为事件请求。两个请求有效的前提是中断屏蔽寄存器和事件屏蔽寄存器中相应位要置1。
    (这里注意一下挂起寄存器,每次中断服务函数执行完后需要将其清零,不然会一直产生中断请求)

    4.中断流程

    Created with Raphaël 2.2.0开始RCC配置NVIC配置GPIO配置中断通道配置EXTI配置等待中断触发

    4.1 RCC配置

    功能:设置系统各个部分的时钟,是一个最基本的设置
    代码如下:

    void RCC_Configuration(void)
    {
        {  /*此大括号内的内容如果在时钟系统完整的单片机上可以按照默认值,不用特意设置*/
           ErrorStatus HSEStartUpStatus;  /*定义枚举类型变量 */
                                          /* HSEStartUpStatus */
           RCC_DeInit();        /*系统复位时钟设置
           RCC_HSEConfig(RCC_HSE_ON);
           HSEStartUpStatus = RCC_WaitForHSEStartUP();
           if(HSEStartUpStatus == SUCCESS)
           {
             RCC_HCLKConfig(RCC_SYSCLK_Div1);
             RCC_PCLK2Config(RCC_SYSCLK_Div1);
             RCC_PCLK1Config(RCC_SYSCLK_Div1);
             FLASH_SetLatency(FLASH_Latency_2);
             FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
             RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
             RCC_PLLCmd(ENABLE);
             while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
             RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
             while(RCC_GetSYSCLKSource()!=0X08);
           }  
        }
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE)
    }
    

    4.2 NVIC设置

    void NVIC_Configuration(void)
    {
       NVIC_InitTypeDef NVIC_InitStructure;
       #ifdef VECT_TAB_RAM
       NVIC _SetVectorTable(NVIC_VectTab_RAM,0x0);
       #else 
       NVIC _SetVectorTable(NVIC_VectTab_FLASH,0x0);
       #endif
       NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
       NVIC_InitStructure.NVIC_IRQChanel = EXTI0_IQRn;
       NVIC_InitStructure.NVIC_IRQChanelPreemptionPriority = 2;
       NVIC_InitStructure.NVIC_IRQChanelSubPriority =0;
       NVIC_InitStructure.NVIC_IRQChanelCmd = ENABLE;
       NVIC_Init(&NVIC_InitStructure);   
    }
    

    4.3 GPIO设置

    void GPIO_Configuration(void)
    {
       GPIO_InitTypeDef GPIO_InitStructure;
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
       GPIO_Init(GPIO,&GPIO_InitStructure);
       GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
       GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);
    }
    

    4.4 中断通道设置

    void USART_Configuration(void)
    {
      USART_InitTypeDef USART_InitStructure;
      USART_InitStructure.USART_BaudRate = 115200;
      USART_InitStructure.USART_WordLength = USART_WordLength_8b;
      USART_InitStructure.USART_Parity = USART_StopBits_1;
      USART_InitStructure.USART_HardwareFlowContrl = USART_HardwareFlowControl_None;
      USART_Init(USART1,&USART_InitStructure);
      USART_Cmd(USART1,ENABLE);
      
    }
    

    4.5 EXTI设置

    void EXTI_IQRHandler()
    {
       EXTI_InitTypeDef EXTI_InitStructure;
       EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;
       EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
       EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
       EXTI_InitStructure.EXTI_LineCmd = ENABLE;
       EXTI_Init(&EXTI_InitStructure);
    }
    

    5.总结

    中断的实现最基本的是要设置时钟,然后就是设置要用到的I/O口,进行输入输出和中断功能、复用功能的配置。接着就是用NVIC给中断源(0~19)进行优先级分配。然后设置你要控制的设备。最后设置EXTI。

    展开全文
  • 中断在linux驱动中占有很重要的地位,所以也一定要好好分析一下。还是一样的套路,先讲一下基本的概念,然后分析源码再来...  那中断向量怎么来得呢,其实每一种中断(异常)都会对应一个中断向量号,具体哪些中断
  • 8086中断系统简答

    千次阅读 2019-11-30 19:06:08
    中断系统应该具备什么功能? CPU暂停执行现行程序,转而处理随机事件,处理完毕后再返回中断的程序,这以过程称为中断。 能够引发CPU中断的信息源,称为中断源。 中断系统应具备以下功能: 为了加强中断系统的灵活...
    (1)、什么是中断?什么是中断源?中断系统应该具备什么功能?
    1. CPU暂停执行现行程序,转而处理随机事件,处理完毕后再返回中断的程序,这以过程称为中断。
    2. 能够引发CPU中断的信息源,称为中断源。
    3. 中断系统应具备以下功能:
      • 为了加强中断系统的灵活性,对于硬件设备的中断请求,应当具有屏蔽和开放的性能,使得程序员能够灵活控制。
      • 能实现"中断判优"即中断源排队,当有多个中断源提出请求时,能够优先响应高级别得中断。
      • 能够实现中断嵌套,即较高级别得中断源能够中断较低级别得中断服务程序。
      • 系统响应中断后,能够自动转入中断处理,中断处理结束后,能自动返回。
    (2)、什么是中断向量?存放15H型中断的中断向量的地址是多少?
    1. 中断向量是实模式下中断服务程序的入口地址,由两部分组成:
      • 服务程序所在代码段的段地址。
      • 服务程序入口的偏移地址。
    2. 15H * 4=54H,因此存放15H型中断的中断向量的地址为:54H~47H。
    (3)、CPU响应可屏蔽中断的条件是什么?
    1. INTR引脚有中断请求,NMI引脚没有中断请求,系统没有DMA请求。
    2. CPU当前指令执行完毕。
    3. CPU处于开中断状态(I标志=1)。
    (4)、CPU在什么条件下响应非屏蔽中断请求?
    1. NMI引脚有中断请求,系统没有DMA请求。
    2. CPU当前指令执行完毕。
    (5)、请叙述PC系统硬件中断和软件中断的不同之处。
    1. 中断的引发方式不同。硬件中断是由CPU以外的硬件设备发出中断请求(接到引脚INTRNMI)引发的;而软件中断是由CPU执行INT n指令而引发的.
    2. CPU获取中断类型码的方式不同:响应硬件可屏蔽中断后,中断类型码是由8259A提供的;响应软件中断时,中断类型码是由软件中断指令INT n本身提供的。
    3. CPU响应的条件不同:CPU只有在开中断时,才能响应硬件可屏蔽中断,响应软件中断不受此限制。
    4. 中断处理程序的结束方式不同。在硬件可屏蔽中断服务程序中,中断处理结束后,需要做两件事:
      • 8259A发出中断结束命令,8259A收到此命令后将ISR寄存器中的相应位清零,结束中断。
      • 执行IRET指令,中断返回。
    (6)、实模式下,什么是中断向量?中断向量由哪些部分组成?什么是中断向量表?
    1. 中断向量是实模式下中断服务程序的入口地址。
    2. 中断向量由两部分组成:
      • 服务程序在代码段的基地址(2个字节)。
      • 服务程序入口的偏移地址(2个字节)。
    3. 每个中断向量为4个字节,最多共有256种中断,因此中断向量共占用1024个字节,在实模式下,CPU规定中断向量集中存放在系统RAM最低端的1024个单元中,这就是中断向量表。
    (7)、解释INTRINTA的作用。中断响应周期中,第一个INTA脉冲有什么作用?第二个脉冲呢?

    INTR是CPU接收可屏蔽中断请求信号的引脚,INTA8259A接收CPU发出的中断响应信号的引脚。8259A接收到第一个INTA脉冲后,将中断服务寄存器中与被选中的中断源对应的那一位置1,同时把中断请求寄存器中的相应位清零,表示当前中断请求已经被相应;8259A 接收到第二个INTA脉冲后把选中中断源的中断类型码n通过数据线发送往CPU。

    (8)、在PC中如何使用”用户中断“入口请求中断和进行编程?

    PC中分配给用户的中断是IRQ9,经扩展ISA总线插槽B4端子引出,故把用户的中断请求线连接在B4上。在应用程序中,利用25H号系统调用将中断服务程序的入口地址写入对应0AH类型中断对应的中断向量表中去。在应用程序中把主片8259A中断屏蔽寄存器的D2清零,把从片8259A中断屏蔽寄存器的D1清零,使主片的IR2、从片的IR1可以输入中断请求。如果用户中断使用的中断类型为0AH,中断服务程序结束前向主片8259A发送中断结束命令,应用程序结束前回复主片8259AIR2和从片8259AIR1屏蔽状态,关闭用户请求并恢复中断向量表状态。

    (9)、8259A中断向量控制器的功能是什么?

    8259A中断控制器可以接受8个中断请求输入并将他们寄存,对8个请求输入进行优先级判断,裁决出最高优先级进行处理,它可以支持多种优先级处理方式。8259A可以对中断请求输入进行屏蔽,阻止对其进行处理。8259A支持多种中断结束方式。8259A与微处理器连接方便,可提供中断请求信号及发送中断类型码。8259A可以进行级联以便形成多于8级输入的中断控制系统。

    (10)、8259A初始化编程过程完成哪些功能?这些功能由哪些ICW设定?

    初始化编程用来确定8259A的工作方式。ICW1确定8259A工作的环境:处理器类型、中断控制器是单片还是多片、请求信号的电特性。ICW2用来 指定8个中断请求的类型码。ICW3在多片系统中确定主片与从片的连接关系。ICW4用来确定中断处理的控制方法:中断结束方式、嵌套方式、数据缓冲等。

    (11)、8259A的初始化命令字和操作命令字有什么区别?他们对应于编程结构哪些内部寄存器?
    1. 8259A的工作方式通过微处理器向其写入初始化命令字来确定。初始化命令字分别装入ICW1~ICW4内部寄存器。
    2. 8259A在工作过程中,微处理器通过向其写入操作命令字来控制它的工作过程。操作命令字分别装入OCW1~OCW3内部寄存器中。
    3. 8259A占用两个端口号,不同的命令字对应不同的端口,再加上命令字本身的特征位及加载的顺序就可以正确地把各种命令字写入对应的寄存器中。
    (12)、8259A的中断屏蔽寄存器IMR与8086中断允许标志IF有什么区别?

    IF是8086内部标志寄存器的一位,若IF=0,8086就不响应外部中断可屏蔽中断请求INTR引线上的请求信号。8259A有8个中断请求输入线,IMR中的某位为1,就把对应该位的中断源的中断请求屏蔽,无法被8259A处理,也无法向8086处理器产生INTR请求。

    展开全文
  • 看过Cortex-m3/m4操作系统RTOS内核代码的伙伴们都知道,OS中的任务调度实现方式如下: 1、开启SysTick中断,也就是系统滴答定时器中断。然后在SysTick中断中触发PendSV中断,实际的任务切换是在PendSV的中断服务函数...

    问题:

    看过Cortex-m3/m4操作系统RTOS内核代码的伙伴们都知道,OS中的任务调度实现方式如下:
    1、开启SysTick中断,也就是系统滴答定时器中断。然后在SysTick中断中触发PendSV中断,实际的任务切换是在PendSV的中断服务函数中完成的。
    2、PendSV的中断服务函数一般用汇编来写。
    那为什么不直接在SysTick的中断服务函数里完成任务切换呢?
    其中原因如下:

    原因:

    1.在SysTick中断里完成任务切换会降低操作系统的实时性:

    首先我们需要了解Cortex-m3/m4内核的中断和优先级。内核共有256个中断优先级,并且前16个中断分配给了系统内核异常中断,因此外设中断只能排在前16个以后,因此外部中断最多只能有256-16=240个。比如中断0的异常号是16。
    在这里插入图片描述
    在这里插入图片描述

    系统内核发生异常时会触发中断,内核的异常情况如下:
    在这里插入图片描述
    其中外部中断的优先级有中断优先级配置寄存器,因为外部中断最多只能有256-16=240个,因此外部中断优先级寄存器有240个。看下图可知,确实有240个寄存器控制着外部240个中断的中断优先级。
    在这里插入图片描述
    而内部系统异常中断的中断优先级则不在这个寄存器里面,而是单独的一块寄存器来保存内部中断的中断优先级:
    在这里插入图片描述
    有了这些知识,我们就可以回答为什么不在systick中断里面进行操作系统任务切换了。

    假设在systick里面,即要保证系统的心跳(也就是系统的时间,或者说节拍),也进行任务切换。那么就必须把systick的中断优先级设置为最低,因为有其他外中断时,是不能进行任务切换的。

    如果不把systick的优先级设置为最低,而是设置为最高,1ms执行一次。有个串口中断,执行一次需要5ms。
    在0ms时刻,系统初始化完成。

    在0.5ms时刻,来了一个串口中断,

    在1ms时刻,systick发起中断请求,因为systick中断优先级比串口中断优先级高,systick就会抢占串口中断并执行任务切换函数,而任务切换需要占用一定的时间,等任务切换执行完毕后,程序指针就已经改变为下一个任务的地址了,就没法再回到串口中断服务函数里面了。因此切换任务时需要关闭所有中断。

    而如果把systick的优先级设置为最低,确实可以解决有其他中断时不执行任务切换。但是这样就没法保证系统的时钟了。
    假设systick每1ms执行1次,而有个串口中断执行一次要5ms。

    在0ms时刻,系统初始化完成。

    在0.5ms时刻,进了串口中断。

    在1ms时刻,systick发出中断请求,但是因为systick优先级比较低,无法抢占串口中断,只有等5ms时刻串口中断退出,才会进入systick中断。

    在5ms时刻,串口中断执行完毕,此时进入systick中断。在systick中断里面会把系统时间+1,认为现在系统时间为1ms,但实际此时的系统时间是5ms,这样整个实时系统的时间就全部不准确了。而如果有6个串口中断,那么systick计数的时间很可能每30ms才计数1下,这对于实时系统是根本无法接受的。
    在这里插入图片描述

    2.把systick优先级设置为最高把PendSV设置为最低的好处:

    用systick的高优先级来保证操作系统时间的正确性,而用最低优先级的PendSV来保证不会在有其他中断时进行任务切换。我们还来演绎一下:
    假设有个串口中断,systick优先级为最高,1ms进一次。PendSV优先级为最低,会在systick中触发PendSV中断,则无其他中断时,PendSV也是1ms执行一次。串口中断依然是执行一次需要耗时5ms。

    在0ms时刻,系统初始化完成。

    在0.5ms时刻,进了串口中断。

    在1ms时刻,systick发起中断请求,因为systick优先级为最高,则systick会抢占串口中断。在systick中完成系统时钟+1,然后就立即退出了systick。整个systick函数执行很快,只需要对一个数+1,并且将pendsv触发位置为1即可。退出systick后程序会返回到串口中断函数里面,此时pendsv也发起了中断请求。但因为pendsv优先级为最低,因此不能抢占串口中断。

    到5ms时刻时,systick已经计数了5次,保证了操作系统的时钟没错误。此时串口中断函数执行完毕,退出串口中断服务函数。如没其他中断,就会执行优先级最低的pendsv中断,在pendsv中断里执行任务切换。

    虽然5ms才执行了pendsv一次,但是因为systick依旧是1ms执行一次,因此各任务的检测到的时间也都是5ms,没有错误,因此保证了实时操作系统的实时性。

    3、结语:

    因此在配置操作系统时,要把systick配置为优先级最高,把pendsv配置为优先级最低。

    以上是我画了很长时间琢磨出来并且验证了的,有帮助的话还麻烦点个赞,收藏一下!!!^~^

    展开全文
  • 51单片机之中断系统

    2020-10-09 17:28:06
    51单片机之中断系统一、中断概念1、中断发挥的作用2、什么是中断?3、什么是中断源?4、中断优先级5、中断系统二、中断的结构 一、中断概念 1、中断发挥的作用 中断一方面可以通过标志位的设定,极大的降低CPU的占用...

    一、中断概念

    1、中断发挥的作用

    中断一方面可以通过标志位的设定,极大的降低CPU的占用率;另一方面使用中断,也实现了单片机对复杂情景的处理。

    2、什么是中断

    CPU与外设并行工作,当外设数据准备好或者有某种突发事件发生时,向CPU提出请求,CPU暂停正在进行的工作,转而为该外设服务(或者是处理紧急事件),处理完毕后再回到原断点继续执行原程序。这个过程称为中断。

    注:这里对于初学者,额外解释一句,上述所指的外设一般情况下指的是片上外设。例如定时器、串行口等
    我们的计算机主要由运算器、控制器(合成中央处理器CPU)、输入、输出、存储这五大部分构成。除了运算器和控制器,基本都可以叫外设。

    3、什么是中断源

    引起中断的原因和发出中断请求的来源,称为中断源。
    中断源可以是外设(通过接口)、紧急事件、定时器或人为设置用于单步或断点调试程序。

    4、中断优先级

    当有多个中断源同时向CPU申请中断时,CPU优先响应最需紧急处理的中断请求,这种预先安排的响应次序,称为中断优先级。

    5、中断系统

    能实现中断功能并能对中断进行管理的硬件和软件称为中断系统。
    中断请求是在执行程序的过程中随机发生的。

    中断系统要解决的问题:
    ①CPU在不断的执行程序的过程中,如何检测到随机发生的中断请求
    ②是否允许中断
    ③如何正确的进入中断
    ④怎么排列优先级
    ⑤中断完成后,怎么返回原断点处

    二、中断的结构

    基础51单片机有5个中断源,增强型52系列增加了一个定时计数器2,共有6个中断源。其中包含两个外部中断源,其余为内部中断源(具体几个可参考自己所用单片机型号的对应数据手册,不同型号之间均有差异)。

    基础51单片机只有两个中断优先级,其他型号可能有更多的优先级(取决于用来控制优先级的位数多少,问我为什么,先请去复习一下二进制),通过这些优先级的设置,我们可以使中断实现嵌套。

    1、中断源(以基础型52为例)

    中断源符号 名称 中断引起原因 中断服务程序入口地址(汇编用)
    INT0 外部中断0 P3^2引脚低电平或者下降沿信号 0003H
    INT1 外部中断1 P3^3引脚低电平或者下降沿信号 0013H
    T0 定时器0中断 定时器/计数器0计数回0溢出 000BH
    T1 定时器1中断 定时器/计数器1计数回0溢出 001BH
    T2 定时器2中断 定时器/计数器2计数回0溢出 002BH
    ITI / RI 串行口中断 串行通信完成一帧数据发送或接受引起中断 0023H

    2、中断控制相关寄存器

    中断控制主要由两个方面:
    A:是否允许中断
    B:中断的优先级设置

    ① 中断控制寄存器 IE ——中断的允许和接收

    EA ET2 ES ET1 EX1 ET0 EX0
    中断总控位 T2 串行口 T1 INT1 T0 INT0

    EA:中断总控开关,1-CPU开中断,0-关
    其他都是一样,为表内各个对应外设的中断开关,1开0关

    ②中断请求标志及外部中断方式选择寄存器TCON

    TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
    T1请求有无 T1工作启停 T0请求有无 T1工作启停 INT1 请求有无 INT1工作方式 下降沿/低电平 INT0请求有无 INT0工作方式 下降沿/低电平

    :串行口的中断标志位在SCON的RI和TI位

    补充:
    低电平和下降沿触发的区别
    ①触发条件不同
    低电平触发:低电平触发后一直处于中断状态
    下降沿触发:检测到信号有下降沿时就触发开关动作,

    ②触发次数不同
    低电平触发:只要引脚为低电平时间内中断一直有效,就会一直进入中断,直到变为高电平
    下降沿触发:下降沿触发只触发一次,只在下次电平发生变化时才重新触发中断

    ③、中断优先级管理寄存器IP

    注:不同型号的单片机,随着寄存器的增多,可用来控制优先级的位数越多,优先级层级就越多

    PT2 PS PT1 PX1 PT0 PX0
    T2优先级高低 串行口优先级高低 T1优先级高低 INT1优先级高低 T0优先级高低 INT0优先级高低

    1表优先级高 0低
    若同为0或1时,CPU查询顺序为
    INT0→T0→INT1→T1→TI/RI→T2

    3、中断结构图

    在这里插入图片描述
    从图中可以看出,我们的51单片机中断部分流程如下:

    ①检测对应中断源标志位

    ②检测对应中断开关是否打开

    ③检测总中断是否打开

    ④查询是否有优先级更高或同优先级中断正在执行

    ⑤有高优先级或同级,等待其执行完毕进行中断;无高优先级和同级,直接进行中断

    三、51单片机中断响应流程

    CPU对中断的响应分为4个阶段:中断请求、中断响应、中断服务、中断返回
    在这里插入图片描述这里以定时器中断为例进行讲解

    ①CPU正常执行主程序

    ②定时器TH0,TL0计满溢出,中断标志位TF0置1

    ③CPU执行到正在进行的指令的最后一个机器周期,例行检测中断标志位

    ④检测到TF0=1,暂停主程序执行,查询EA、ET0,看是否允许中断

    ⑤检测中断优先级,看是否有条件执行中断

    ⑥查询可以执行中断,将CPU将要执行的下一条存于PC中的指令存入栈内(PC:程序计数器,存放CPU要执行的下一条指令)

    ⑦将中断入口地址送入PC,PC再送入CPU,进入中断服务函数

    ⑧进入中断服务函数,擦除中断标志位(软件清零),执行中断服务函数

    ⑨中断返回,将入栈的断点PC指令存入PC,返回主程序断点,继续执行

    四、中断程序设计

    1、开中断总开关EA,置位中断源的中断允许位

    2、对于外部中断INT0、INT1,应选择中断触发方式为低电平还是下降沿

    3、设定中断优先级,预置IP

    4、中断服务程序函数定义
    注:中断服务函数格式:
    返回值 函数名([参数])[模式][ 再入]interrupt n [using m]

    含义:
    interrupt n 将函数声明为中断服务函数
    n:
    0——外部中断0
    1——定时/计数器0溢出中断
    2——外部中断1
    3——定时计数器1溢出中断

    using m 定义函数使用的工作寄存器组
    m 取值范围为0~3

    五、中断程序示例

    #include<reg52.h>
    int0()interrupt 0
    {
    	P1=0X0F;
    	P1<<=4;
    }
    void main()
    {
    	EA=1;
    	EX0=1;
    	IT0=1;
    	while(1);
    }
    
    展开全文
  • 中断系统调用

    2020-12-26 18:57:07
    什么要采用中断系统。 维持系统可靠正常工作。1)程序员不能直接干预和操纵机器,通过操作系统来实现。2)程序运行过程中,如果发生越界访问,应该由存储管理部件进行监测,一旦发生应向处理机发出中断请求,采取...
  •  要想弄清楚desc->handle_irq(irq, desc)和我们注册的中断有什么关联,就要了解中断处理模型了。  4.1 中断处理模型结构  中断处理模型如下图所示,  其中NR_IRQS表示最大的中断号,在include/asm/arch/...
  • 中断系统(1) ** 1.什么是中断?有什么用? 中断是在有中断请求时暂停当前工作去执行被请求的工作内容,在完成请求的工作内容之后回来继续之前未完成的工作的一个过程。 例如,你正在打王者荣耀的时候你妈回来但...
  • x86 架构是硬中断int 80,中断号为80来实现系统调用的; arm架构是使用swi命令,使arm切换为软中断模式,执行swi异常向量表中的异常向量。 软中断的异常向量 arm中异常象量表: 异常类型 偏移地址(低) 偏移
  • 这篇文章是上一篇文章《c++实现服务器在线重启》中的一个实验,演示了linux下当系统函数/库函数遇到信号中断,当信号处理函数处理结束后系统函数/库函数所采取的动作。系统函数/库函数或者被重启,或者被彻底被中断...
  • 什么有中断机制? 计算机很多的硬件设备,如硬盘、键盘、鼠标等,操作系统需要对这些硬件设备进行管理,然而处理器的速度和外围硬件设备的速度往往不在一个数量级上。如果内核让处理器向硬件发出一个请求,...
  • 为了简单,只实现多任务调度(但限制,比如最多不超过10),实现中断处理(不支持中断优先级),不进行动态SHELL交互,不实现动态模块加载,不实现fork之类的动态进程派生和加载(也就是说要想在你的操作系统上...
  • RTOS系统5-中断管理

    2018-06-11 17:00:49
    1、概览 嵌入式实时系统需要对整个系统环境产生的事件作出反应。 这些事件对处理时间和响应...什么时候采用中断方式?中断服务例程(ISR)中的处理量多大?以及 ISR 外的任务量多大?通常情况下, ISR 应当越短...
  • 一、什么中断 对连接在其上的外设进行管理是一个操作系统所应该包含的核心任务之一。但是外设的速度跟CPU的速度显然不在一个数量级上,所以一般采取中断的方式对外设进行管理。内核在平时处理其他事务,当硬件...
  • 外部中断什么是外部中断?数据手册在哪里?(1)SoC支持的中断类型中一类叫外部中断。内部中断就是指的中断源来自于SoC内部(一般是内部外设),譬如串口、定时器等部件产生的中断;外部中断是SoC外部的设备,通过...
  • 中断和信号是什么关系?

    千次阅读 2016-05-26 21:24:24
    其实“软中断”(software interrupts)两种并不等价的含义:一种是通过显式调用int指令触发的,它是相对于硬中断来说的;另一种就是*nix里的信号(signal)的别名。一般来说这两种东西并没有什么联系。前者基本上...
  • 通过对中断的学习助于更深入的了解系统的一些底层原理,特别是驱动程序的开发。 主要内容: 什么中断 中断类型 中断相关函数 中断处理机制 中断控制方法 总结 1. 什么中断 为了提高CPU和外围硬件...
  • 中断中断处理

    2016-06-11 09:10:48
    中断中断处理 是什么中断用来完成硬件与操作系统间的通信,使操作系统...每个中断有一个唯一的数字标识,称为IRQ(中断控制线)或中断号,一共16个其中一个用于桥接,所以能让硬件调用的只有15个。 IRQ编号 
  • 小任务(tasklet,的书中翻译为“任务蕾”)是基于软中断实现的。为什么要提供小任务?因为小任务相对软中断有以下优势: (1)软中断的种类是编译时静态定义的,在运行时不能添加或删除;小任务可以在运行时添加...
  • 很多情况下,使用信号来终止一个长时间运行的线程是合理的。这种线程的存在,可能是因为工作线程所在的线程池被销毁,或是用户...C11标准没有提供这样的机制(草案上积极的建议,说不定中断线程会在以后的C标准中添加

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 502
精华内容 200
关键字:

中断系统有什么实现