美文网首页FreeRTOS
[FreeRTOS学习] 重要概念

[FreeRTOS学习] 重要概念

作者: EleZtian | 来源:发表于2017-02-26 19:41 被阅读0次
    • 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学习] 重要概念

        本文链接:https://www.haomeiwen.com/subject/nrpnwttx.html