精华内容
下载资源
问答
  • DSP软件设置中断优先级的原理 根据网上查到的一些信息和研学TI的官方例程,得出以下结论. 在正常情况下,cpu进入中断后,默认会屏蔽所有中断,这样不会发生中断嵌套 如果cpu进入中断后,软件打开中断开关的话,如果有新的...

    DSP软件设置中断优先级的原理
    28335的外设级中断由PIE模块进行管理,这与stm32的NVIC中断管理模块有很大的区别.首先PIE模块已经将各个外设级中断的优先级固化,而这些固化了的优先级并不一定适合各种应用程序.所以我们需要对外设的中断优先级进行重新分配.其次,在28335中使用软件对外设中断优先级进行修改相当复杂.下面将进行讲解.

    首先,如果你使用DSP2833x_DefaultIsr.c对中断进行管理的话,不知道你有没有注意到,当低优先级的终端任务正在执行时,即使高的优先级来的话,cpu也不会去执行高的优先级任务.相信你一定不这样认为,那么你可以在低优先级的中断函数里加入while(1);,然后查看能否进入高优先级的任务.

    其次,如果上一步你发现事实正如我所说的那样的话.那么你可以进行下一步的实验了,毕竟实践是检验真理的唯一标准.这时你在优先级的任务中加入EINT;while(1);.这次你觉得会发生什么,你是不是认为这次还是一直在while(1)卡住.但事实是,当低优先级的任务来临时,此时cpu会去执行低优先级的任务,而不是卡在while(1).是不是觉得很奇怪.

    最后,我们进行一个简单的实验,那就是再任意的中断服务函数中加入DINT,这次你会认为发生什么?你不是觉得外设中断都被屏蔽了,以后CPU不会再相应新的中断了.但事实是吗,事实是外设中断照样得到响应.

    **做到这里是不是觉得很懵逼.**下面听完我的解释,你一定会豁然开朗.

    其实,cpu每次进入中断都会执行DINT语句,这样即使有高优先级的任务到来时,也不会得到执行,也就是说无法进行中断嵌套,你是不是对第一个实验的结果有了新的认识.而如果你在中断里调用EINT语句就打开了所有可屏蔽中断,这样也就可以响应新的中断,来完成中断嵌套,而这种嵌套是不分优先级的嵌套,只要来新中断就会执行,你是不是明白第二个实验的结果了.最后cpu退出中断时都会执行EINT语句.这样第三个实验的结果也得到了解释.

    你可能会问DSP这样做是为了什么.说实在的我也懂得为什么要这么做.我好lalalallalalaji.

    但是不懂我们也可以用啊.利用这个特性就可以进行软件设置中断优先级了.其原理就在下面.

    本人总结出以下结论:

    • 在正常情况下,cpu进入中断后,默认会屏蔽所有中断(相当于DINT),这样不会发生中断嵌套,cpu退出中断时也会再次打开可屏蔽中断(相当于EINT).
    • 如果cpu进入中断后,软件打开中断开关的话(即执行EINT),如果有新的中断来,cpu都会执行新的中断,而不会管新的中断的优先级是否比现在正在执行的中断优先级高.
    • 如果想按照软件设置的优先级进行中断嵌套的话,需要每当进入中断后只打开比本中断优先级高的所有中断,这样就实现了中断嵌套,也即完成了优先级的配置.

    如果你持怀疑态度,可以去研究28334的软件优先级的官方例程

    如果想了解跟多DSP的知识,可以关注我,后续会持续更新的.

    展开全文
  • cubemax设置中断优先级

    2021-08-18 00:15:57
    1.打开cubemax,例如设置两个GPIO引脚高低电平产生的外部...3.选择NVIC控制器,分配抢占优先级和响应优先级位数,一共有5种分配方式,打钩进行中断使能,最后设置优先级,数字越小表示优先级越高。 ...

    1.打开cubemax,例如设置两个GPIO引脚高低电平产生的外部中断

     

     2.依次选择GPIO,选择相关引脚,选择下降沿触发中断

     

     3.选择NVIC控制器,分配抢占优先级和响应优先级位数,一共有5种分配方式,打钩进行中断使能,最后设置优先级,数字越小表示优先级越高。

     

    展开全文
  • configMAX_SYSCALL_INTERRUPT_PRIORITY 中断优先级设置问题 从CortexM角度 Cortex-M构架自身最多允许256级可编程优先级(优先级配置寄存器最多8位,所以优先级范围从0x00~0xFF), 是绝大多数微控制器制造商只是使用...


    更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,一起学习探讨软硬件技术知识经验,关注就有海量学习资料免费领哦:
    在这里插入图片描述


    1. 如何正确设置中断优先级

    之前有遇到过基于FreeRTOS的中断优先级设置不对,导致系统有时随机产生hardfault,实际排查过程很费劲才找到root cause是中断优先级配置不对,这里将相关知识统一整理一下。

    先上结论:

    • 如果在中断服务例程中调用了RTOS API函数,其中断优先级的数值应该高于configMAX_SYSCALL_INTERRUPT_PRIORITY
    • 或者说其逻辑优先级必须低于或等于configMAX_SYSCALL_INTERRUPT_PRIORITY(低逻辑优先级意味着高优先级数值)

    FreeRTOS API calls from interrupts can only be called from interrupts numerically equal or higher (lower urgency) than configMAX_SYSCALL_INTERRUPT_PRIORITY

    既:

    InterruptPriorityNum_ISRCalledRTOSAPI > configMAX_SYSCALL_INTERRUPT_PRIORITY

    在这里插入图片描述

    再从原理、应用角度深入讨论下:

    2. 从Cortex-M角度

    在这里插入图片描述

    Cortex-M通过NVIC(Nested vector interrupt control)来控制管理所有内部和外部中断。

    中断优先级,是指在某一个中断产生到处理完成过程中间,又有一个新的中断产生,这时就需要通过中断的优先级来决定接下来的操作:是否打断当前中断执行新中断,还是将新中断Pending。

    如下图;

    在这里插入图片描述

    Cortex-M构架自身最多允许256级可编程优先级,既优先级数值只能在0-255(优先级配置寄存器最多8位,所以优先级范围从0x00~0xFF), 而绝大多数微控制器制造商只是使用其中的一部分优先级。

    因为我们的MCU用的NXP RT1062,这里就都以此为例
    从Datasheet或者MIMXRT1062.h可看出,
    1062只使用了其中的高4bits
    在这里插入图片描述
    因此针对所有的外部中断,1062的中断优先级数值支持0(0x0)-15(0xf),一共16个, 并且都是可被抢占的(Preemptable)

    根据Cortex-M内核定义,一个中断的优先级数值越低,逻辑优先级却越高。既中断优先级数值为 0 则代表是最高优先级(逻辑优先级最高),而16则为逻辑最低。

    Cortex系列优先级数值和逻辑优先级是相反的:

    • 优先级数值,既设置在优先级寄存器里的数值,也是程序中读取和设置的IRQ Priority
    • 逻辑优先级,就是字面上说的 优先级高、优先级低

    在程序中,NXP Lib通过 NVIC_SetPriority(IRQ, PriorityNum) 在0-15之间 设置中断优先级,通过NVIC_SetPriority(LCDIF_IRQn, 8),最终设置到相应NVIC_IPR(NVIC Interrupt Priority Register)中:

    在这里插入图片描述
    部分NVIC寄存器Debug数值示例:
    在这里插入图片描述

    configPRIO_BITS

    • configPRIO_BITS (the number of piority bits available)

    在FreeRTOSConfig.h中configPRIO_BITS定义了MCU使用的优先级寄存器高位Bits,例如在 MIMXRT1062.h定义__NVIC_PRIO_BITS为4 (高4位)

    在这里插入图片描述
    而NVIC_SetPriority 就是将传入的PriorityNum左移configPRIO_BITS 再写入到 该中断寄存器中:NVIC Interrupt Priority Register,实现配置中断优先级。

    3. 从RTOS角度

    FreeRTOS通过 configPRIO_BITS 来定义所有的中断优先级level,

    configLIBRARY_LOWEST_INTERRUPT_PRIORITY

    这个宏定义了逻辑最低优先级,例如1062 1<<4 -1 最低优先级数值为 15
    同时也是systick 和pendSV这两个系统中断的优先级数值

    在这里插入图片描述

    configKERNEL_INTERRUPT_PRIORITY

    configLIBRARY_LOWEST_INTERRUPT_PRIORITY 的值在0-15之间,
    但是实际NVIC 优先级寄存器只有高4 bits有效,所以通过 宏 configKERNEL_INTERRUPT_PRIORITY 来转换:

    一般这个宏设置为 RTOS内核最低的优先级(优先级数值最大)

    例如1062 最低优先级 15<<4 = 240, 0xF0, 这个值写入寄存器,既配置为最低优先级
    在这里插入图片描述
    一般RTOS 内核系统中断都运行在最低优先级 如 SysTick/PendSV

    configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY

    在这里插入图片描述
    这个宏定义了FreeRTOS Lib能Handle的最大中断优先级数值,

    例如设置为2,则:

    • 优先级为 0,1的中断,其ISR不能调用RTOS 的API,既不能调用FreeRTOS的任何 _FromISR结尾的API
    • 优先级在 2- 15之间的中断,可以随便调用RTOS 的API

    configMAX_SYSCALL_INTERRUPT_PRIORITY

    在这里插入图片描述
    同上面的configKERNEL_INTERRUPT_PRIORITY,因为NVIC 优先级寄存器只有高4 bits有效,如果写入到寄存器里面数值,也需要左移configPRIO_BITS

    因此实际写入到NVIC Interrupt Priority Register的值实际为2<<4 = 0x20, 既configMAX_SYSCALL_INTERRUPT_PRIORITY宏的数值

    同时,这个数值0x20 会写入到BASEPRI 寄存器,FreeRTOS就可以通过BASEPRI来实现屏蔽中断了

    因此针对这类中断,我们要设置configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 的数值 高于 这类中断优先级的数值, 使得临界区能够生效 ,这样调用taskENTER_CRITICAL()/taskEXIT_CRITICAL() 才能正常实现临界区的意义


    4. 中断屏蔽原理

    为了保持中断数据不被打断,大部分ISR程序处理中首先会需要进入临界区(如通过调用FreeRTOS的taskENTER_CRITICAL())

    • 在上面栗子中,通过调用taskENTER_CRITICAL()可以屏蔽 中断优先级为 2-15的中断,(在此时所有大于BASEPRI
      0x20的中断都会被屏蔽掉,直到退出临界区)
    • 但是,如果优先级为0,1的中断产生了,还是会打断该中断的ISR (既FreeRTOS
      临界区也不能屏蔽0,1这两个中断
      ),导致异常情况发生(如数据丢失、Hardfault,程序跑飞等)

    大部分在中断服务程序中调用的以“FromISR”结尾的FreeRTOS API,是需要具有中断调用保护的,在执行这些函数前会先进入临界区操作,但是如果该中断的优先级高于 configMAX_SYSCALL_INTERRUPT_PRIORITY,则临界区就不能生效实现中断保护了

    因此这些FromISR函数,不可以被逻辑优先级高于(优先级数值低于)configMAX_SYSCALL_INTERRUPT_PRIORITY的中断服务函数调用。


    5. 临界区原理

    BASEPRI寄存器

    在这里插入图片描述

    BASEPRI为优先级屏蔽寄存器,优先级数值大于或等于该寄存器的中断都会被屏蔽,为零时不屏蔽任何中断

    因为BASEPRI是寄存器,只有高4bit有作用,所以实际优先级是数值的高4bit:
    如BASEPRI: 0x20 则优先级数数值是2, 0x50既为5 (对应NXP优先级数值 0-15)

    下图为Debug进入临界区查看的BASEPRI数值示例:

    在这里插入图片描述

    FreeRTOS通过BASEPRI实现临界区

    • 当进入临界区时,将寄存器BASEPRI的值设置成configMAX_SYSCALL_INTERRUPT_PRIORITY,如0x20,任何大于0x20的中断都会被屏蔽

    • 当退出临界区时,将寄存器BASEPRI的值设置成0。

    代码上通过portSET_INTERRUPT_MASK() / portCLEAR_INTERRUPT_MASK():
    在这里插入图片描述

    vPortEnterCritical() == vPortRaiseBASERPI()

    FreeRTOS 调用taskENTER_CRITICAL()进入临界区,底层先调用vPortEnterCritical(),最终实际调用的是vPortRaiseBASERPI()

    在这里插入图片描述
    可以看到,代码实际实现的就是:
    BASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;

    官方描述有一句比较中肯:

    • CriticalSection does not disable all interrupts but allows some high
      priority interrupts to run.

    一句话总结就是:

    在Cotext-M0,临界区是可以屏蔽所有中断的;
    而在Cortex-M3/4/7,临界区只通过BASEPRI 来屏蔽大于或等于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断


    6. 系统中断

    在这里插入图片描述

    SysTick

    系统时钟中断,RTOS的Timebase,Timer 的interrupt. 频率经常设置在1kHz 或100Hz。

    • 一般配置为最低优先级
    • 优先级数值==configKERNEL_INTERRUPT_PRIORITY (如1062中为15)

    PendSV (Pendable SerVice)

    上下文切换中断,既OS上下文切换时,会强制产生一个PendSV中断,来进行task之间的context switch操作。

    代码上通过:vPortPendSVHandler()

    • 一般配置为最低优先级
    • 优先级数值==configKERNEL_INTERRUPT_PRIORITY (如1062中为15)

    t拓展一下:FreeRTOS 各Task使用的是PSP(Process Stack Pointer), 而中断使用的是MSP(Main Stack Pointer), vPortPendSVHandler()则只能在PSP之间切换,不能在MSP和PSP之间切换:
    在这里插入图片描述

    SVCall (SuperVisor Call)

    启动调度器中断,SVC指令会触发该中断,通过来调用FreeRTOS Scheduler调度器,该中断只在启动时产生一次

    代码上通过:vPortSVCHandler()

    • 配置优先级为最高 0

    博主热门文章推荐:

    一篇读懂系列:

    LoRa Mesh系列:

    网络安全系列:

    嵌入式开发系列:

    AI / 机器学习系列:


    在这里插入图片描述

    展开全文
  • 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单片机的中断,是不是要设置了中断优先级,才会有中断嵌套?

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

    展开全文
  • 中断系统是整个计算机系统必不可少的重要组成部分。利用中断屏蔽技术修改中断优先级
  • 中断优先级

    千次阅读 2020-01-13 13:36:17
    中断优先级 分组方法 以及中断强度优先级和响应优先级的关系: ...例如:已经设置好分组为2 抢占和响应优先级分别为10 10即抢占优先级为2,响应优先级也为2;...总结一下中断优先级设置: 具体还是要在...
  • STM32中断设置以及中断优先级设置

    万次阅读 多人点赞 2018-09-13 15:26:45
    最近,在做一个智能锁的项目,...最终,调试出bug就是由于中断优先级的影响。 本项目使用到的是STM32F030C8型号的MCU,我们可以从官方下载到的标准库文件中的启动汇编文件中,查看到本型号单片机的外部中断向量表...
  • STM32-中断优先级管理NVIC 1.NVIC中断优先级分组 NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器。STM32F中文参考手册中搜索向量表可以找到相应的中断说明。 CM4/CM7 内核支持256个中断,...
  • XS128中断优先级设置

    2012-07-10 15:43:41
    XS128中断优先级设置,MC9s12xs128中断优先级设置,MC9s12xs128中断优先级设置
  • 包含五个中断源,两级中断优先级,优先级可编程设置,通过IP进行设置:  51单片机中断优先级设置方法解析  PX0(IP.0),外部中断0优先级设定位;  PT0(IP.1),定时/计数器T0优先级设定位;...
  • DSP中断优先级设置

    2020-08-19 00:34:29
    原以为2812中断不能设置优先级。实际上硬件上优先级是做好的。但软件上有办法来设置优先级。请往下看
  • 1. 基于proteus的51单片机开发实例(14)中断嵌套和中断优先级1.1. 实验目的在前面实例中我们已经学习了51单片机的定时器/计数器中断,外部中断,通过这些实例,知道了中断电路的设计,中断编程的方法。本实例中我们...
  • STM32的中断优先级详解

    千次阅读 2018-06-11 14:13:50
    中断优先级设置步骤:系统运行后先设置中断优先级分组。在主函数调用函数:void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);整个系统执行过程中,只设置一次中断分组。针对每个中断,设置对应的抢占...
  • 单片机之中断优先级设置

    千次阅读 2020-09-14 17:39:35
    中断优先级的基本规则 1.低优先级中断可被高优先级中断所中断 2.任何中断都不被同级中断所中断 然而datashhet里STC12C5A60S2单片机复位后IP、IP2、IPH、IP2H均为00H,各个中断源都是低优先级=》不能被同级中断所...
  • STM32 中断优先级

    2019-11-22 09:13:42
    1、背景 程序目标:实现定时采集数据。采集数据是向传感器发送指令,接受返回数据...解决:设置中断优先级,将串口接受中断的抢占优先级提高。 2、优先级配置——标准库 先设置优先级分组。总共有四位用来配置优先级...
  • 2440 中断优先级问题

    2020-07-29 05:35:44
    折腾2440半年多来,没有看到代码有中断优先级的痕迹,我真不信2440有这么差劲,连优先级寄存器也没有?!后来在2440的数据手册上看到了答案,感觉2440在中断优先级配置方面还是比较精妙的。现在就来学习一下吧。
  • USB在持续通信几十万次后,会出现USB IN中断丢失几次的情况,分析是中断优先级不够高,导 致USB中断在排队,然而排队还未完成,又有新的USB中断发生,致使其中断丢失。LPC1769的所有中 断默认为最高优先级"0"...
  • STM32F4设置NVIC中断优先级分组

    千次阅读 2017-01-16 14:32:42
    同时,对每个中断设置一个抢占优先级和一个响应优先级值。 分组配置是在寄存器SCB->AIRCR中配置: 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。抢占优先级相同的中断,高响应优先级不可以打断低...
  • STM32F103芯片中断优先级设置 CM3中,优先级数值越小,优先级越高。 STM32F103只用了4个位来表达优先级,因此最多支持16级的可编程优先级(0~15),15为最低优先级。 然而这16级可编程优先级并不一定都是抢占优先级...
  • stm32中断优先级设置学习

    千次阅读 2018-06-12 20:54:36
    工作中涉及到stm32挂载非接中断子程序,有时候共用外部中断口线时,对中断口线的处理得学习下,顺便了解下中断优先级设置。此文章从网上搜到转载记录下。出处:...
  • Cortex-M内核提出中断分组的概念,一共5组 NVIC_PriorityGroup_0 :0 bit 抢占优先级 4 bit 子优先级 NVIC_PriorityGroup_1 :1 bit 抢占优先级 3 bit 子优先级 NVIC_PriorityGroup_2 :2 bit 抢占优先级 2 bit ...
  • OLED_ROSC中断优先级.zip

    2017-12-06 09:27:00
    SYD8801 OLED_ROSC 中断优先级 SYD8801 OLED_ROSC 中断优先级 SYD8801 OLED_ROSC 中断优先级
  • 了解STM32的NVIC中断优先级管理及初始化简介NVIC总结NVIC中断优先级分组中断优先级设置 简介 1、CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可程中断设置。 2、STM32F103系列...
  • stm32中断优先级概述

    2020-07-20 02:46:25
    STM32 目前支持的中断共为 84 个(16 个内核+68 个外部),可以提供16 级可编程中断优先级设置,下面一起来学习一下
  • NVIC中断优先级管理 STM32中断优先级简介 如何管理中断? 什么是“抢占优先级”和“响应优先级”呢? 优先级是如何定义的? 特别说明 函数介绍 中断优先级分组选择函数 对于每个中断怎么设置优先级? 如何...
  • 关于中断寄存器主要有:ISER(使能中断),ICER(失能中断),IP(用来设置中断优先级) 优先级的定义 GD32或者ST32使用4个bit来表示中断优先级,优先级又被分为抢占优先级和子优先级。数值越小,优先级越高。如果抢占...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 157,522
精华内容 63,008
关键字:

怎么设置中断优先级