FreeRTOS 是一款适用于嵌入式系统的实时操作系统,它支持任务和中断处理程序。在 FreeRTOS 中,任务和中断处理程序都具有优先级,但是当它们同时发生时,可能会产生冲突。下面介绍 FreeRTOS 如何解决这个问题:
1、任务优先级
FreeRTOS 中每个任务都有自己的优先级,可以使用函数 vTaskPrioritySet()
来设置任务的优先级。当多个任务同时处于就绪状态时,FreeRTOS 会根据任务的优先级来选择要运行的任务。任务的优先级越高,就越容易先被调度。
2、中断优先级
FreeRTOS 中每个中断请求都有自己的优先级,可以使用 NVIC_SetPriority()
函数来设置中断的优先级。当多个中断同时发生时,FreeRTOS 会根据中断的优先级来决定哪个中断先被服务。
3、冲突解决
如果一个中断比当前运行的任务的优先级更高,那么 FreeRTOS 将立即挂起正在运行的任务,并执行中断服务程序。当中断服务程序执行完毕后,FreeRTOS 将重新调度任务。如果多个中断同时发生,FreeRTOS 会根据它们的优先级来确定优先服务哪个中断。
为了确保任务优先级和中断优先级不发生冲突,FreeRTOS 要求中断服务程序使用``taskENTER_CRITICAL()和
taskEXIT_CRITICAL()` 函数将临界区包含起来。这样可以避免中断服务程序在访问共享资源时被其他高优先级任务打断。
综上所述,FreeRTOS 通过设置任务和中断的优先级以及使用临界区来解决任务优先级和中断优先级的冲突问题。