最新的 FreeRTOS 移植中允许中断嵌套。中断嵌套需要在 FreeRTOSConfig.h 中
定义表 表 17 详细列出的一个或两个常量。
表 17 控制中断嵌套的常量
常量 描述
configKERNEL_INTERRUPT_PRIORITY 设置系统心跳时钟的中断优先级。
如 果 在 移 植 中 没 有 使 用 常 量
configMAX_SYSCALL_INTERRUPT_PRIORITY ,那
么需要调用中断安全版本 FreeRTOS API
的中断都必须运行在此优先级上。
configMAX_SYSCALL_INTERRUPT_PRIORITY 设置中断安全版本 FreeRTOS API 可以运
行的最高中断优先级。
建立一个全面的中断嵌套模型需要设置 configMAX_SYSCALL_INTERRUPT_PRIRITY
为比 configKERNEL_INTERRUPT_PRIORITY 更高的优先级。这种模型在图35中有所展示。
图 35 所示的情形假定常量 configMAX_SYSCALL_INTERRUPT_PRIRITY 设置为 3,
configKERNEL_INTERRUPT_PRIORITY 设置为 1。同时也假定这种情形基于一个具有七个
不同中断优先及的微控制器。这里的七个优先级仅仅是本例的一种假定,并非对应于任
何一种特定的微控制器架构。
在任务优先级和中断优先级之间常常会产生一些混淆。图 35 所示的中断优先级是
由微控制器架构体系所定义的。中断优先级是硬件控制的优先级,中断服务例程的执行
会与之关联。任务并非运行在中断服务中,所以赋予任务的软件优先级与赋予中断源的
硬件优先级之间没有任何关系。
如图 35 所示:
· 处于中断优先级 1 到 3(含)的中断会被内核或处于临界区的应用程序阻塞执行,但是
它们可以调用中断安全版本的 FreeRTOS API 函数
· 处于中断优先级 4 及以上的中断不受临界区影响,所以其不会被内核的任何行为阻
塞,可以立即得到执行——这是由微控制器本身对中断优先级的限定所决定的。通
常 需 要 严 格 时 间 精 度 的 功 能 ( 如 电 机 控 制 ) 会 使 用 高 于
configMAX_SYSCALL_INTERRUPT_PRIRITY 的优先级,以保证调度器不会对其中断响
应时间造成抖动。
· 不需要调用任何 FreeRTOS API 函数的中断,可以自由地使用任意优先级。
对 对 ARM Cortex M3 用户的一点提示
Cortex M3 使用低优先级号数值表示逻辑上的高优先级中断。这显得不是那么直
观,所以很容易被忘记。如果你想对某个中断赋予低优先级,则必须使用一个高优先级
号数值。千万不要给它指定优先级号 0(或是其它低优先级号数值),因为这将会使得这
个 中 断 在 系 统 中 拥 有 最 高 优 先 级 — — 如 果 这 个 优 先 级 高 于
configMAX_SYSCALL_INTERRUPT_PRIRITY ,将很可能导致系统崩溃。
Cortex M3 内核的最低优先级为 255,但是不同的 Cortex M3 处理器厂商实现的优
先级位数不尽相同,而各自的配套库函数也使用了不同的方式来支持中断优先级。比如
STM32,ST 的驱动库中将最低优先级指定为 15,而最高优先级指定为 0。