为何PendSV作为最低优先级中断,在RTOS中被设为15?
PendSV优先级数值设置疑问解答
相关FreeRTOS配置代码
/* The lowest interrupt priority that can be used in a call to a "set priority" function. */ #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 /* The highest interrupt priority that can be used by any interrupt service routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER PRIORITY THAN THIS! (higher priorities are lower numeric values. */ #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
疑问
为何作为最低优先级中断的PendSV,在RTOS中被设置为数值15?结合上述FreeRTOS配置代码,我原本预期:若PendSV在main()函数执行后处于最低优先级,其优先级数值应接近0才合理。
解答
核心原因是ARM Cortex-M内核的中断优先级编号规则和你直觉的相反:在Cortex-M架构里,中断优先级的数值越大,实际优先级越低;数值越小,优先级越高——0是系统能设置的最高优先级。
回到FreeRTOS的配置:
configLIBRARY_LOWEST_INTERRUPT_PRIORITY定义为15,意思是系统允许使用的**最低优先级(数值最大)**就是15。- PendSV的作用是处理RTOS的任务切换,它必须是系统里优先级最低的中断,这样才会在所有高优先级中断、高优先级任务都执行完毕后才触发,绝对不会打断关键的高优先级工作。所以把它设为15,正好匹配配置里定义的最低优先级,完全符合设计需求。
你之前的误区是把优先级数值的逻辑搞反了,调整这个认知后就明白为什么PendSV要设为15了。
内容的提问来源于stack exchange,提问作者Tejas Rane
相关产品推荐
相关产品推荐

