taskENTER_CRITICAL_FROM_ISR
时间: 2023-06-23 13:51:26 浏览: 109
taskENTER_CRITICAL_FROM_ISR 是 FreeRTOS 中的宏定义,在中断服务函数中使用。它用于进入临界区,并保护临界区内的数据不会被其他中断打断或修改。
taskENTER_CRITICAL_FROM_ISR 的主要作用是将中断服务函数中的 `portDISABLE_INTERRUPTS()` 宏定义替换为 `taskENTER_CRITICAL_FROM_ISR()`,从而保证临界区内的代码不会被其他中断打断。
由于中断服务函数中不能直接调用 FreeRTOS 的 API 函数,因此需要使用 taskENTER_CRITICAL_FROM_ISR 宏定义来实现临界区保护。这个宏定义会将 CPSR 寄存器的 IRQ 位清零,从而禁止其他中断打断当前中断服务函数。
taskENTER_CRITICAL_FROM_ISR 的使用示例如下:
```
void EXTI_IRQHandler(void)
{
// 进入临界区
taskENTER_CRITICAL_FROM_ISR();
// 执行需要保护的代码段
// 退出临界区
taskEXIT_CRITICAL_FROM_ISR();
}
```
需要注意的是,taskENTER_CRITICAL_FROM_ISR 宏定义只能用于中断服务函数中,不能用于任务函数中。如果需要在任务函数中实现临界区保护,可以使用 taskENTER_CRITICAL 和 taskEXIT_CRITICAL 宏定义。
相关问题
taskENTER_CRITICAL
`taskENTER_CRITICAL` 是一个宏定义,用于进入临界区,防止任务被中断。在 FreeRTOS 中,任务可以被中断打断,如果在任务执行的关键代码段被中断打断,可能会导致数据不一致或者出现其他问题。`taskENTER_CRITICAL` 会禁止任务被中断打断,直到调用 `taskEXIT_CRITICAL` 或者 `taskEXIT_CRITICAL_FROM_ISR` 才会解除临界区。这样可以保证任务执行关键代码段时不会被中断打断,保证数据的一致性和正确性。
taskENTER CRITICAL FROM ISR
taskENTER_CRITICAL_FROM_ISR是一个宏定义,用于进入临界区,以确保ISR代码中访问共享资源的原子性和可重入性。与taskENTER_CRITICAL宏定义不同的是,taskENTER_CRITICAL_FROM_ISR宏定义在ISR中使用,其实现方式是通过禁止调度器中断来实现临界区。由于ISR具有高优先级,因此在ISR中进入临界区时,RTOS会自动禁止低于ISR优先级的中断,从而确保临界区中的代码不会被其他中断打断。这是在ISR中使用taskENTER_CRITICAL_FROM_ISR宏定义的原因。