首页 > 其他分享 >FreeRTOS中的事件组:实现任务同步与通信的强大工具

FreeRTOS中的事件组:实现任务同步与通信的强大工具

时间:2023-12-11 12:32:37浏览次数:21  
标签:同步 FreeRTOS 通信 任务 事件 使用 include

引言: 在实时嵌入式系统中,任务同步和通信是至关重要的,而FreeRTOS提供的事件组(Event Groups)机制为实现这一目标提供了一种高效且灵活的解决方案。本篇博客将深入研究FreeRTOS中的事件组,详细介绍其原理、使用方法,以及在实际应用中的一些最佳实践。

事件组原理:

事件组是FreeRTOS中的一种同步机制,允许任务等待一组特定的事件状态。每个事件组都是一个32位的变量,每一位代表一个事件状态。通过设置、清除、等待事件位,任务可以实现高效的同步和通信。

代码演示:

1. 创建和使用事件组:

#include "FreeRTOS.h"
#include "task.h"
#include "event_groups.h"

// 定义事件组句柄
EventGroupHandle_t xEventGroup;

// 定义事件位
#define EVENT_BIT_1 (1 << 0)
#define EVENT_BIT_2 (1 << 1)

void vTask1(void *pvParameters) {
    for (;;) {
        // 等待事件位1和事件位2都被设置
        EventBits_t bits = xEventGroupWaitBits(xEventGroup, EVENT_BIT_1 | EVENT_BIT_2, pdTRUE, pdTRUE, portMAX_DELAY);

        // 执行任务
        if ((bits & (EVENT_BIT_1 | EVENT_BIT_2)) == (EVENT_BIT_1 | EVENT_BIT_2)) {
            // 事件位1和事件位2都被设置
            // ...
        }
    }
}

void vTask2(void *pvParameters) {
    for (;;) {
        // 设置事件位1
        xEventGroupSetBits(xEventGroup, EVENT_BIT_1);

        // 执行其他任务
        // ...
    }
}

void vTask3(void *pvParameters) {
    for (;;) {
        // 设置事件位2
        xEventGroupSetBits(xEventGroup, EVENT_BIT_2);

        // 执行其他任务
        // ...
    }
}

int main(void) {
    // 创建事件组
    xEventGroup = xEventGroupCreate();

    // 创建任务1、任务2、任务3
    xTaskCreate(vTask1, "Task1", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
    xTaskCreate(vTask2, "Task2", configMINIMAL_STACK_SIZE, NULL, 2, NULL);
    xTaskCreate(vTask3, "Task3", configMINIMAL_STACK_SIZE, NULL, 3, NULL);

    // 启动FreeRTOS调度器
    vTaskStartScheduler();

    return 0;
}

最佳实践:

  1. 明确事件位的含义: 在设计中,明确每个事件位代表的含义,确保任务能够正确理解和处理。
  2. 合理使用事件组: 事件组是一种强大的同步工具,但过度使用可能导致代码复杂性增加。在设计时,根据实际需求仔细选择使用场景。
  3. 及时清除事件位: 确保在任务处理完事件后及时清除相应的事件位,以便其他任务能够正确等待。

结论:

FreeRTOS中的事件组为实时嵌入式系统提供了一种高效的任务同步和通信机制。通过合理配置和使用事件组,开发者能够更好地管理任务之间的同步关系,提高系统的可维护性和可扩展性。在实际应用中,深入理解事件组的原理,并结合最佳实践,将是构建健壮实时系统的关键一步。

标签:同步,FreeRTOS,通信,任务,事件,使用,include
From: https://blog.51cto.com/u_16193759/8770590

相关文章

  • 多开工具对手机通信质量的测试与分析
    多开工具对手机通信质量的测试与分析随着移动互联网的快速发展,手机成为人们日常生活中不可或缺的工具。然而,一些用户为了方便同时使用多个社交账号、游戏账号或者其他应用,会选择使用多开工具来实现多个应用同时在线的功能。然而,使用多开工具是否会对手机的通信质量产生影响,成为了......
  • Unity3D《守望先锋》如何来做帧同步详解
    Unity3D是一种跨平台的游戏开发引擎,它提供了丰富的功能和工具,可以帮助开发人员轻松创建高质量的游戏。在Unity3D中,帧同步是一种重要的技术,它可以确保多个玩家在不同的客户端上同时进行游戏,并保持游戏状态的同步。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础......
  • 进程间通信-信号-pipe-fifo
    编译运行FifoConsumerProducer一起运行Testmfpipe文件夹PipeListarg理解()Pipe概念:管道是一种在两个进程之间进行通信的机制。个进程的输出可以通过管道传递给另一个进程的输入创建:在C语言中,可以使用pipe系统调用创建管道。管道有两端,一个用千写入,一个用干读......
  • DMA-BUF缓冲区共享和同步【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/dma-buf.html#DMA-BUF缓冲区共享和同步DMA-BUF子系统提供了一个框架,用于在多个设备驱动程序和子系统之间共享硬件(DMA)访问的缓冲区,并用于同步异步硬件访问。例如,drm的“prime”多GPU支持就使用了这个框架,但当然不仅限于GPU的......
  • Github fork同步原始仓库tag的办法
    #Repo:someuser/myframework#Fork:superteam/myframework#Track:#克隆你的仓库gitclonehttps://github.com/superteam/myframework.git#进入你的仓库本地目录cdmyframework#添加原始仓库地址gitremoteaddupstreamhttps://github.com/someuser/myframework.......
  • 进程间通信-信号-pipe-fifo(课上测试)
    一.运行结果二.代码说明consumer.c该程序是一个使用FIFO(命名管道)进行进程间通信的示例。首先定义了FIFO的名称和缓冲区的大小。然后在主函数中,打开了一个以只读方式打开的FIFO,并读取FIFO中的数据直到读取完毕,最后关闭FIFO。相关系统调用说明:1.open:打开FIFO文件,返回文......
  • QtConcurrent::run()多线程的同步、异步
    Qt提供了QtConcurrent模块,处理一些常见的并行计算,最大的特点就是无需再使用互斥锁这种很低级的操作,全都封装好了。除此以外,QFuture、QFutureWatcher、QFutureSynchronizer类提供了一些辅助性的操作。参考:Qt中的多线程技术-知乎(zhihu.com)【QtConcurrent::run()需注意】......
  • Linux 配置NTP时间同步服务
    1.安装[可选,如已安装则跳过]aptinstallntp2.启动NTP服务systemctlstartntpdsystemctlenablentpd3.查看NTP服务运行状态systemctlstatusntpd4.修改配置文件vi/etc/ntpsec/ntp.conf查找配置文件命令find/-namentp.conf1.使用第三方NTP地址进行时间同步......
  • OGG 同步表2---ogg已搭建,只同步表
    --2023/12/09--源端sb02mes 目标端:centradb待同步表tableCAMSTAR_PRD01.AHNEWPNLSECONDBAKINGHISTORY;tableCAMSTAR_PRD01.AHMODELINGSETTING;1.登录,并查看是否添加表级附加日志cd$OGG_HOMEggsciGGSCI(szpmsb02cimrac-db05)1>dbloginuseridogg@sb02mes,password......
  • SAP CRM 和 ERP 系统之间的主数据同步 - PRODUCT_R3_ADAPTER
    SAPCRM系统中的Middleware是一个关键的集成组件,它允许CRM系统和其他SAP或非SAP系统交换和同步数据。Middleware提供了一种机制,允许在异构系统环境中实现数据和业务过程的一致性。在这个上下文中,PRODUCT_R3_ADAPTER是一种特定的Middleware组件,它主要负责处理CRM系......