1、任务优先级和中断优先级的区别
中断是MCU的硬件特性,由硬件事件或软件信号引起中断,运行哪个ISR是由硬件决定的。中断的优先级数字越低表示优先级别越高,所以中断的最高优先级为0
FreeRTOS的任务是一个纯软件的概念,与硬件系统无关。任务的优先级是编程者在软件中赋予的,任务的优先级数字越低表示优先级越低,所以任务的最低优先级为0。FreeRTOS的任务调度算法决定哪个任务处于运行状态
注意:
任务只有在没有ISR运行的时候才能运行,即使优先级最低的中断也可以抢占高优先级的任务的执行,而任务不能抢占ISR的运行【这一句需要重点解释】
2、中断屏蔽和临界代码段
一个任务函数在执行的时候,可能会被其他高优先级的任务抢占CPU,也可能被任何一个中断的ISR函数抢占CPU。在某些时候,任务的某段代码可能很关键,需要连续执行完,不希望被其他任务或中断打断,这种程序段称为临界段(Critical Section)
3、在ISR函数中使用FreeRTOS API函数注意事项
在中断的ISR里调用普通的API函数可能会存在问题,例如调用一个API函数使一个任务进入阻塞状态,因为ISR执行的时候是不能进行任务调度的。
为此,FreeRTOS的API函数分为两个版本:一个称为“任务级”,也就是普通名称的API函数;另一个称为“中断级”,即带后缀“FromISR”的函数或带后缀“FROM ISR”的宏函数,中断级API函数也被称为中断安全API函数。
注意:
在ISR中绝对不能使用任务级API函数,但是在任务函数中可以使用中断级API函数。而且,在FreeRTOS不能管理的高优先级中断的ISR里,连中断级API函数也不能用
4、中断及其ISR程序设计原则
中断的优先级和ISR函数程序设计应该遵循如下的原则:
【1】中断分为FreeRTOS不可屏蔽中断和可屏蔽中断,要根据中断的重要性和功能为其设置合适的中断优先级。
【2】ISR函数的代码应该尽量简短,将处理功能延迟到任务里去实现。
【3】在可屏蔽中断的ISR函数里能调用中断级的FreeRTOS API函数,绝对不能调用普通的FreeRTOS API函数。在不可屏蔽中断的ISR函数里,不能调用任何的FreeRTOSAPI函数。