taskENTER_CRITICAL
时间: 2023-08-11 22:07:33 浏览: 191
`taskENTER_CRITICAL` 是一个宏定义,用于进入临界区,防止任务被中断。在 FreeRTOS 中,任务可以被中断打断,如果在任务执行的关键代码段被中断打断,可能会导致数据不一致或者出现其他问题。`taskENTER_CRITICAL` 会禁止任务被中断打断,直到调用 `taskEXIT_CRITICAL` 或者 `taskEXIT_CRITICAL_FROM_ISR` 才会解除临界区。这样可以保证任务执行关键代码段时不会被中断打断,保证数据的一致性和正确性。
相关问题
taskenter_critical
taskenter_critical是一个函数,用于进入临界区。在多线程编程中,临界区是指一段代码,在该代码段中,对共享资源的访问是互斥的,即同一时刻只能有一个线程访问该资源。taskenter_critical函数可以保证在进入临界区之前,先禁止中断,以避免多个线程同时进入临界区,从而保证了共享资源的安全性。
taskENTER_CRITICAL_FROM_ISR
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 宏定义。