FreeRTOS事件组----任务同步

2023-05-16

有时,应用程序的设计需要两个或多个任务才能彼此同步。例如,考虑一个设计,其中任务A接收一个事件,然后将事件所需的一些处理提供给其他三个任务:任务B,任务C和任务D。如果任务A在任务B,C和D已经全部完成了对上一个事件的处理,那么所有这四个任务将需要彼此同步。每个任务的同步点将在该任务完成其处理之后,并且无法继续进行,直到其他每个任务都完成了相同的任务。在所有四个任务都达到其同步点之后,任务A才能接收另一个事件。

事件组可用于创建同步点:

  1. 必须在同步组中为每个必须参与同步的任务分配一个唯一的事件位。
  2. 每个任务到达同步点时都会设置自己的事件位。
  3. 设置好自己的事件位后,事件组中的每个任务块都将等待代表所有其他同步任务的事件位也被置位。

但是,在这种情况下不能使用xEventGroupSetBits()和xEventGroupWaitBits()API函数。如果使用它们,则将位的设置(以指示任务已到达其同步点)和位的测试(以确定其他同步任务是否已到达其同步点)将作为两个单独的操作执行。若要查看为什么会出现问题,请考虑以下情形:任务A,任务B和任务C尝试使用事件组进行同步:

★任务A和任务B已经到达同步点,因此它们的事件位在事件组中已设置,并且它们处于“阻塞”状态,等待任务C的事件位也被置位。

★任务C到达同步点,并使用xEventGroupSetBits()设置其在事件组中的位。一旦设置了任务C的位,任务A和任务B就会退出“阻塞”状态,并清除所有三个事件位。

★然后,任务C调用xEventGroupWaitBits()等待所有三个事件位被置位,但是到那时,所有三个事件位已经被清除,任务A和任务B离开了各自的同步点,因此同步失败了。 。

若要成功使用事件组创建同步点,必须将事件位的设置以及事件位的后续测试作为单个不间断操作执行。为此提供了xEventGroupSync()API函数。

xEventGroupSync()API 函数

xEventGroupSync函数,允许两个或多个任务使用一个事件组相互同步。该函数允许任务在事件组中设置一个或多个事件位。然后等待事件位的组合在同一事件组中被设置为单个不可中断的操作。

xEventGroupSync()函数中的uxBitsToWaitFor参数是指定调用任务的解除阻塞条件。如果xEventGroupSync()因为已满足解除阻塞条件而返回,则在xEventGroupSync()返回之前,将uxBitsToWaitFor指定的事件位清零。

EventBits_t xEventGroupSync(EventGroupHandle_t xEventGroup,
                            const EventBits_t uxBitsToSet,
                            const EventBits_t uxBitsToWaitFor,
                            TickType_t xTicksToWait);

                                              xEventGroupSync()参数和返回值

参数名称

                                                     描述

 

xEventGroup

事件组的句柄,用来在其中设置事件位,然后对其进行测试。事件组句柄是创建事件组的xEventGroupCreate()的调用的返回值。

uxBitsToSet

一个位掩码,用于指定要在事件组中设置为1的一个或多个事件位。通过将事件组的现有值与uxBitsToSet中传递的值进行按位或运算,可以更新事件组的值。

 

例如,将uxBitsToSet设置为0x04(二进制0100)将导致事件位3被置位(如果尚未设置),而事件组中的所有其他事件位均保持不变。

 

uxBitsToWaitFor

位掩码,指定要在事件组中测试的一个或多个事件位。

 

例如,如果调用任务想要等待事件位0、1和2在事件组中被设置,则将uxBitsToWaitFor设置为0x07(二进制111)。

 

xTicksToWait

任务应保持在“阻塞”状态以等待其解除阻塞条件所需的最长时间。

 

如果xTicksToWait为零,或者在调用xEventGroupSync()时满足解锁条件,则xEventGroupSync()将立即返回。

 

块时间以滴答周期指定,因此它表示的绝对时间取决于滴答频率。宏pdMS_TO_TICKS()可用于将以毫秒为单位的时间转换为以刻度为单位的时间。

 

如果在FreeRTOSConfig.h中将INCLUDE_vTaskSuspend设置为1,则将xTicksToWait设置为portMAX_DELAY将导致任务无限期等待(无超时)。

 

