当前位置: 首页 > news >正文

FreeRTOS使任务处于阻塞态的API

在FreeRTOS中,任务进入阻塞状态通常是因为等待某个事件或资源。以下是常用的使任务进入阻塞态的API及其分类:


1. 任务延时

  • vTaskDelay(pdMS_TO_TICKS(ms))
    将任务阻塞固定时间(相对延时,从调用时开始计算)。
    示例:vTaskDelay(pdMS_TO_TICKS(100)) 阻塞100毫秒。

  • vTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(ms))
    按固定频率阻塞任务(绝对时间,用于周期性任务)。
    示例:实现精确的10ms周期任务。


2. 队列操作

  • xQueueReceive(xQueue, &buffer, pdMS_TO_TICKS(timeout))
    从队列读取数据,若队列为空则阻塞,直到数据到达或超时。

  • xQueuePeek(xQueue, &buffer, pdMS_TO_TICKS(timeout))
    查看队列数据(不移除),若队列为空则阻塞。

  • xQueueSend(xQueue, &data, pdMS_TO_TICKS(timeout))
    向队列发送数据,若队列满则阻塞,直到空间可用或超时。


3. 信号量

  • xSemaphoreTake(xSemaphore, pdMS_TO_TICKS(timeout))
    获取信号量,若信号量不可用则阻塞,常用于互斥量、二进制信号量。

4. 事件组

  • xEventGroupWaitBits(xEventGroup, uxBitsToWaitFor, xClearOnExit, xWaitForAllBits, pdMS_TO_TICKS(timeout))
    等待事件组中的特定位被置位,满足条件前任务阻塞。

5. 任务通知

  • ulTaskNotifyTake(pdTRUE, pdMS_TO_TICKS(timeout))
    等待任务通知(类似二进制信号量),通知值减1。

  • xTaskNotifyWait(0, ULONG_MAX, &ulValue, pdMS_TO_TICKS(timeout))
    等待任务通知并获取通知值,支持更复杂场景。


6. 流缓冲区和消息缓冲区

  • xStreamBufferReceive(xStreamBuffer, &data, size, pdMS_TO_TICKS(timeout))
    从流缓冲区读取数据,缓冲区为空时阻塞。

  • xMessageBufferReceive(xMessageBuffer, &msg, size, pdMS_TO_TICKS(timeout))
    从消息缓冲区接收完整消息,无消息时阻塞。


关键区别

  • 阻塞与挂起:阻塞是等待事件(自动恢复),挂起需手动恢复(vTaskSuspend/vTaskResume)。
  • 超时参数:上述API通常含timeout参数,设为portMAX_DELAY会无限阻塞(需配置INCLUDE_vTaskSuspend为1)。

示例场景

// 等待信号量,最多阻塞500ms
if (xSemaphoreTake(xSemaphore, pdMS_TO_TICKS(500)) == pdTRUE) {
    // 成功获取信号量
}

// 从队列接收数据,无限阻塞
xQueueReceive(xQueue, &data, portMAX_DELAY);

这些API通过让任务等待特定条件,有效管理了CPU资源,适用于事件驱动或同步操作的设计。


在这里插入图片描述

相关文章:

  • jvm内存如何调优
  • UWB双通道隧道人员定位方案
  • KWDB创作者计划—KWDB:国产分布式多模数据库的创新实践
  • java爬虫案例
  • JAVA SE 自我总结
  • React useEffect
  • 虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解?
  • 双数之和+三数之和+四数之和
  • CyclicBarrier 基本用法
  • 【JS进阶】对象解构与数组解构
  • 基于3A4000及CentOS的银河麒麟V10离线源码编译安装VLC
  • Java八股文背诵 第四天JVM
  • BC3 有容乃大(sizeof关键字,sizeof(long long) >= sizeof(long) >= sizeof(int)
  • Spring 中的 @Cacheable 缓存注解
  • Hook_Unfinished
  • 【含文档+PPT+源码】基于微信小程序的学校体育馆操场预约系统的设计与实现
  • python的web框架flask(hello,world版)
  • 【读者求助】如何跨行业进入招聘岗位?
  • 并发编程--互斥锁与读写锁
  • Linux基础1
  • 关于我们做网站/广州网站关键词推广
  • aspcms网站地图生成/谷歌google play官网下载
  • 微信网站开发哪家好/seo刷点击软件
  • 塘沽网站建设/软件拉新推广平台
  • 建一个国外网站多少钱/今日军事新闻头条
  • 基金网站建设/最好的bt种子搜索引擎