精华内容
下载资源
问答
  • 对于每个中断怎么设置优先级? 如何理解中断挂起与解挂的含义? 获取中断状态的函数 清除/设置中断标志位的函数 针对于中断标志位的操作有什么用? 举例说明 NVIC中断优先级管理 STM32中断优先级简介 ...

    目录

    NVIC中断优先级管理

    STM32中断优先级简介

    如何管理中断?

    什么是“抢占优先级”和“响应优先级”呢?

    优先级是如何定义的?

    特别说明

    函数介绍

    中断优先级分组选择函数

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

    如何理解中断挂起与解挂的含义?

    获取中断状态的函数

    清除/设置中断标志位的函数

    针对于中断标志位的操作有什么用?

    举例说明


    NVIC中断优先级管理

    STM32中断优先级简介

     

    NVIC的缩写是“嵌套向量中断控制器(Nested Vectored Interrupt Controller)”。

    如何管理中断?

    STM32中断优先级管理采用“响应优先级和抢占优先级”结合的方法,并且进行了中断分组。

     

    以第1组为例:1bit抢占优先级说明抢占优先级共有两级,3bits响应优先级说明响应优先级共有8级。我们可以看到无论如何分组,中断优先级总有16种。

     

    什么是“抢占优先级”和“响应优先级”呢?

    抢占优先级和响应优先级都是区分那个中断优先进行的标志,但是两者的含义去不尽相同。

    抢占优先级从名字上就比响应优先级霸气一些,因此抢占优先级起决定作用,当抢占优先级相同时,响应优先级高的才会优先发生。

    优先级是如何定义的?

    值越小,优先级越大。

    例如:假定设置中断优先级组为2,然后设置中断3(RTC中断)的抢占优先级为2,响应优先级为1。  中断6(外部中断0)的抢占优先级为3,响应优先级为0。中断7(外部中断1)的抢占优先级为2,响应优先级为0。

    优先级顺序:中断7>中断3>中断6

    结论:抢占优先级高的必定先抢占中断,如果抢占优先级相同,那就看响应优先级,此时谁的响应优先级高,谁就先发生。

    除此之外,如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个,排序越考上,中断越优先。中断向量地址可以参考“STM32中文参考手册->中断->中断异常向量”部分的内容。部分示例:

     

    特别说明

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

    函数介绍

    在操作函数的底层中,我们一般只用到ISER、ICER、IP这3个寄存器。ISER用于使能中断,ICER用来清除中断,IP用来设置中断优先级。

    中断优先级分组选择函数

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    我们选择的是按照组2的方式进行分组,即抢占优先级总数为4级(0-3),响应优先级总级数为4级(0-3)。我们可以看到无论如何分组,中断优先级总有16种。

     

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

    NVIC_InitTypeDef NVIC_InitStructure;  
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  // 2<3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //3<=3
    NVIC_Init(&NVIC_InitStructure);  

     

    如何理解中断挂起与解挂的含义?

    中断的挂起与解挂针对的是中断标志位,也可以叫做允许中断发生的位。

    获取中断状态的函数

    函数原型
    
    static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn);
    
    函数应用
    
    uint32_t IterruptFlag = NVIC_GetPendingIRQ(USART1_IRQn);
    
    // 这个函数获取了串口1中断的状态

    清除/设置中断标志位的函数

    函数原型
    
    static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn);
    
    static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
    
    函数使用
    
    NVIC_SetPendingIRQ(USART1_IRQn);
    
    NVIC_ClearPendingIRQ(USART1_IRQn);

    针对于中断标志位的操作有什么用?

    1、一般来说单片机的中断发生有两个条件,一是中断标志位置位,二是中断允许,如果这两个条件都满足则进入中断,因为正常情况下中断一直是允许的,那么只能通过标志位来区分是否有中断挂起;

    2、如果进入中断不清除标志位,那么这一中断服务程序结束后由于标志位还是置位的并且中断是允许的,那么还会再次进入该中断,就会发生一直在执行中断程序的情况。

    举例说明

    在A中断中设置B中断的中断标志位为1,那么当B中断条件满足时,B中断可以发生,但是如果清除A中B中断标志位,那么无论是否满足触发B中断的条件,A中断中永远不可能执行B中断,因为中断发生的条件是:“中断标志位有效+中断条件满足”。

    展开全文
  • 了解STM32的NVIC中断优先级管理及初始化简介NVIC总结NVIC中断优先级分组中断优先级设置 简介 ...①系统运行后先设置中断优先级分组。调用函数: void NVIC_PriorityGroupConfig(uint32_t NVIC_Prio

    了解STM32的NVIC中断优先级管理及初始化

    简介

    1、CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可程中断设置。
    2、STM32F103系列上面,又只有60个可屏蔽中断(在107系列才有68个)。

    NVIC总结

    那么这几十个中断怎么来管理呢

    一、中断优先级设置步骤:
    ①系统运行后先设置中断优先级分组。调用函数:
    void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

    ②针对每个中断,设置对应的抢占优先级和响应优先级
    void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

    ③ 如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。
    (自己还没有去了解,以后再补充)

    二、对于①和②的函数在misc文件下的:
    在这里插入图片描述
    在这里插入图片描述

    NVIC中断优先级分组

    在misc文件下:
    在这里插入图片描述
    可以看到这个设置中断优先级分组的函数
    在这里插入图片描述
    进入上面的函数可以看到
    在这里插入图片描述
    进入红框框可以看到有4种不同的分组
    在这里插入图片描述

    这四种分组的分组结果为下图:
    在这里插入图片描述

    初始化NVLC

    在misc.h下有NVIC_Init函数,进入这个函数的结构体指针形参后,可看见可设置的四个参数
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    其中NVIC_InitStruct.NVIC_IRQChannel=的参数只能在stm32f10x.h头文件中找,因为我们要使用到串口1,所以进入后找到USART1_IRQn

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • NVIC中断优先级分组

    千次阅读 2018-05-23 22:14:08
    CM7内核支持256个中断,其中包含了16个内核中断和...STM32具有16级可编程的中断优先级,而我们常用的就是这些可屏蔽中断。 ???几十个中断,怎么管理?首先,对STM32中断进行分组,组0~4,同时,对每个中断设置...

    CM7内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。

    F7并没有是由CM4内核的全部东西,而是只用了它的一部分。

    STM32F76x总共118个中断,10个内核中断,108个可屏蔽中断。STM32具有16级可编程的中断优先级,而我们常用的就是这些可屏蔽中断。 

    ???几十个中断,怎么管理?

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

    分组配置是在寄存器SCB->AIRCR中配置的。

    抢占优先级和响应优先级

    1、高优先级的抢占优先级是可以打断正在进行的抢占优先级中断的。

    2、抢占优先级相同的中断,高响应由县级不可以打断低响应优先级的中断。

    3、抢占优先级相同的中断,当两个中断同时发生的情况下,哪个显影优先级高,哪个先执行。

    4、如果两个终端的抢占优先级和响应优先级都是一样的,则看哪个中断先发生就先执行。

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


    中断优先级分组函数:

    void HAL_NVIC_SetPriorityGrouping(uint32_tPriorityGroup);

    {

        asset_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));

       NVIC_SetPriorityGrouping(PriorityGroup);

    }


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

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

    全称是Interrupt Priority Registers

    240个8位寄存器,每个中断使用一个寄存器来确定优先级。每个IP寄存器的高4位用来设置抢占和响应优先级(根据分组),低4位没有用到。 void HAL_NVIC_SetPriority(IRQn_Type IRQn,uint32_t 

                                                                        PreemptPriority,uint32_t SubPriority);

    *中断优先级设置步骤:

    1、系统运行后在HAL_Init函数中设置优先级分组,调用函数;

    2、针对每个中断,何止对应的抢先优先级和响应优先级;

    3、使能中断通道。

    展开全文
  • 上次写完HAL_NVIC_SetPriorityGrouping(),设置分组为2,抢占优先级与响应优先级都...只要任何出现中断优先级高的,就会打断Systick中断,这样怎么保障如何保障其定时准确呢? 首先看了正点原子的开发指南 他的意思是

    上次写完HAL_NVIC_SetPriorityGrouping(),设置分组为2,抢占优先级与响应优先级都是2

    HAL_Init还剩下一个HAL_InitTick(TICK_INT_PRIORITY)函数就讲完了,其中,TICK_INT_PRIORITY为Systick时钟默认中断,为0x0F。

    如上文抢占有限级和响应优先级都是2来说,那么Systick的中断优先级是最低的

    只要任何出现中断优先级高的,就会打断Systick中断,这样怎么保障如何保障其定时准确呢?

    首先看了正点原子的开发指南
    在这里插入图片描述
    他的意思是使用内部实现的,不占用外部中断
    那么有一个问题了,内部外设和普通外设的中断优先级谁更高一些?
    是根据设定的优先级顺序来决定还是根据内核优先原则?
    找到一篇这样的博客,可以看一下

    https://blog.csdn.net/To_be_a_fisher/article/details/84986790

    其结论为
    Systick虽然作为与CPU紧耦合的内核外设,但其中断优先级并不比普通外设要高,并不因为它是内核外设而特殊,它还是遵循中断优先级高低的规则来响应。

    所以如果需要保障计时更准确一些,应该将Systick中断优先级提高,具体我先埋个坑-。-

    然后进入函数

    __weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
    {
      /* Configure the SysTick to have interrupt in 1ms time basis*/
      if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U)
      {
        return HAL_ERROR;
      }
    
      /* Configure the SysTick IRQ priority */
      if (TickPriority < (1UL << __NVIC_PRIO_BITS))
      {
        HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
        uwTickPrio = TickPriority;
      }
      else
      {
        return HAL_ERROR;
      }
    
      /* Return function status */
      return HAL_OK;
    }
    

    这一步很巧妙,通过if来判断括号中的1ms时间是否设置完成,
    中心思路:系统时钟为16Mhz,然后记16/1000,那么就是1/1000s,也就是1ms

    其具体实现如下:
    首先第一个if判断语句,HAL_SYSTICK_Config(),该函数如下,首先判断ticks是否超过24位,如果没有的话,就送到SysTick->LOAD中。
    STK_ LOAD 寄存器是重置值,当计数为0的时候充值为LOAD值,HAL库将其设置为16000 (0x00003E80)
    VAL寄存器是Systick时钟当前计数值,将其清零
    CTRL是控制寄存器,其由以下组成
    在这里插入图片描述
    16 COUNTFLAG 计数标志位: 当倒计时到0时,输出1
    CLKSOURSE时钟源选择 0: AHB/8 1:AHB
    TICKINT 1:当计数到0会发出计数信号
    ENABLE 1:计数 0:关闭使能

    默认的这三个都设置为1

    __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
    {
      if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
      {
        return (1UL);                                                   /* Reload value impossible */
      }
    
      SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
      NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
      SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
      SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                       SysTick_CTRL_TICKINT_Msk   |
                       SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */
      return (0UL);                                                     /* Function successful */
    }
    

    中间还有一个NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);
    该函数设置SysTick_IRQn 优先级为0111,特别注意这个是函数内部设置优先级为0111,

    __STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)  //0x0c  1100
    {
    
      if ((int32_t)(IRQn) >= 0)
      {
    		
        NVIC->IP[((uint32_t)IRQn)]               = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);//(1100 << 4 = 1100 0000)
      }
      else
      {
        SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
      }
    }
    

    设置好标准时间之后,再设置中断时钟的优先级,入口参数为SysTick_IRQn,0x0F,0

    void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
    { 
      uint32_t prioritygroup = 0x00U;
    
      /* 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));
    }
    

    assert 函数就不说了,然后再获取当前分组,设置优先级,这个与上面不同的是,上面设置优先级的值是函数内部初始化,NVIC_EncodePriority 将中断分组名,宏定义的优先级与SubPriority 进行编码

    __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
    {
      uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */
      uint32_t PreemptPriorityBits;
      uint32_t SubPriorityBits;
    
      PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); //get min of this
      SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));
    
      return (
               ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | 
               ((SubPriority     & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL)))                          
             );
    }
    

    C语法:(>)?A:B如果括号内成立则执行A,不成立执行B
    这里两个赋值语句执行的都是B
    还是贴一下F4的中断分组
    在这里插入图片描述
    PriorityGroupTmp :当前AIRCR二进制
    PreemptPriorityBits :获取当前抢占优先级是几位
    SubPriorityBits :获取当前响应优先级是几位

    注意当计算减法的时候,都转为十进制进行计算。
    最后返回的便是抢占优先级与相应优先级的具体位上的值

    最后便进行优先级设置,设置好之后,再把当前优先级送到uwTickPrio中。便完成了HAL_ini

    写的很啰嗦-。- 下次会好好想怎么写的更好一些。

    会持续更新的,欢迎0基础同学们持续关注
    也欢迎大家指点,谢谢!

    展开全文
  • - KEY0, KEY1, KEY2 优先级分别设置为 (1, 2)(1, 0)(1, 1) - __ISR 逻辑__: ```c { print(KEYx ISR start); delay_ms(1000); delay_ms(1000); print(NVIC->ISPR); // 打印相关中断抢占优先级为 0 ...
  • 看了大半天,终于把原子哥的例程中的中断分组和优先级看懂了,勉勉强强知道了怎么设置中断分组和优先级,,不容易啊。下面就是我收集的资料及我的理解 分组不是很难,就是有一点知道就就全部明白了: //...
  • 怎么停止线程? Java多线程有三种停止线程的方法: 使用stop()方法强制线程退出,但是此方法会残留不完整数据,因为stop会解除线程获取的所有锁...使用Thread类的interrupt()方法中断线程,但是原理也是设置标志位...
  • 通用IO的中断

    千次阅读 2016-12-22 13:45:34
    前言有的人问我,为什么我的博客没有讲有多少引脚,分别是什么之类的问题。...第一步,中断优先级的配置已知IP1_X和IP0_X是设置优先级的,其中X是中断优先级组的组名。0的优先级别最低,3的优先级别
  • stm32中断

    2019-07-02 10:42:58
    端口复用和重映射 stm32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候...再初始化中断优先级和响应优先级 ...
  • 究其原因,原来是忘记设置中断优先级了。 void Msp_DCMI_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_DCMI_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOI_CLK_ENABLE(); __...
  • 对于M3/M4/M7内核的MCU,每个中断优先级都是用寄存器中的8位来设置的。8位的话就可以设置2^8 = 256级中断,实际中用不了这么多,所以芯片厂商根据自己生产的芯片做出了调整。比如ST的STM32F1xx,F4xx和H7只使用了...
  • 本文所有的测试是基于STM32F103测试的,因为STM32F103是Cortex-M3内核的芯片,而且恰好我手里有这...那么内核的异常优先级怎么设置呢,比如Sistick,PendSV呢?内核异常优先级由系统控制块管理。 那我们先看一下内核的
  • 分组就是确定需要设置中断的抢占和响应优先级怎么配置。 高级的抢占优先级可以打断低级的抢占优先级, 但是高级的响应优先级不能打断低级的响应优先级中断, 如果抢占优先级相同,那么响应优先级谁先发生,谁就执行...
  • 线程API应该怎么用1、setPriority 设置线程的优先级2、isDaemon、setDaemon 守护线程API3、线程中断4、isAlive 、join 、线程状态5、activeCount、getName 等简单的API 1、setPriority 设置线程的优先级 public ...
  • 如果没有用freertos,那中断优先级设置没啥关系。但如果用了freertos,那SDIO的优先级必须要注意跟freertos区分开来,不能高过他!不然就是mout正常,read等其他操作都返回错误3 not ready。 其实当你开启...
  • 内容导读: ...RTOS内功修炼记(二)—— 优先级抢占调度到底是怎么回事? 第三篇文章讲述了RTOS内核到底是如何管理中断的?用户该如何编写中断处理函数?以及用户如何设置临界段? RTOS内功修炼
  • 内容导读: ...RTOS内功修炼记(二)—— 优先级抢占调度到底是怎么回事? 第三篇文章讲述了RTOS内核到底是如何管理中断的?用户该如何编写中断处理函数?以及用户如何设置临界段? RTOS内功修炼
  • 内容导读: ...RTOS内功修炼记(二)—— 优先级抢占调度到底是怎么回事? 第三篇文章讲述了RTOS内核到底是如何管理中断的?用户该如何编写中断处理函数?以及用户如何设置临界段? RTOS内功修炼
  • /* 初始化串口并配置串口中断优先级 */ MX_DEBUG_USART_Init(); /* 定时器初始化 */ GENERAL_TIMx_Init(); /* LED初始化 */ // LED_GPIO_Init(); /* 使能定时器中断 */ __HAL_TIM_ENABLE_IT(&htimx,...
  • PCF8563实时时钟程序,需要输出时间,但现在在串口输出的时候文本模式没有输出,HEX模式下不断输出00,我需要输出时间 下边代码 懂的大佬帮帮忙看看哪出问题了 怎么解决? main.c #include #include #include ...
  • 单片机MSP430入门理论⑨--定时器模块-定时器A④ ...上图先简单说明下,TATV中断向量寄存器,看上图,TATV的值为0A(十进制的10)时,就表明目前触发的是溢出定时器中断标志TAIFG,属于优先级最低的中断,当TA..
  • 1:如果消费者连接中断,这期间我们应该怎么办 2:如何做到负载均衡 3:如何有效的将数据发送到相关的接收者?就是怎么样过滤 4:如何保证消费者收到完整正确的数据 5:如何让优先级高的接收者先收到数据 一....
  • //配置中断优先级 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = RS485_INT_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_...
  • led1632电路图

    2011-04-24 15:46:35
    如果把数码管用定时器刷新的话,又存在定时中断和外中断优先级问题,好难解决啊。 我初步有个想法。就是用定时器计算两次外中断间隔的时间。以此来确定是连发码,数据“0”,数据“1”。不知道这个想法可否行的通...
  • Visual Studio程序员箴言中文扫描PDF

    热门讨论 2010-12-28 01:04:18
    技巧5.25 为任务列表中的用户任务分配优先级 118 技巧5.26 在任务列表中创建和查看todo注释 118 技巧5.27 在任务列表中创建快捷方式 119 技巧5.28 在任务列表中显示hack、undone和自定义标记 120 技巧5.29 ...
  • Visual Studio程序员箴言--详细书签版

    热门讨论 2012-10-16 20:37:39
    技巧2.7 设置文档、选定的文本或者只是当前行的格式 30 技巧2.8 保留制表符或者插入空格 30 技巧2.9 将空格转换为制表符和将制表符转换为空格 30 技巧2.10 从文本编辑器工具栏上增加或减少行缩进 31 技巧...
  • 且可以设置优先级</li><li>可以在父子组件任务间前进后退切换任务</li><li>render方法可以返回多元素(即可以返回数组)</li><li>支持异常边界处理异常</li></ul> 它的调用栈如下: 关于...
  • 新版Android开发教程.rar

    千次下载 热门讨论 2010-12-14 15:49:11
    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...
  • 英特尔面试专项准备

    2020-12-09 13:46:46
    </li><li>关于平衡二叉树的平衡方式和堆排序是怎么排序的,时间和空间复杂度</li><li>列举线程函数库</li><li>线程同步</li><li> <p>fork &pthread_create </li><li> C语言编程 </li><li> <p>const </li>...

空空如也

空空如也

1 2
收藏数 37
精华内容 14
关键字:

怎么设置中断优先级