返回值

如果由于满足调用任务的取消阻塞条件而返回xEventGroupSync(),则返回值是满足调用任务的取消阻塞条件时事件组的值(在自动将所有位清零之前)。在这种情况下,返回的值也将满足调用任务的解锁条件。

 

如果由于xTicksToWait参数指定的阻塞时间到期而返回xEventGroupSync(),则返回的值是阻塞时间到期时事件组的值。在这种情况下,返回的值将不满足调用任务的取消阻塞条件。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS事件组----任务同步 的相关文章

  • 心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102)

    文章目录 前言 介绍 系统框架 原项目地址 本项目开发开源地址 硬件PCB 软件功能 详细内容 硬件外壳制作 WS2812级联及控制 MAX30102血氧传感器 0 96OLED FreeRTOS 效果视频 总结 前言 在好几年前 我好像就
  • FreeRTOS系列

    1 多任务系统 1 1 前后台系统 单片机裸机开发时 一般都是在main函数里面用while 1 做一个大循环来完成所有的处理 循环中调用相应的函数完成所需的处理 有时也需要在中断中完成一些处理 相对于多任务系统而言 这就是单人单任务系统也
  • 详解FreeRTOS中的软件定时器

    软件定时器用于让某个任务定时执行 或者周期性执行 比如设定某个时间后执行某个函数 或者每隔一段时间执行某个函数 由软件定时器执行的函数称为软件定时器的回调函数 参考资料 Mastering the FreeRTOS Real Time Ke
  • 【FreeRtos学习笔记】STM32 CubeMx——Timers(定时器)

    目录 1 软件定时器 2 示例程序 2 1 例程功能 2 2 步骤 2 3 实验结果 2 4 函数讲解 1 软件定时器 定时器是MCU常用的外设 我们在学习各种单片机时必然会学习它的硬件定时器 但是 MCU自带的硬件定时器资源是有限的 而且
  • FreeRTOS记录(七、FreeRTOS信号量、事件标志组、邮箱和消息队列、任务通知的关系)

    我们在前面单独介绍过FreeRTOS的任务通知和消息队列 但是在FreeRTOS中任务间的通讯还有信号量 邮箱 事件组标志等可以使用 这篇文章就这些成员与消息队列和任务通知的关系进行说明分析 增加邮箱部分 任务通知发送消息 Demo 202
  • FreeRTOS 软件定时器的使用

    FreeRTOS中加入了软件定时器这个功能组件 是一个可选的 不属于freeRTOS内核的功能 由定时器服务任务 其实就是一个定时器任务 来提供 软件定时器是当设定一个定时时间 当达到设定的时间之后就会执行指定的功能函数 而这个功能函数就叫
  • FreeRTOS软件定时器创建、复位、开始和停止(备忘)

    目录 一 简介 1 1 开发环境 1 2 摘要 二 STM32CubeIDE配置 三 创建定时器 3 1 头文件声明 3 2 工程文件定义 3 3 创建定时器 3 4 开启 复位 和关闭定时器 四 定时器回调函数 一 简介 1 1 开发环境
  • 一文教你学会keil软件仿真

    仿真在我们调试代码中是非常重要的 通过仿真 我们可以快速定位到错误代码 或者错误逻辑的地方 这里我就以上一篇博客为例 教大家如何软件仿真 软件仿真不需要单片机 直接通过keil软件进行代码调试 一 打开工具 二 选择软件仿真 三 开始仿真
  • FreeRTOS学习(八) 延时函数

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 FreeRTOS延时函数有两个 分别是 vTaskDelay vTaskDelayUntil 1 vTaskDelay 任务相对延时 函数原型
  • freeRTOS使用uxTaskGetStackHighWaterMark函数查看任务堆栈空间的使用情况

    摘要 每个任务都有自己的堆栈 堆栈的总大小在创建任务的时候就确定了 此函数用于检查任务从创建好到现在的历史剩余最小值 这个值越小说明任务堆栈溢出的可能性就越大 FreeRTOS 把这个历史剩余最小值叫做 高水位线 此函数相对来说会多耗费一点
  • FreeRTOS_中断

    传送门 博客汇总帖 传送门 Cortex M3 中断 异常 传送门 Cortex M3笔记 基础 笔记内容参考 正点原子的FreeRTOS开发手册 cortex m3权威指南 Cortex M3和Cortex M4权威指南等 文中stm32
  • 基于HAL库的FREERTOS-----------三.队列

    一 队列简介 在实际的应用中 常常会遇到一个任务或者中断服务需要和另外一个任务进行 沟通交流 这个 沟通交流 的过程其实就是消息传递的过程 在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式 但是如果在使用操作系统的应用中用
  • stm32f103zet6移植标准库的sdio驱动

    sdio移植 st官网给的标准库有给一个用于st出的评估板的sdio外设实现 但一是文件结构有点复杂 二是相比于国内正点原子和野火的板子也有点不同 因此还是需要移植下才能使用 当然也可以直接使用正点原子或野火提供的实例 但为了熟悉下sdio
  • FreeRTOS死机原因

    1 中断回调函数中没有使用中断级API xxFromISR 函数 xSemaphoreGiveFromISR uart busy HighterTask 正确 xSemaphoreGive uart busy 错误 2 比configMAX
  • [FreeRTOS入门学习笔记]定时器

    定时器的使用步骤 1 定义一个handle xTimerCreate创建 2 启动定时器 在Task1中调用 通过队列通知守护任务来执行定时器任务 要再config头文件中定义守护任务相关配置 虽然定时器是在task1中启动 但是定时器的任
  • STM32 Freertos 添加 外部sram heap_5.c

    1 添加外部SRAM 初始化 2 添加heap 5 c 3 初始化heap 5 c 外部堆栈 Define the start address and size of the two RAM regions not used by the
  • FreeRTOS 配置TICK_RATE_HZ

    我使用的是带有 5 4 版 FreeRTOS 的 MSP430f5438 我有一个有趣的问题 我无法弄清楚 基本上 当我将 configTICK RATE HZ 设置为不同的值时 LED 闪烁得更快或更慢 它应该保持相同的速率 我将 con
  • 使用 GCC 编译器的 ARM 内核的堆栈回溯(当存在 MSP 到 PSP 切换时)

    核心 ARM Cortex M4 编译器 GCC 5 3 0 ARM EABI 操作系统 免费 RTOS 我正在使用 gcc 库函数 Unwind Reason Code Unwind Backtrace Unwind Trace Fn v
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d

