FreeRTOS 操作系统学习(六) 中断处理

                                                     FreeRTOS 操作系统学习

http://wiki.csie.ncku.edu.tw/embedded/FreeRTOS_Melot.pdf

5   中断处理

    中断机制是完全由硬件产生和处理的。软件,尤其是FreeRTOS任务或内核只能提供处理给定中断的方法,也可以通过调用硬件指令来引发某些中断。我们将假设我们正在使用一个有7级中断的处理器。中断号值越大,相比于与其他中断的优先级越高。 这也取决于硬件,并不是总是这样。在任何情况下,硬件中断优先级都与任务优先级无关,并且总是优先于任务优先级。

     中断处理程序的函数不能在FreeRTOS API范围内:通过上一节中描述的常规功能,禁止访问队列或信号量,但是FreeRTOS提供了一些专用功能可用于中断:例如,在中断处理程序中,必须使用xSemaphoreGiveFromISR()代替xSemaphoreGive()实现对信号量的V()操作。这些方法的原型可能会产生一些问题(如 xSemaphoreGiveFromISR()),这种实现机制,用户必须意识到,此操作会使中断被优先级较高的中断抢占 从而完成Give操作解锁)。

     可以使用FreeRTOSConfig.h中的常量在FreeRTOS中配置中断管理。

  • configKERNEL_INTERRUPT_PRIORITY               设置中断的优先级    
  • configMAX_SYSCALL_INTERRUPT_PRIORITY    指定RTOS内核使用的中断优先级,一般设为最大值(最低优先级),定义了可用于使用FreeRTOS API 中断安全函数的中断的最高中断级别。 如果未定义此常数,则任何使用FreeRTOS API的中断处理函数都必须在configKERNEL_INTERRUPT_PRIORITY处执行。 

    如果中断的优先级大于 configMAX_SYSCALL_INTERRUPT_PRIORITY    或  configKERNEL_INTERRUPT_PRIORITY 或configMAX_SYSCALL_INTERRUPT_PRIORITY 未定义,永远不会被内核抢占,但是被禁止使用FreeRTOS API函数。

                                                  FreeRTOS 操作系统学习(六) 中断处理

                                                                             图9 FreeRTOS的中断组织

5.1  使用二值信号量处理中断

      中断的处理是由控制器代码完成的而非FreeRTOS。由于操作系统无法处理中断,所以这可能会导致一些内存访问的问题,这就是为什么不同版本中存在几个函数的原因:一个用于常规任务,另一个用于中断处理程序。例如xQueueReceive()和wQueueReceiveFromISR()的队列管理功能就是这种情况。 因此,有必要使中断处理程序的执行时间尽可能短。
实现此目标的方法包括创建等待带有信号量中断的任务。图10给出了一种解决方案,可显着减少ISR的运行时间。 ISR“给予”信号量并取消阻止能够处理ISR的“处理程序”任务,从而使ISR执行时间大大缩短。

FreeRTOS 操作系统学习(六) 中断处理

                                  图10  另一种中断处理方式:常规任务等待带有信号量的中断发生并进行处理

 

5.2  临界内存

      有时需要保护部分代码不受任何更改的影响,以防止计算逻辑被破坏或I / O操作出现混乱。FreeRTOS提供了两种机制来保护。 一些保护免受调度程序操作或中断事件的影响,另一些仅防止调度程序抢占任务。

     处理此问题非常重要,因为许多指令(例如,情感)看起来很原子,但需要多条硬件指令(将变量地址加载到寄存器中,将值加载到另一个寄存器中,然后使用这两个寄存器将值移动到对应的内存地址中) 。

5.2.1   中断挂起