嵌入式实时系统需要对外界的某个事件做出及时的响应动作。例如串口外设收到了一帧数据后,需要通知数据解析任务,同时还要将数据帧传递给解析任务,完成数据的处理。设计出一种好的策略来完成这个过程时需要考虑以下几个问题:
- 如何检测事件?中断是主要的事件检测手段,有时候也可以使用轮询法。
- 当中断发生后,应该将多少处理工作放在中断服务函数(ISR)中,将另外的多少处理工作放在中断函数外(例如main函数)?通常的经验是,在中断服务函数中尽可能做最少的工作,保证中断服务函数能迅速执行完成。
- 当中断检测到事件发生时,中断函数如何与main函数通信?如何让他们同步起来?
FreeRTOS提供的一些机制能够很好的解决以上问题。
首先我们需要明白一点,FreeRTOS的任务优先级和单片机的中断优先级是不同的,是两个不同层次的概念:
- 任务以及任务优先级是FreeRTOS抽象出的软件层次的概念,与FreeRTOS应用程序所运行的硬件系统无关。任务优先级的意义和行为由FreeRTOS内核定义和控制。
- 中断是单片机硬件提供的一种机制,通过对单片机的中断相关寄存器进行设置,来控制中断的响应和处理过程。当中断发生时,中断服务函数(ISR)会打断任何优先级的运行着的任务,无论这个中断的优先级多么低。然而任务在任何情况下都不能打断中断函数的运行。
在中断函数中使用FreeRTOS的API
在FreeRTOS中,许多内核函数都有两个版本,一个是普通版本,另一个是带"FromISR"后缀的版本,也可以叫做“