精华内容
下载资源
问答
  • 下面哪个中断的优先级最高
    千次阅读
    2021-05-23 05:16:49

    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(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 具有高抢占式优先级中断可以在具有低抢占式优先级的...
  • 中断优先级

    万次阅读 2019-05-12 16:57:34
    中断优先级 文章参考:https://blog.csdn.net/huangtonggao/article/details/6441876 结论: 1)抢占优先级越小,优先级越高;相同抢占优先级的中断不能嵌套; 2)相同抢占优先级N个中断发生时,响应优先级越小的...

    中断优先级

    文章参考:https://blog.csdn.net/huangtonggao/article/details/6441876

    结论:
    1)抢占优先级越小,优先级越高;相同抢占优先级的中断不能嵌套;
    2)相同抢占优先级N个中断发生时,响应优先级越小的中断首先执行(不能嵌套),如果响应优先级也均相同,则根据各中断对应向量表的位置来确定,向量表中越靠前的中断先响应。

    STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作’亚优先级’或’副优先级’,每个中断源都需要被指定这两种优先级。

    具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。

    当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

    既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3中定义了8个比特位用于设置中断源的优先级,这8个比特位可以有8种分配方式,如下:

    所有8位用于指定响应优先级
    最高1位用于指定抢占式优先级,最低7位用于指定响应优先级
    最高2位用于指定抢占式优先级,最低6位用于指定响应优先级
    最高3位用于指定抢占式优先级,最低5位用于指定响应优先级
    最高4位用于指定抢占式优先级,最低4位用于指定响应优先级
    最高5位用于指定抢占式优先级,最低3位用于指定响应优先级
    最高6位用于指定抢占式优先级,最低2位用于指定响应优先级
    最高7位用于指定抢占式优先级,最低1位用于指定响应优先级

    这就是优先级分组的概念。

    **Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:
    第0组:所有4位用于指定响应优先级

    第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
    第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
    第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
    第4组:所有4位用于指定抢占式优先级
    

    可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:

    NVIC_PriorityGroup_0 => 选择第0组
    NVIC_PriorityGroup_1 => 选择第1组
    NVIC_PriorityGroup_2 => 选择第2组
    NVIC_PriorityGroup_3 => 选择第3组
    NVIC_PriorityGroup_4 => 选择第4组
    

    接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指定中断源的抢占式优先级和响应优先级:

    // 选择使用优先级分组第1组
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    // 使能EXTI0中断
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    // 使能EXTI9_5中断
    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);**
    

    要注意的几点是:

    1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;

    2)抢占式优先级别相同的中断源之间没有嵌套关系;

    3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。

    下面是一个牛人的理解:

    绕来绕去终于大概明白了。

    STM32有43个channel的settable的中断源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下

    /* Preemption Priority Group -------------------------------------------------*/
    #define NVIC_PriorityGroup_0          ((u32)0x700) /* 0 bits for pre-emption priority
                                                          4 bits for subpriority */
    #define NVIC_PriorityGroup_1          ((u32)0x600) /* 1 bits for pre-emption priority
                                                          3 bits for subpriority */
    #define NVIC_PriorityGroup_2          ((u32)0x500) /* 2 bits for pre-emption priority
                                                          2 bits for subpriority */
    #define NVIC_PriorityGroup_3          ((u32)0x400) /* 3 bits for pre-emption priority
                                                          1 bits for subpriority */
    #define NVIC_PriorityGroup_4          ((u32)0x300) /* 4 bits for pre-emption priority
                                                          0 bits for subpriority */
    

    形象化的理解是:

    你是上帝,
    造了43个人,这么多人要分社会阶级和社会阶层了;
    因为“阶级”的词性比较重;"阶层"比较中性,
    所以preemption优先级->阶级;每个阶级内部,有一些阶层,sub优先级->阶层;

    如果按照NVIC_PriorityGroup_4这么分,就分为了16个阶级(1个阶层就是1个preemption优先级),0个阶层;高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和15级嵌套。
    每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“阶级8”,则

    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; // 指定抢占式优先级别,可取0-15
    

    另外,在同一阶级内部,一个人在做事的时候,另外一个人不能打断他;(preemption优先级别相同的中断源之间没有嵌套关系)
    还有,如果他们两个同时想做事,因为没有阶层,那么就根据Vector table中的物理排序,让排名靠前的人去做;

    又有1个人SPI1_IRQChannel,设定如下
    NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别,可取0-15

    SPI1_IRQChannel的阶级高,EXTI0_IRQChannel做事的时候可以打断(嵌套)。

    如果按照NVIC_PriorityGroup_3这么分,就分为了8个阶级(1个阶级是1个preemption优先级),每个阶级内有2个阶层(sub优先级);高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和7级嵌套。

    每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“阶级3”,则:
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别,可取0-7
    还需要指定他的阶层:
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别,可取0-1

    另有1个人叫EXTI9_5_IRQChannel,他的阶级和阶层设定如下
    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别,可取0-7
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别

    那么这两个人是同一阶级的兄弟,一个人在做事的时候,另外一个人不能打断他;(preemption优先级别相同的中断源之间没有嵌套关系)
    如果他们两个同时想做事,因为前者的阶层高,所以前者优先。

    还有一个人叫USART1_IRQChannel,他的阶级和阶层设定如下
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别,可取0-7
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别

    USART1_IRQChannel的优先级最高,当前面两个人做事的时候,他都可以打断(嵌套)。

    其他的类推。

    展开全文
  • 首先打出这个标题是为了便于搜索在这里赘述一下 这两者没有关系 只需要明白的是中断优先级高于任务的优先级 在单片机运行的过程中 中断来了就执行中断服务程序。在free-rtos中 任务优先级设置的数值越大 任务的...

    首先打出这个标题是为了便于搜索

    在这里赘述一下 这两者没有关系 只需要明白的是中断优先级高于任务的优先级 在单片机运行的过程中 中断来了就执行中断服务程序。

    在free-rtos中 任务优先级设置的数值越大       任务的优先级越高

    Unix任务优先: 进程优先级数值越小,进程优先级越高。

    在RT-Thread 任务优先级设置的数值越小      任务的优先级越高

    首先贴上Freertos的配置

    /*
        FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
        All rights reserved
    
        VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
    
        This file is part of the FreeRTOS distribution.
    
        FreeRTOS is free software; you can redistribute it and/or modify it under
        the terms of the GNU General Public License (version 2) as published by the
        Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.
    
        ***************************************************************************
        >>!   NOTE: The modification to the GPL is included to allow you to     !<<
        >>!   distribute a combined work that includes FreeRTOS without being   !<<
        >>!   obliged to provide the source code for proprietary components     !<<
        >>!   outside of the FreeRTOS kernel.                                   !<<
        ***************************************************************************
    
        FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
        WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
        FOR A PARTICULAR PURPOSE.  Full license text is available on the following
        link: http://www.freertos.org/a00114.html
    
        ***************************************************************************
         *                                                                       *
         *    FreeRTOS provides completely free yet professionally developed,    *
         *    robust, strictly quality controlled, supported, and cross          *
         *    platform software that is more than just the market leader, it     *
         *    is the industry's de facto standard.                               *
         *                                                                       *
         *    Help yourself get started quickly while simultaneously helping     *
         *    to support the FreeRTOS project by purchasing a FreeRTOS           *
         *    tutorial book, reference manual, or both:                          *
         *    http://www.FreeRTOS.org/Documentation                              *
         *                                                                       *
        ***************************************************************************
    
        http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading
        the FAQ page "My application does not run, what could be wrong?".  Have you
        defined configASSERT()?
    
        http://www.FreeRTOS.org/support - In return for receiving this top quality
        embedded software for free we request you assist our global community by
        participating in the support forum.
    
        http://www.FreeRTOS.org/training - Investing in training allows your team to
        be as productive as possible as early as possible.  Now you can receive
        FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
        Ltd, and the world's leading authority on the world's leading RTOS.
    
        http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
        including FreeRTOS+Trace - an indispensable productivity tool, a DOS
        compatible FAT file system, and our tiny thread aware UDP/IP stack.
    
        http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
        Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
    
        http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
        Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS
        licenses offer ticketed support, indemnification and commercial middleware.
    
        http://www.SafeRTOS.com - High Integrity Systems also provide a safety
        engineered and independently SIL3 certified version for use in safety and
        mission critical applications that require provable dependability.
    
        1 tab == 4 spaces!
    */
    
    
    #ifndef FREERTOS_CONFIG_H
    #define FREERTOS_CONFIG_H
    
    #include "sys.h"
    #include "usart.h"
    //针对不同的编译器调用不同的stdint.h文件
    #if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
        #include <stdint.h>
        extern uint32_t SystemCoreClock;
    #endif
    
    //断言
    #define vAssertCalled(char,int) printf("Error:%s,%d\r\n",char,int)
    #define configASSERT(x) if((x)==0) vAssertCalled(__FILE__,__LINE__)
    
    /***************************************************************************************************************/
    /*                                        FreeRTOS基础配置配置选项                                              */
    /***************************************************************************************************************/
    #define configUSE_PREEMPTION					1                       //1使用抢占式内核,0使用协程
    #define configUSE_TIME_SLICING					1						//1使能时间片调度(默认式使能的)
    #define configUSE_PORT_OPTIMISED_TASK_SELECTION	1                       //1启用特殊方法来选择下一个要运行的任务
                                                                            //一般是硬件计算前导零指令,如果所使用的
                                                                            //MCU没有这些硬件指令的话此宏应该设置为0!
    #define configUSE_TICKLESS_IDLE					0                       //1启用低功耗tickless模式
    #define configUSE_QUEUE_SETS					1                       //为1时启用队列
    #define configCPU_CLOCK_HZ						(SystemCoreClock)       //CPU频率
    #define configTICK_RATE_HZ						(1000)                  //时钟节拍频率,这里设置为1000,周期就是1ms
    #define configMAX_PRIORITIES					(32)                    //可使用的最大优先级
    #define configMINIMAL_STACK_SIZE				((unsigned short)130)   //空闲任务使用的堆栈大小
    #define configMAX_TASK_NAME_LEN					(16)                    //任务名字字符串长度
    
    #define configUSE_16_BIT_TICKS					0                       //系统节拍计数器变量数据类型,
                                                                            //1表示为16位无符号整形,0表示为32位无符号整形
    #define configIDLE_SHOULD_YIELD					1                       //为1时空闲任务放弃CPU使用权给其他同优先级的用户任务
    #define configUSE_TASK_NOTIFICATIONS            1                       //为1时开启任务通知功能,默认开启
    #define configUSE_MUTEXES						1                       //为1时使用互斥信号量
    #define configQUEUE_REGISTRY_SIZE				8                       //不为0时表示启用队列记录,具体的值是可以
                                                                            //记录的队列和信号量最大数目。
    #define configCHECK_FOR_STACK_OVERFLOW			0                       //大于0时启用堆栈溢出检测功能,如果使用此功能
                                                                            //用户必须提供一个栈溢出钩子函数,如果使用的话
                                                                            //此值可以为1或者2,因为有两种栈溢出检测方法。
    #define configUSE_RECURSIVE_MUTEXES				1                       //为1时使用递归互斥信号量
    #define configUSE_MALLOC_FAILED_HOOK			0                       //1使用内存申请失败钩子函数
    #define configUSE_APPLICATION_TASK_TAG			0                       
    #define configUSE_COUNTING_SEMAPHORES			1                       //为1时使用计数信号量
    
    /***************************************************************************************************************/
    /*                                FreeRTOS与内存申请有关配置选项                                                */
    /***************************************************************************************************************/
    #define configSUPPORT_DYNAMIC_ALLOCATION        1                       //支持动态内存申请
    #define configTOTAL_HEAP_SIZE					((size_t)(8*1024))     //系统所有总的堆大小
    
    /***************************************************************************************************************/
    /*                                FreeRTOS与钩子函数有关的配置选项                                              */
    /***************************************************************************************************************/
    #define configUSE_IDLE_HOOK						0                       //1,使用空闲钩子;0,不使用
    #define configUSE_TICK_HOOK						0                       //1,使用时间片钩子;0,不使用
    
    /***************************************************************************************************************/
    /*                                FreeRTOS与运行时间和任务状态收集有关的配置选项                                 */
    /***************************************************************************************************************/
    #define configGENERATE_RUN_TIME_STATS	        0                       //为1时启用运行时间统计功能
    #define configUSE_TRACE_FACILITY				1                       //为1启用可视化跟踪调试
    #define configUSE_STATS_FORMATTING_FUNCTIONS	1                       //与宏configUSE_TRACE_FACILITY同时为1时会编译下面3个函数
                                                                            //prvWriteNameToBuffer(),vTaskList(),
                                                                            //vTaskGetRunTimeStats()
                                                                            
    /***************************************************************************************************************/
    /*                                FreeRTOS与协程有关的配置选项                                                  */
    /***************************************************************************************************************/
    #define configUSE_CO_ROUTINES 			        0                       //为1时启用协程,启用协程以后必须添加文件croutine.c
    #define configMAX_CO_ROUTINE_PRIORITIES         ( 2 )                   //协程的有效优先级数目
    
    /***************************************************************************************************************/
    /*                                FreeRTOS与软件定时器有关的配置选项                                            */
    /***************************************************************************************************************/
    #define configUSE_TIMERS				        1                               //为1时启用软件定时器
    #define configTIMER_TASK_PRIORITY		        (configMAX_PRIORITIES-1)        //软件定时器优先级
    #define configTIMER_QUEUE_LENGTH		        5                               //软件定时器队列长度
    #define configTIMER_TASK_STACK_DEPTH	        (configMINIMAL_STACK_SIZE*2)    //软件定时器任务堆栈大小
    
    /***************************************************************************************************************/
    /*                                FreeRTOS可选函数配置选项                                                      */
    /***************************************************************************************************************/
    #define INCLUDE_xTaskGetSchedulerState          1                       
    #define INCLUDE_vTaskPrioritySet		        1
    #define INCLUDE_uxTaskPriorityGet		        1
    #define INCLUDE_vTaskDelete				        1
    #define INCLUDE_vTaskCleanUpResources	        1
    #define INCLUDE_vTaskSuspend			        1
    #define INCLUDE_vTaskDelayUntil			        1
    #define INCLUDE_vTaskDelay				        1
    #define INCLUDE_eTaskGetState			        1
    #define INCLUDE_xTimerPendFunctionCall	        1
    
    /***************************************************************************************************************/
    /*                                FreeRTOS与中断有关的配置选项                                                  */
    /***************************************************************************************************************/
    #ifdef __NVIC_PRIO_BITS
    	#define configPRIO_BITS       		__NVIC_PRIO_BITS
    #else
    	#define configPRIO_BITS       		4                  
    #endif
    
    #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY			15                      //中断最低优先级
    #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY	5                       //系统可管理的最高中断优先级
    #define configKERNEL_INTERRUPT_PRIORITY 		( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
    #define configMAX_SYSCALL_INTERRUPT_PRIORITY 	( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
    
    /***************************************************************************************************************/
    /*                                FreeRTOS与中断服务函数有关的配置选项                                          */
    /***************************************************************************************************************/
    #define xPortPendSVHandler 	PendSV_Handler
    #define vPortSVCHandler 	SVC_Handler
    
    #endif /* FREERTOS_CONFIG_H */
    
    

     任务优先级配置  

       1. FreeRTOS中任务的最高优先级是通过FreeRTOSConfig.h中的configMAX_PRIORITIES  进行配置的   用户实际可以使用的优先级范围是0- configMAX_PRIORITIES -1,比如我们在此定义为5 那么用户可以使用优先级号 0,1,2,3,4,不包含5,数值越大优先级越高  

      2.建议用户配置configMAX_PRIORITIES 的最大值不要超过32,用户可以使用的范围0-31,根据实际应用配置,配置越大,需要的内存空间越大

     上述只是拿5 作为例子     实际上看了其他人写的 文章   大家搜索之后对应下面配置的中断优先级的配置为5会存在疑惑。

      优先级分配方案:

       1.IRQ任务:IRQ任务是指通过中断服务程序进行触发的任务,,所有任务中优先级最高

       2.高优先级后台任务:比如按键检测,触摸检测,USB消息处理

       3.低优先级时间调度任务:比如:emWin的界面显示,LED数码管显示

      note:特别注意IRQ任务和高优先级任务必须设置为阻塞式(调用消息等待或者延迟等函数),只有这样高优先级任务才会

     释放CPU的使用权,从而低优先级任务才会有机会得到执行

      在STM32使用由于中断优先级设置采用的是库函数,因此请必须保证优先级设置为可抢占优先级:

       NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );只有抢占优先级,优先级为0--15级,数值越大优先级越低

    优先级设置介绍:

      FreeRTOSConfig.h中定义了两个宏,分别是:configKERNEL_INTERRUPT_PRIORITY和configMAX_SYSCALL_INTERRUPT_PRIORITY

              configKERNEL_INTERRUPT_PRIORITY用来设置RTOS内涵自己的中断优先级,因为RTOS内涵中断

    不允许抢占用户使用的中断,因此这个宏一般为硬件最低优先级

     

            configMAX_SYSCALL_INTERRUPT_PRIORITY  用来设置可以在中断服务程序中安全调用API函数最高优先级,

    如果优先大于这个宏代表的优先级,FreeRtos将无法关闭该中断,不受FreeRtos控制

    #ifdef __NVIC_PRIO_BITS /* __NVIC_PRIO_BITS 已经在stm32f4xx.h里面定义为4

    */ #define configPRIO_BITS __NVIC_PRIO_BITS

    #else #define configPRIO_BITS 4 #endif

    #define configPRIO_BITS  4

    此宏定义用于配置STM32的8位优先级设置寄存器实际使用的位数

    STM32f103 STM32F407  和STM32F429都是使用高4位。在往寄存器中写值的时候需要移位,

    SysTick的优先级我们一般配置为最低,即0xf 。这样可以提高系统的实时响应能力,即其他的外部中断可以及时的得到响应。


     

    展开全文
  • STM8的中断优先级配置

    2021-06-28 16:58:23
    STM8的中断中断控制器(ITC)控制。...硬件优先级由向量号确定,向量号越小,优先级越高如下面中断映射,中断向量表。 软件优先级设置可以分为4个等级(0~3),实际上可设置的就三个等级:1~3。优先级

    STM8的中断由中断控制器(ITC)控制。

    STM8没有专门的中断状态寄存器,所以只能通过刚进入中断就读取IDR来判断,不过在某些情况下,此种方法就不好用了,所以在设计的时候就要考虑清楚,是不是会冲突.最好把有冲突的中断放到不同的组。

    STM8的外部中断采用 软件优先级+硬件优先级的控制方法,来控制优先级分组.软件优先级优先于硬件优先级

    • 硬件优先级由向量号确定,向量号越小,优先级越高如下面图中断映射,中断向量表。
    • 软件优先级设置可以分为4个等级(0~3),实际上可设置的就三个等级:1~3。优先级顺序:0<1<2<3, 3的优先级最高,高优先级的中断可以打断低优先级的中断

    设置中断优先级用函数:ITC_SetSoftwarePriority();

    多个中断同时发生:在软件优先级相同的情况下,由硬件优先级决定谁先响应.但是硬件优先级不可打断。

    也就是相同软件优先级的中断,硬件优先级低的中断在执行了...此时来一个硬件优先级高的中断是不可以打断低优先级的中断的。

    STM8还有个TLI外部中断,这个优先级可以打断软件优先级为3的中断,TLI的优先级不可设置.(基本就是最高级别了,除了RESET)。

    硬件优先级表:可以在相应手册中中查看或者在eg:  #include "stm8l15x_itc.h" 

    展开全文
  • STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作’亚优先级’或’副优先级’,每个中断源都需要被指定这两种优先级。 具有高抢占式优先级中断可以在具有低抢占式优先级...
  • is being built 请用下面括号内所给的词或短语的适当形式完成下列句子。 1. Xi'an No.2 Subway ______(complete) in 2010. 2 — Did you go to Kangkang's birthday party last night? — No, I _____. [ ]A. ...
  • 摘要:鉴于MCS-51系统只提供“二级中断嵌套”,提出扩展51系统中断优先级的纯软件方法。其利用51系统内建的中断允许寄存器IE和中断优先级寄存器IP,通过屏蔽字机制来实现;以C51的形式,给出这种扩展方法的函数库...
  • STM32F429xx的96个中断里面,包括10个内核中断和91个可屏蔽中断,具有16级可编程的中断优先级,而我们常用的就是这91个可屏蔽中断。在MDK内,与NVIC相关的寄存器,MDK为其定义了如下的结构体。 /** \brief ...
  • 由于 STM32F103 是基于 ARM Cortex M3 内核设计的,因此我们先了解一下 ARM Cortex M3 的中断,M3 内核的中断分为两大部分,第一部分是系统中断,一共有 16 个,第二部分是 留给芯片厂家的 240 的外设中断(这两部分...
  • NVIC中断优先级管理

    2022-05-20 15:51:11
    STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。而我们常用的就是这 68 个可屏蔽中断,但是 STM32 的 68 个可屏蔽中断,在 STM32F103 系列上面,又只有 60 个(在 107 ...
  • CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256级的可编程中断设置。但 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。
  • 关注、星标公众号,直达精彩内容来源:网络素材中断优先级的内容,有一般紧急的中断,有特别紧急的中断,这取决于具体的系统设计,这就涉及到中断优先级和中断嵌套的概念,今天先简单介绍一下相关寄存器,不做例程...
  • 最近在使用FreeRTOS的时候,突然发现程序在运行了几分钟之后所有的任务都不再调用了,只有几个中断能正常使用,看来是系统挂掉了,连续测试了几次想找出问题,可是这个真的有点不知所措。
  • 可能对于刚接触抢占式优先级和响应优先级的人来说学习STM32的中断优先级有点障碍,这里先介绍下优先级: 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式...
  • 【STM32】NVIC中断优先级管理(中断向量表)

    万次阅读 多人点赞 2018-04-08 19:55:22
    STM32F1xx官方资料: 《STM32中文参考手册V10》-第9章 中断和事件 Cortex-M3内核支持256个中断,其中包含...STM32有84个中断,包括16个内核中断(异常)和68个可屏蔽中断,具有16级可编程的中断优先级。而STM32F10...
  • STM32可以对中断进行分组,可以分为5组。
  • STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。 而我们常用的就是这 68 个可屏蔽中断,但是 STM32 的 68 个可屏蔽中断,在 STM32F103 系列 上面,又只有 60 个(在 ...
  • STM32NVIC中断优先级

    2021-06-27 17:03:43
    STM32NVIC中断优先级 什么是单片机中断 计算机的中断系统能够加强CPU对多任务事件的处理能力。中断机制是现代计算机系统中的基础设施之一,它在系统中起着通信网络作用,以协调系统对各种外部事件的响应和处理。中断...
  • 1 NVIC中断优先级分组 1.1NVIC的中断向量表 Cortex-M3和CM4内核都支持256个中断,其中包含了16个内核中断(异常)和240个外部中断,并且具有256级的可编程中断设置。但是,STM32F1并没有使用CM3内核的全部东西,...
  • 1、抢占优先级比子优先级的优先权更高,这意味抢占优先级更高的中断会先执行,而不管子优先级的优先权,数值越低优先级越高。 2、同理,如果抢占优先级相同,那么就会比较子优先级,子优先级更高的中断将会先被执行...
  • 对于 M3 和 M4 内核的 MCU,每个中断优先级都是用寄存器中的 8 位来设置的。 8 位的话就可以 设置 2^8 = 256 级中断,实际中用不了这么多,所以芯片厂商根据自己生产的芯片做出了调整。比如 ST 的 STM32F1xx 和 F4...
  • STM32中断优先级和开关总中断 一,中断优先级: STM32(Cortex-M3)中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作’亚优先级’或’副优先级’,每个中断源...
  • STM32中断优先级理解

    2019-09-28 04:35:57
    STM32优先级理解 学习并使用STM32已经有一段时间了,记得先前一直不太理解STM32优先级中怎么设定抢占优先级和响应优先级,后来也是看了以为网友的博客才明白了...首先说说中断响应的顺序 (1)具有高抢占式优先级的...
  • STM32中断,及FreeRTOS中断优先级配置

    千次阅读 2018-12-20 18:19:57
    置顶/星标公众号,不错过每一条消息! 很多朋友对中断的一些知识还是不了解,今天就写点关于Cortex-M3处理器中断相关,以及FreeRTOS中断优先级配置的内容。...
  • STM32中断优先级分组概念

    万次阅读 2016-12-20 09:19:23
    Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:第0组:所有4位用于指定响应优先级第1组:最高1位用于指定抢占...
  • stm32中断优先级分组

    千次阅读 2016-12-27 08:29:06
    STM32中断优先级和开关总中断一,中断优先级:STM32(Cortex-M3)中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要...
  • 嵌入式FreeRTOS操作系统中断优先级

    万次阅读 2019-06-05 10:08:30
    嵌入式FreeRTOS操作系统中断优先级配置(重要) 2016年09月23日 16:49:48偏执灬阅读数:8865更多 个人分类:嵌入式实时操作系统 本章节为大家讲解FreeRTOS中断优先级配置,此章节非常重要,初学者经常在这里犯...
  • 51单片机中断的使用及优先级设置 51单片机有两个外部中断,两个定时器/计数器,两个外部中断分别是int0,int1。定时器/计数器分别是t0,t1,还有一个串口中断TI/RI,加起来有五个中断。它们在硬件上的排列顺序是INT0...
  • FreeRTOS中断优先级配置(重要)  本章节为大家讲解FreeRTOS中断优先级配置,此章节非常重要,初学者经常在这里犯迷糊。对于初学者来说,本章节务必要整明白。12.1 NVIC基础知识12.2 使用FreeRTOS时如何配置外设...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,460
精华内容 11,784
关键字:

下面哪个中断的优先级最高