freertos里的任务是怎么进入阻塞态的?
时间: 2024-04-20 18:25:13 浏览: 21
在FreeRTOS中,任务可以通过多种方式进入阻塞态,具体取决于任务所需的等待条件。以下是一些常见的任务进入阻塞态的方式:
1. 调用延时函数:任务可以通过调用 `vTaskDelay()` 或 `vTaskDelayUntil()` 函数来进入阻塞态一段时间。这些函数会使任务进入延时等待状态,在指定的时间后重新变为就绪状态。
2. 等待事件或信号量:任务可以通过调用 `xEventGroupWaitBits()`、`xSemaphoreTake()` 或 `xQueueReceive()` 等函数来等待事件、信号量或队列中的数据。如果等待的条件不满足,任务将进入阻塞态,直到条件满足后才会被唤醒。
3. 等待互斥量:任务可以通过调用 `xSemaphoreTake()` 函数来等待互斥量。如果互斥量当前被其他任务占用,则任务将进入阻塞态,直到互斥量可用时才会被唤醒。
4. 等待消息通知:任务可以通过调用 `ulTaskNotifyTake()` 或 `xTaskNotifyWait()` 函数来等待消息通知。当其他任务发送通知给该任务时,它将从阻塞态转换为就绪态。
5. 等待软件定时器:任务可以通过调用 `xTimerStart()` 函数启动软件定时器,并通过 `xTimerChangePeriod()` 或 `xTimerReset()` 函数设置定时器的周期。当定时器超时时,任务将从阻塞态转换为就绪态。
任务进入阻塞态后,会让出CPU资源给其他就绪任务执行,直到任务的等待条件满足后再次变为就绪态并被调度执行。这种方式可以有效地利用系统资源,避免了忙等待的情况。
需要注意的是,任务进入阻塞态之前,需要确保关键资源的正确释放,以避免产生竞态条件或死锁等问题。同时,任务的优先级和调度策略也会影响任务从阻塞态到就绪态的唤醒顺序。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)