[FreeRTOS学习] 重要概念

  • configKERNEL_INTERRUPT_PRIORITY
  • configMAX_SYSCALL_INTERRUPT_PRIORITY
  • *** 在Cortex-M内核的优先级数值越大 优先级反而越小***
  • 不是所有的Cortex-M内核都有相同的优先级级别
    Cortex-M构架自身最多允许256级可编程优先级
    (优先级配置寄存器最多8位,所以优先级范围从0x00~0xFF)
    但是绝大多数微控制器制造商只是使用其中的一部分优先级
  • RTOS 的优先级可以分为两种:
    1. 可以通过RTOS临界区屏蔽
    2. 不受RTOS影响,永远处于使能状态
    3. configMAX_SYSCALL_INTERRUPT_PRIORITY 用于配置两组中断优先级的边界,
    应该根据微控器所使用的优先级配置
  • 应用
    以“FromISR”结尾的FreeRTOS函数是具有中断调用保护的(执行这些函数会进入临界区),
    但是就算是这些函数,也不可以被逻辑优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断服务函数调用。
    因此,任何使用RTOSAPI函数的中断服务例程的中断优先级数值大于等于configMAX_SYSCALL_INTERRUPT_PRIORITY宏的值。
    这样就能保证中断的逻辑优先级等于或低于configMAX_SYSCALL_INTERRUPT_PRIORITY。

Cortex中断默认情况下有一个数值为0的优先级。大多数情况下0代表最高级优先级。因此,绝对不可以在优先级为0的中断服务例程中调用RTOSAPI函数。

  • Cortex-M内核的中断优先级寄存器是以最高位(MSB)对齐的。比如,如果使用了3位来表达优先级,则这3个位位于中断优先级寄存器的bit5、bit6、bit7位。剩余的bit0~bit4可以设置成任何值,但为了兼容,最好将他们设置成1.

  • configKERNEL_INTERRUPT_PRIORITY指定RTOS内核使用的中断优先级,一般设为最大值(最低优先级)

  • 临界区
    RTOS内核使用Cortex-M内核的BASEPRI寄存器来实现临界区(注:BASEPRI为优先级屏蔽寄存器,
    优先级数值大于或等于该寄存器的中断都会被屏蔽,优先级数值越大,逻辑优先级越低,但是为零时不屏蔽任何中断)。
    这允许RTOS内核可以只屏蔽一部分中断,因此可以提供一个灵活的中断嵌套模式。

     那些需要在中断调用时保护的API函数,FreeRTOS使用寄存器BASEPRI实现中断保护临界区。
    当进入临界区时,将寄存器BASEPRI的值设置成configMAX_SYSCALL_INTERRUPT_PRIORITY,当退出临界区时,将寄存器BASEPRI的值设置成0。
     很多Bug反馈都提到,当退出临界区时不应该将寄存器设置成0,应该恢复它之前的状态(之前的状态不一定是0)。
    但是Cortex-M NVIC决不会允许一个低优先级中断抢占当前正在执行的高优先级中断,不管BASEPRI寄存器中是什么值。
    与进入临界区前先保存BASEPRI的值,退出临界区再恢复的方法相比,退出临界区时将BASEPRI寄存器设置成0的方法可以获得更快的执行速度。
    
      RTOS内核通过写configMAX_SYSCALL_INTERRUPT_PRIORITY的值到BASEPRI寄存器的方法创建临界区。
     中断优先级0(具有最高的逻辑优先级)不能被BASEPRI寄存器屏蔽,因此,
      configMAX_SYSCALL_INTERRUPT_PRIORITY绝不可以设置成0
    

                                  ***2017.2.26***

你可能感兴趣的:([FreeRTOS学习] 重要概念)