企业网站建设论坛,永久不收费免费的软件app,网站如何进行品牌建设,微信 怎么上传 wordpressFreeRTOS任务优先级和中断的优先级 前言硬件中断的优先级规则FreeRTOS任务的优先级规则FreeRTOS对中断优先级的管理具体的应用场景说明 混淆点澄清FreeRTOS任务优先级 vs 中断优先级任务优先级与中断优先级的本质区别注意事项 FreeRTOS的中断管理逻辑任务与中断的交互规则 实践… FreeRTOS任务优先级和中断的优先级 前言硬件中断的优先级规则FreeRTOS任务的优先级规则FreeRTOS对中断优先级的管理具体的应用场景说明 混淆点澄清FreeRTOS任务优先级 vs 中断优先级任务优先级与中断优先级的本质区别注意事项 FreeRTOS的中断管理逻辑任务与中断的交互规则 实践举例任务优先级配置中断优先级配置允许调用API的中断配置禁止调用API的高优先级中断 前言
可能你也有这样的疑问中断的优先级数值越小优先级越大还是越小FreeRTOS的任务而言数值越小优先级是越大还是越小什么是FreeRTOS管理中断的逻辑这些FreeRTOS任务优先级和中断的优先级总是让人混淆本文就此问题展开论述。
硬件中断的优先级规则
在大多数微控制器如ARM Cortex-M中
数值越小优先级越高。
例如Cortex-M的中断优先级寄存器通常为8位但仅使用高几位如4位范围为0~15。其中
0 表示最高优先级可打断其他所有中断。15 表示最低优先级被其他中断打断。
FreeRTOS任务的优先级规则
FreeRTOS中
数值越大优先级越高。 通过tskIDLE_PRIORITY通常为0定义最低优先级用户任务优先级范围为1~configMAX_PRIORITIES-1。例如// 创建一个优先级为3的任务数值越大优先级越高
xTaskCreate(vTaskFunction, Task, 1000, NULL, 3, NULL);FreeRTOS对中断优先级的管理
在硬件中断优先级体系里数值越小就代表优先级越高。以ARM Cortex - M为例中断优先级的范围一般是0到15其中0是最高优先级15则是最低优先级。 FreeRTOS通过configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY宏定义最高可管理的中断优先级但这里的数值规则与硬件一致
数值越小优先级越高。 例如// 配置FreeRTOS可管理的最高中断优先级为5数值越小优先级越高
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5这意味着优先级数值≤5的中断其优先级较高而优先级数值5的中断优先级相对较低。
FreeRTOS借助调整BASEPRI寄存器来屏蔽优先级较低的中断以此保障关键操作像任务切换的原子性。这里有几个关键点需要掌握
可管理的中断优先级当配置为5时优先级数值≥5的中断能够被FreeRTOS屏蔽。这类中断可以安全地调用FreeRTOS的ISR专用API例如xQueueSendFromISR()。系统关键中断优先级优先级数值5的中断FreeRTOS无法对其进行屏蔽。这类中断属于高优先级中断在使用时要格外谨慎不能调用FreeRTOS API。
具体的应用场景说明
允许调用API的中断配置 对于那些需要和任务进行通信的中断要把它们的优先级设置为≥5。下面是一个示例
// 配置外部中断优先级为5和FreeRTOS可管理的最高优先级相同
NVIC_SetPriority(USART1_IRQn, 5);void USART1_IRQHandler(void) {// 进行接收处理BaseType_t xHigherPriorityTaskWoken pdFALSE;xQueueSendFromISR(xRxQueue, cRxChar, xHigherPriorityTaskWoken);// 若有必要进行任务切换portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}禁止调用API的高优先级中断 系统关键中断例如滴答定时器SysTick其优先级数值要设置为5并且在中断服务函数中不能调用FreeRTOS API。示例如下
// 配置SysTick优先级为1高优先级不可被FreeRTOS屏蔽
NVIC_SetPriority(SysTick_IRQn, 1);void SysTick_Handler(void) {// 执行关键操作禁止调用FreeRTOS APItimer_update();
}混淆点澄清
FreeRTOS任务优先级 vs 中断优先级
任务优先级与中断优先级的本质区别 任务优先级 范围0空闲任务到configMAX_PRIORITIES-1。规则数值越大优先级越高高优先级任务可抢占低优先级任务。调度方式由FreeRTOS内核通过任务切换实现。 中断优先级 范围由硬件决定如Cortex-M的0~15。规则数值越小优先级越高高优先级中断可抢占低优先级中断。调度方式由硬件直接控制不受FreeRTOS调度器管理。
注意事项
任务 vs 中断中断优先级始终高于任务无论任务优先级多高中断都会立即响应。
FreeRTOS的中断管理逻辑
FreeRTOS通过调整BASEPRI寄存器屏蔽低优先级中断但屏蔽规则与硬件一致
若BASEPRI5则优先级数值≥5的中断被屏蔽优先级数值5的中断仍可触发。
任务与中断的交互规则 中断始终优先于任务 无论任务优先级多高当中断发生时 中断服务函数ISR会立即执行。任务被暂停直到ISR返回。 FreeRTOS对中断的限制 可管理中断优先级≥configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 可调用FreeRTOS API可能触发任务切换如xTaskResumeFromISR()。不可管理中断优先级configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 禁止调用FreeRTOS API执行期间无法被FreeRTOS屏蔽。
实践举例
任务优先级配置
使用较小数值定义低优先级任务较大数值定义高优先级任务
// 低优先级任务后台处理
xTaskCreate(vBackgroundTask, Background, 1000, NULL, 1, NULL);// 高优先级任务实时处理
xTaskCreate(vCriticalTask, Critical, 1000, NULL, configMAX_PRIORITIES-1, NULL);中断优先级配置
将需要调用FreeRTOS API的中断优先级设置为不低于configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
// 配置外部中断0的优先级为5与FreeRTOS可管理的最高优先级一致
NVIC_SetPriority(EXTI0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);这里的优先级数值必须大于等于5
允许调用API的中断配置
对于那些需要和任务进行通信的中断要把它们的优先级设置为≥5。下面是一个示例
// 配置外部中断优先级为5和FreeRTOS可管理的最高优先级相同
NVIC_SetPriority(USART1_IRQn, 5);void USART1_IRQHandler(void) {// 进行接收处理BaseType_t xHigherPriorityTaskWoken pdFALSE;xQueueSendFromISR(xRxQueue, cRxChar, xHigherPriorityTaskWoken);// 若有必要进行任务切换portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}禁止调用API的高优先级中断
系统关键中断例如滴答定时器SysTick其优先级数值要设置为5并且在中断服务函数中不能调用FreeRTOS API。示例如下
// 配置SysTick优先级为1高优先级不可被FreeRTOS屏蔽
NVIC_SetPriority(SysTick_IRQn, 1);void SysTick_Handler(void) {// 执行关键操作禁止调用FreeRTOS APItimer_update();
}本文到此结束不知道您看到这里是否可以回答开头的问题如果有帮助到您欢迎点赞、收藏、转发