随机推荐

  • Ubuntu系统中清理DNS缓存

    在下一篇文章中 xff0c 我们将看一看 我们如何在Ubuntu中刷新DNS缓存 DNS被认为是Internet连接的关键部分之一 目的是更快地访问访问的网站 更常见的是 xff0c 我们的机器会跟踪DNS记录 xff0c 或者将其缓存 迄
  • Active Directory账号登陆confluence报773错误解决办法

    confluence集成的Active Directory xff0c 在使用AD账号进行登录时总是登录不上 使用管理账号在后台进行测试时提示如下错误 xff1a 可认证测试用户 span class token builtin class
  • 【Keil5】*** Target ‘xxx‘ uses ARM-Compiler ‘Default Compiler Version 5‘ which is not available.解决方法

    出现这个报错的原因在Keil 5 37以后安装compiler version 6 xff0c 如果要使用compiler version 5 xff0c 需要自己安装 下载链接 官网 https developer arm com dow
  • ubuntu 18.04.6 使用内核源码安装内核

    文章目录 前言一 编译内核以及安装二 编译内核模块总结参考资料 前言 上一篇我在ubuntu 18 04 更换内核版本后 xff0c 这篇我们在ubuntu 18 04上用内核源码编译其它版本的内核 xff0c 并进行安装 ubuntu 1
  • 关于CMMI和敏捷过程改进

    问题 xff1a 如果按照CMMI从1到5的思路 xff0c 建设企业的信息化制度 xff08 不是为了评定等级 xff0c 是为了实现项目规范管理 xff09 xff0c 可行吗 xff1f 需要关注哪些问题点呢 xff1f 公司如果是个
  • 【PX4_BUG】You should uninstall ModemManager as it conflicts with any non-modem serial device

    将编译好的固件下载到无人机 xff0c 需要输入命令 make px4 fmu v2 default upload 这里运行时可能会有报错 WARNING You should uninstall ModemManager as it co
  • 【PX4-AutoPilot教程-2】搭建并运行第一个应用程序

    搭建并运行第一个应用程序 本文主要说明如何搭建并运行你的第一个板载应用程序 Firmware src examples px4 simple app文件夹下默认已经有一个完整的例程 xff0c 如果遇到了问题可以作为参考 如果需要自己重新编
  • 【PX4-AutoPilot教程-1】PX4源码文件目录架构分析

    PX4源码文件目录架构分析 PX4源代码的结构复杂 xff0c 这是源代码的总目录结构 xff08 以v1 13 0为例 xff09 xff1a Firmware boards build cmake Documentation integ
  • 【PX4-AutoPilot教程-3】uORB主题订阅发布机制理解、应用和代码阅读

    uORB主题订阅发布机制 1 PX4 Pixhawk的软件体系结构 PX4 Pixhawk的软件体系结构主要被分为四个层次 xff0c 这可以让我们更好的理解PX4 Pixhawk的软件架构和运作 xff1a 应用程序的API xff1a
  • 2020-11-23

    https blog csdn net guofei fly article details 104136008 utm medium 61 distribute pc relevant none task blog BlogCommend
  • MapReduce原理及简单实现

    MapReduce将数据的处理分成了两个步骤 xff0c Map和Reduce Map将输入的数据集拆分成一批KV对并输出 xff0c 对于每一个 lt k1 v1 gt xff0c Map将输出一批 lt k2 v2 gt xff1b R
  • 深度理解Python迭代器

    我们手动的实现一个for循环 xff1a li1 61 list range 10 iteratorObject 61 iter li1 while 1 try print next iteratorObject except StopIt
  • 关于mysql版本差异导致FIND_IN_SET()查询不到数据的问题

    这次发现的问题 xff0c 是在接手项目的时候 xff0c 和安卓端小伙伴测试时候发现的 xff0c 插入数据之后却查不出来 xff0c 通过排查定位到FIND IN SET 函数 xff0c 也是第一次接触FIND IN SET xff0
  • YOLOv4代码学习笔记一

    YOLOV4代码学习笔记一 YOLOV4简介CSPdarknet py学习 本文是对另一个博主的 睿智的目标检测30 Pytorch搭建YoloV4目标检测平台代码的学习 xff0c 由于我是cv新手 xff0c 很多东西不懂 xff0c
  • 无人机光流模块使用技巧

    无人机光流模块使用技巧 光流模块在无 GPS 环境下 xff0c 课实时检测飞机水平移动距离 xff0c 实现对四轴无人机长时间的稳定悬停 图1显示的是湖南优象LC 302光流模块的功能框图 xff0c 光流摄像头拍摄无人机垂直向下的画面
  • CMMI 2.0 和 1.3

    CMMI2 0与1 3在组织形式区别很大 xff0c 很多PA和之前的不太一样了 xff0c 而且PA在2 0中叫实践域 xff0c 1 3中叫过程域 不过其实核心内容没有大的变化 xff0c 只是相关内容的位置进行了调整 xff0c 部分
  • ROS2的RVIZ2无法启动

    在新安装的 xff32 xff2f xff33 2中启动rviz2 xff0c 启动错误 xff0c 显示 Failed to create an OpenGL context BadValue integer parameter out
  • 【TCP 重传、滑动窗口、流量控制、拥塞控制】

    文章目录 重传机制超时重传快速重传SACK方法Duplicate SACK 滑动窗口流量控制那操作系统的缓冲区 xff0c 是如何影响发送窗口和接收窗口的呢 xff1f 窗口关闭 拥塞控制慢启动拥塞避免拥塞发生快速恢复 重传机制 TCP 实
  • 【TCP四次挥手】

    文章目录 TCP 四次挥手过程是怎样的 xff1f 为什么挥手需要四次 xff1f 第一次挥手丢失了 xff0c 会发生什么 xff1f 第二次挥手丢失了 xff0c 会发生什么 xff1f 第三次挥手丢失了 xff0c 会发生什么 xff
  • FreeRTOS事件组----任务同步

    有时 xff0c 应用程序的设计需要两个或多个任务才能彼此同步 例如 xff0c 考虑一个设计 xff0c 其中任务A接收一个事件 xff0c 然后将事件所需的一些处理提供给其他三个任务 xff1a 任务B xff0c 任务C和任务D 如果