精华内容
下载资源
问答
  • 关于中断优先级的问题——ARM架构

    千次阅读 2019-10-03 18:04:55
    在ARM架构的嵌入式系统中,有着不同的中断请求,而不同的中断请求有着不一样的优先级。 请求类型 复位 (Reset) 数据中止(Data Abort) 快速中断(FIQ) 中断(IRQ) 预取中止(Prefetch Abort) ...

    在ARM架构的嵌入式系统中,有着不同的中断请求,而不同的中断请求有着不一样的优先级。

    请求类型
    复位 (Reset)
    数据中止(Data Abort)
    快速中断(FIQ)
    中断(IRQ)
    预取中止(Prefetch Abort)
    未定义指令(Undefined Instruction)
    软中断(SWI)

    优先级依次从高到低。

    这是说一下为什么会有数据中止和预取中止,因为在RISC中是流水线的操作方式,也即是取指令和取数据是在不同的流水阶段完成的。而在取数据和取指令的过程中均有可能发生异常,所以也需要两个异常中断与之对应。

    展开全文
  • 中断系统是整个计算机系统必不可少的重要组成部分。利用中断屏蔽技术修改中断优先级
  • Q1:请教高人C51单片机C语言中的中断优先级怎么设置?C51中设置中断优先级,需要对中断寄存器IP进行配置。具体值需要根据用户需要的优先级顺序进行确定,具体的设置方法就是直接写如下C语言语句:IP = 06H;// 如果5...

    Q1:请教高人C51单片机C语言中的中断优先级怎么设置?

    C51中设置中断优先级,需要对中断寄存器IP进行配置。具体值需要根据用户需要的优先级顺序进行确定,具体的设置方法就是直接写如下C语言语句:

    IP = 06H;// 如果5个中断同时发生,则响应次序为:定时器0 -> 外中断1 -> 外中断0 -> 定时器1 -> 串行中断

    下面给出IP寄存器中每位(共8位)的含义:

    PX0(IP.0),外部中断0优先级设定位;

    PT0(IP.1),定时/计数器T0优先级设定位;

    PX1(IP.2),外部中断0优先级设定位;

    PT1(IP.3),定时/计数器T1优先级设定位;

    PS(IP.4),串行口优先级设定位;

    PT2 (IP.5), 定时/计数器T2优先级设定位(80C52的T2)

    IP.6和IP.7无意义,均为0(在C51中PT2也设置为0)。

    ps:IP默认值为00H,此时优先级顺序为:

    外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断

    Q2:51单片机具体如何设置IP值改变优先级

    设置不了。51单片机就只有二级中断优先级而已。

    51单片机的中断可嵌套,但至多支持二级嵌套。

    51单片机的默认(此时的IP寄存器不做设置)中断优先级为:

    外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断;

    但这种优先级只是逻辑上的优先级,当同时有几种中断到达时,高优先级中断会先得到服务。这种优先级实际上是中断同时到达的情况下,谁先得到服务的优先级,而不是可提供中断嵌套能力的优先级。这种优先级被称为逻辑优先级。

    例如:当计数器0中断和外部中断1(优先级 计数器0中断>外部中断1)同时到达时,会进入计时器0的中断服务函数;但是在外部中断1的中断服务函数正在服务的情况下,这时候任何中断都是打断不了它的,包括逻辑优先级比它高的外部中断0计数器0中断。

    要实现真正的嵌套形式的优先级,也即高优先级中断服务可以打断低优先级中断服务的情况,必须通过设置中断优先级寄存器IP来实现;这种优先级被称为物理优先级。

    例如:设置IP = 0x10,即设置串口中断为最高优先级,则串口中断可以打断任何其他的中断服务函数实现嵌套,且只有串口中断能打断其他中断的服务函数。若串口中断没有触发,则其他几个中断之间还是保持逻辑优先级,相互之间无法嵌套。

    Q3:51单片机怎么设置外部中断和时钟中断的优先级?使得外部中断优先级大于时钟中断!

    这个问题不难!51单片机中断源总共有5个,即2个外部中断、2个定时/计数器中断、1个串行口中断。

    没有时钟中断,你说的时钟中断是指定时器中断吧。

    中断优先级的设定主要是对中断优先级寄存器IP的设置,

    其8位内容如下:XXPT2PSPT1PX1PT0PX0其中PX0为外部中断0的优先级设定位,

    PX1为外部中断1的优先级设定位,PT0PT1为定时器的优先级设定位,

    设置优先级设定位=1时,该优先级最高为高级中断。

    设置优先级设定位=0时,该优先级最低为低级中断。

    同一级别的中断内部优先级顺序是

    外部中断0最高

    定时器0

    外部中断1、定时器2、串行口最低

    最简单的方法是,将你用到的外部中断设为高级中断,其它的中断设为低级中断。

    可以在程序中使用置1指令SETBPX0,将外部中断0设为高级中断。

    WWW.Zd%yaN.CoM

    Q4:请问51单片机的中断,是不是要设置了中断优先级,才会有中断嵌套?

    同优先级,先到先处理,不同优先级,高优先级会打断低优先级优先处理

    展开全文
  • STM32-中断优先级管理NVIC 1.NVIC中断优先级分组 NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器。STM32F中文参考手册中搜索向量表可以找到相应的中断说明。 CM4/CM7 内核支持256个中断,...

    STM32-中断优先级管理NVIC

    1.NVIC中断优先级分组

    NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器。STM32F中文参考手册中搜索向量表可以找到相应的中断说明。
    CM4/CM7 内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。
    STM32F4/F7并没有使用CM4内核的全部东西,而是只用了它的一部分。
    STM32F40xx/STM32F41xx总共有92个中断。10个内核中断,82个可屏蔽中断。
    STM32F42xx/STM32F43xx则总共有97个中断。10个内核中断,87个可屏蔽中断。
    STM32F76x总共118个中断,10个内核中断,108个可屏蔽中断。

    STM32具有16级可编程的中断优先级,而我们常用的就是这些可屏蔽中断。

    几十个中断,怎么管理?

    首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。

    分组配置是在寄存器SCB->AIRCR中配置: IP bit[7:4]有4位,2^4=16,所以说它们的优先级可以有16个值,这时候如果是2位抢占优先级,那么它的值可能为0、1、2、3。也就是抢占优先级可以取0到3 。首先进行分组来决定几位抢占优先级、几位响应优先级。数越小它的优先级越高。

    AIRCR[10:8]IP bit[7:4]分配情况分配结果
    01110:40位抢占优先级,4位响应优先级
    11101:31位抢占优先级,3位响应优先级
    21012:22位抢占优先级,2位响应优先级
    31003:13位抢占优先级,1位响应优先级
    40114:04位抢占优先级,0位响应优先级

    抢占优先级 & 响应优先级区别:

    高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。抢占决定了是否能打断别人。
    抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
    抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
    如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;

    举例:

    假定设置中断优先级组为2,然后设置

    中断3(RTC中断)的抢占优先级为2,响应优先级为1。

    中断6(外部中断0)的抢占优先级为3,响应优先级为0

    中断7(外部中断1)的抢占优先级为2,响应优先级为0。

    那么这3个中断的优先级顺序为:中断7>中断3>中断6。

    一般情况下,系统代码执行过程中,只设置一次中断优先级分组,比如分组2,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。

    中断优先级分组函数位于HALLIB中的stm32f7xx_hal_cortex.c:void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);

    void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
    {
      /* Check the parameters */
      assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));
      
      /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */
      NVIC_SetPriorityGrouping(PriorityGroup);
    }
    

    可以找到IS_NVIC_PRIORITY_GROUP的定义,进而确定PriorityGroup参数怎么写。

    #define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PRIORITYGROUP_0) || \
                                           ((GROUP) == NVIC_PRIORITYGROUP_1) || \
                                           ((GROUP) == NVIC_PRIORITYGROUP_2) || \
                                           ((GROUP) == NVIC_PRIORITYGROUP_3) || \
                                           ((GROUP) == NVIC_PRIORITYGROUP_4))
    

    在stm32f7xx_hal.c中可以找到HAL_Init函数:其中HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);可以看到中断分组为2 。

    HAL_StatusTypeDef HAL_Init(void)
    {
      /* Configure Flash prefetch and Instruction cache through ART accelerator */ 
    #if (ART_ACCLERATOR_ENABLE != 0)
       __HAL_FLASH_ART_ENABLE();
    #endif /* ART_ACCLERATOR_ENABLE */
    
      /* Set Interrupt Group Priority */
      HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
    
      /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */
      HAL_InitTick(TICK_INT_PRIORITY);
      
      /* Init the low level hardware */
      HAL_MspInit();
      
      /* Return function status */
      return HAL_OK;
    }
    

    2.NVIC中断优先级设置

    分组设置好之后,怎么设置单个中断的抢占优先级和响应优先级?

    中断设置相关寄存器:

    _IO uint8_t IP[240]; //中断优先级控制的寄存器组

    _IO uint32_t ISER[8]; //中断使能寄存器组
    _IO uint32_t ICER[8]; //中断失能寄存器组
    _IO uint32_t ISPR[8]; //中断挂起寄存器组
    _IO uint32_t ICPR[8]; //中断解挂寄存器组
    _IO uint32_t IABR[8]; //中断激活标志位寄存器组

    位于core_cm7.h中:NVIC_Type结构体中成员变量就是那些寄存器。

    /**
      \brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).
     */
    typedef struct
    {
      __IOM uint32_t ISER[8U];               /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */
            uint32_t RESERVED0[24U];
      __IOM uint32_t ICER[8U];               /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */
            uint32_t RSERVED1[24U];
      __IOM uint32_t ISPR[8U];               /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */
            uint32_t RESERVED2[24U];
      __IOM uint32_t ICPR[8U];               /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */
            uint32_t RESERVED3[24U];
      __IOM uint32_t IABR[8U];               /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register */
            uint32_t RESERVED4[56U];
      __IOM uint8_t  IP[240U];               /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide) */
            uint32_t RESERVED5[644U];
      __OM  uint32_t STIR;                   /*!< Offset: 0xE00 ( /W)  Software Trigger Interrupt Register */
    }  NVIC_Type;
    
    

    对于每个中断怎么设置优先级?

    中断优先级控制的寄存器组:IP[240],全称是:Interrupt Priority Registers

    240个8位寄存器,每个中断使用一个寄存器来确定优先级。STM32F40x系列一共82个可屏蔽中断,使用IP[81]~IP[0]。

    每个IP寄存器的高4位用来设置抢占和响应优先级(根据分组),低4位没有用到。

    在stm32f7xx_hal_cortex.c可找到:

    /**
      * @brief  Sets the priority of an interrupt.
      * @param  IRQn: External interrupt number.
      *         This parameter can be an enumerator of IRQn_Type enumeration
      *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f7xxxx.h))
      * @param  PreemptPriority: The preemption priority for the IRQn channel.
      *         This parameter can be a value between 0 and 15
      *         A lower priority value indicates a higher priority 
      * @param  SubPriority: the subpriority level for the IRQ channel.
      *         This parameter can be a value between 0 and 15
      *         A lower priority value indicates a higher priority.          
      * @retval None
      */
    void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
    { 
      uint32_t prioritygroup = 0x00;
      
      /* Check the parameters */
      assert_param(IS_NVIC_SUB_PRIORITY(SubPriority));
      assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority));
      
      prioritygroup = NVIC_GetPriorityGrouping();
      
      NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority));
    }
    
    

    中断优先级设置步骤:

    • 系统运行后在HAL_Init函数中设置中断优先级分组。调用函数:
      HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
      //中断优先级分组2 整个系统执行过程中,只设置一次中断分组。
    • 针对每个中断,设置对应的抢占优先级和响应优先级:
      void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t
      PreemptPriority, uint32_t SubPriority);
    • 使能中断通道:
      void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);
    void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
    {
      /* Check the parameters */
      assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
      
      /* Enable interrupt */
      NVIC_EnableIRQ(IRQn);
    }
    
    
    展开全文
  • 中断优先级

    千次阅读 2020-01-13 13:36:17
    中断优先级 分组方法 以及中断强度优先级和响应优先级的关系: 注意: 例如:已经设置好分组为2 抢占和响应优先级分别为10 10即抢占优先级为2,响应优先级也为2;如果这时改变分组为3,则抢占优先级为101 0...

    中断优先级

    分组方法

    以及中断强度优先级和响应优先级的关系:

    注意:

    例如:已经设置好分组为2 抢占和响应优先级分别为10 10即抢占优先级为2,响应优先级也为2;如果这时改变分组为3,则抢占优先级为101 0即抢占优先级为5,响应优先级为0,已设置好的中断就会混乱

    设置中断优先级可以使用库函数实现:

    以及中断初始化函数:

    总结一下中断优先级设置:

    具体还是要在代码中实践学习。

    展开全文
  • 1. 基于proteus的51单片机开发实例(14)中断嵌套和中断优先级1.1. 实验目的在前面实例中我们已经学习了51单片机的定时器/计数器中断,外部中断,通过这些实例,知道了中断电路的设计,中断编程的方法。本实例中我们...
  • 2440 中断优先级问题

    2020-07-29 05:35:44
    折腾2440半年多来,没有看到代码有中断优先级的痕迹,我真不信2440有这么差劲,连优先级寄存器也没有?!后来在2440的数据手册上看到了答案,感觉2440在中断优先级配置方面还是比较精妙的。现在就来学习一下吧。
  • USB在持续通信几十万次后,会出现USB IN中断丢失几次的情况,分析是中断优先级不够高,导 致USB中断在排队,然而排队还未完成,又有新的USB中断发生,致使其中断丢失。LPC1769的所有中 断默认为最高优先级"0"...
  • Cortex-M内核提出中断分组的概念,一共5组 NVIC_PriorityGroup_0 :0 bit 抢占优先级 4 bit 子优先级 NVIC_PriorityGroup_1 :1 bit 抢占优先级 3 bit 子优先级 NVIC_PriorityGroup_2 :2 bit 抢占优先级 2 bit ...
  • STM32支持多种中断,经常遇到中断优先级的问题,关于cortex-M3的中断优先级的描述。
  • OLED_ROSC中断优先级.zip

    2017-12-06 09:27:00
    SYD8801 OLED_ROSC 中断优先级 SYD8801 OLED_ROSC 中断优先级 SYD8801 OLED_ROSC 中断优先级
  • XS128中断优先级设置

    2012-07-10 15:43:41
    XS128中断优先级设置,MC9s12xs128中断优先级设置,MC9s12xs128中断优先级设置,
  • FreeRtos 任务优先级和中断优先级

    千次阅读 2019-07-01 17:36:19
    中断优先级和任务优先级的区别: 1.简单的说,这两者之间没有任何关系,不管中断的优先级是多少,中断的优先级永远高任何任务的优先级,即在执行的过程中,中断来了就开始执行中断服务程序, 2.对应STM32F103 F...
  • stm32中断优先级概述

    2020-07-20 02:46:25
    STM32 目前支持的中断共为 84 个(16 个内核+68 个外部),可以提供16 级可编程中断优先级的设置,下面一起来学习一下
  • STM32中断优先级和开关总中断详细讲解 .
  • 51中断优先级.汇编

    2009-07-22 19:44:55
    中断优先级.汇编 开中断优先级.汇编 中断优先级.汇编
  • stm32中断优先级

    2021-05-31 16:28:33
    1.STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作“亚优先级”或“副优先级”或“从优先级”,每个中断源都需要被指定这两种优先级。...中断优先级组在stm32中一般可分为0-.
  • 1.理解AT89C51单片机中断优先级和优先权。 2.用PROTEUS设计、仿真基于AT89C51单片机的中断优先级实验。 3.掌握中断编程。 优先级实验
  • FreeRTOS中断优先级和任务优先级 架构:Cortex-M3 版本:FreeRTOS V9.0.0 前言: 最开始,我并没有搞清楚什么是中断优先级和任务优先级,但看了部分资料后发现这两个并没有半毛钱关系,于是便有了这篇笔记,本...
  • 【STM32】中断和中断优先级理解

    千次阅读 2017-04-17 22:41:25
    详细介绍中断、中断优先级中断优先级组、抢占优先级和响应优先级概念。
  • 关于 STM32 中断优先级

    2012-04-25 09:33:42
    一:综述STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。二:优先级判断...
  • STM32中断优先级和开关总中断
  • 说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。
  • 说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。
  • stm32中断优先级NVIC

    2021-05-19 21:25:15
    stm32中断优先级NVIC题NVIC中断优先级分组中断管理方法抢占优先级 & 响应优先级区别:NVIC中断优先级设置函数NVIC_PriorityGroupConfig()NVIC_Init() NVIC中断优先级分组 CM3内核支持256个中断,其中包含了16...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 156,994
精华内容 62,797
关键字:

关于中断优先级