admin管理员组

文章数量:1624351

RTOS中断嵌套方案将有效的中断优先级分成两组:一组可以通过RTOS临界区屏蔽,另一组不受RTOS影响,configMAX_SYSCALL_INTERRUPT_PRIORITY是两组中断的分界点,优先级高于分界点点的不受RTOS的控制(开启/关闭)

理解 FreeRTOS configMAX_SYSCALL_INTERRUPT_PRIORITY 和 configKERNEL_INTERRUPT_PRIORITY 需要从中断优先级管理和实时操作系统的工作原理入手。以下是对这两个配置参数的详细解释和理解:

configMAX_SYSCALL_INTERRUPT_PRIORITY

  • 定义configMAX_SYSCALL_INTERRUPT_PRIORITY 定义了可以调用 FreeRTOS API 函数的最高中断优先级。换句话说,它设置了可以安全调用 FreeRTOS 函数的中断的最大优先级。
  • 目的:确保 FreeRTOS 内核的关键部分不会被更高优先级的中断打断,这些中断可能会调用 FreeRTOS API 函数,从而导致竞态条件或数据损坏。
  • 使用:当配置一个中断时,如果该中断处理程序会调用 FreeRTOS API 函数,那么它的优先级应该设置为小于或等于 configMAX_SYSCALL_INTERRUPT_PRIORITY

configKERNEL_INTERRUPT_PRIORITY

  • 定义configKERNEL_INTERRUPT_PRIORITY 定义了内核时钟中断和其他核心 FreeRTOS 中断的优先级。
  • 目的:设置内核中断的优先级,确保它们在系统中具有最低的优先级。这允许其他中断抢占内核的时钟中断,这在实时系统中通常是需要的。
  • 使用:这个值通常设置为最低的优先级。例如,在 ARM Cortex-M 微控制器中,这可能设置为最高的数值(例如,对于 8 位优先级字段,可能是 255)。

示例配置

在Cortex-M内核中,假如有8个优先级,优先级取值范围是0~7,但数值最大的优先级7却代表着最低的逻辑优先级

对于具有 4 位优先级(0-15)的 ARM Cortex-M 微控制器:

#define configMAX_SYSCALL_INTERRUPT_PRIORITY 5

#define configKERNEL_INTERRUPT_PRIORITY 15 

在这个例子中(对cortex来说,0最高):

  • configMAX_SYSCALL_INTERRUPT_PRIORITY 设置为 5,意味着任何优先级 <= 5 (cortex中断)的中断都可以调用 FreeRTOS API 函数。
  • configKERNEL_INTERRUPT_PRIORITY 设置为 15,意味着内核的时钟中断具有最低的优先级,允许所有其他中断抢占它。

假设:configMAX_SYSCALL_INTERRUPT_PRIORITY 为5, MCU串口中断优先级被设置为6,那么串口中断就可以调用含有FromISR的函数, 如果Timer中断有消极为4,那么timer中断处理函数就不能调用FromISR

重要注意事项

  1. 优先级编号:不同的微控制器架构可能有不同的优先级编号方式。例如,ARM Cortex-M 使用较低的数值表示较高的优先级。
  2. 中断安全 API:只有某些 FreeRTOS API 函数可以从中断上下文中调用。这些函数通常以 "FromISR" 结尾。
  3. 配置一致性:确保你的中断配置中的优先级级别与 configMAX_SYSCALL_INTERRUPT_PRIORITY 和 configKERNEL_INTERRUPT_PRIORITY 定义的约束相匹配。

通过仔细配置这些参数,你可以确保基于 FreeRTOS 的应用程序可靠高效地运行,并且在内核操作和应用级中断处理之间有明确的分离。这样可以避免中断处理过程中出现竞态条件和数据损坏的问题。

本文标签: freeRTOSconfigMAXSYSCALLINTERRUPTPRIORITYconfigKERNELINTERRUPTPRIORITY