[FreeRTOS 功能应用] 事件组 功能应用

文章目录

    • 一、基础知识点
    • 二、代码讲解
    • 三、结果演示
    • 四、代码下载


一、基础知识点

[FreeRTOS 基础知识] 事件组 概念
[FreeRTOS 内部实现] 事件组

本实验是基于STM32F103开发移植FreeRTOS实时操作系统,事件组实战操作。(当task1和task2同时完成,才执行task3)
使用工具:Keil、串口工具


二、代码讲解

1、使用xEventGroupCreate函数创建事件组

// 路径:项目\Core\Src\freertos.c
// 全局变量
EventGroupHandle_t g_EventGroup;
g_EventGroup = xEventGroupCreate ( );

2、使用osThreadCreate创建三个任务

// 创建两个任务
osThreadDef(Task1, vTask_a, osPriorityHigh, 0, 1000);
Task1_Handle = osThreadCreate(osThread(Task1), NULL);
if( Task1_Handle != NULL )
{printf("Succeeded in creating Sender1_Handle Queue. Procedure!\n\r");
}
else
{printf("Fail in creating Sender1_Handle Queue. Procedure!\n\r");
}osThreadDef(Task2, vTask_b, osPriorityNormal, 0, 1000);
Task2_Handle = osThreadCreate(osThread(Task2), NULL);		
if( Task2_Handle != NULL )
{printf("Succeeded in creating Seceiver_Handle Queue. Procedure!\n\r");
}
else
{printf("Fail in creating Seceiver_Handle Queue. Procedure!\n\r");
}		osThreadDef(Task3, vTask_c, osPriorityNormal, 0, 1000);
Task3_Handle = osThreadCreate(osThread(Task3), NULL);		
if( Task3_Handle != NULL )
{printf("Succeeded in creating Seceiver_Handle Queue. Procedure!\n\r");
}
else
{printf("Fail in creating Seceiver_Handle Queue. Procedure!\n\r");
}		

函数中通过osThreadDef 宏构建osThreadDef_t 结构体,名称os_thread_def_##name(## 表示字符拼接),结构体成员包括 :#name 任务名称;thread 任务处理函数;priority 任务优先级;instances 实例; stacksz 栈大小;

#define osThreadDef(name, thread, priority, instances, stacksz)  \
const osThreadDef_t os_thread_def_##name = \
{ #name, (thread), (priority), (instances), (stacksz), NULL, NULL }

将构建的osThreadDef_t 结构体传入osThreadCreate函数中,实际调用xTaskCreate函数创建任务。

osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument)
{TaskHandle_t handle;if (xTaskCreate((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name,thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority),&handle) != pdPASS)  {return NULL;} return handle;
}

任务实现:task1完成后执行task2;当task1和task2都完成后执行task3

3、task1任务函数vTask_a实现

void vTask_a(void const * argument)
{for(;;){xEventGroupSetBits(g_EventGroup, EVENT_A);printf("DWB -- vTask_a \n\r");xEventGroupWaitBits(g_EventGroup, EVENT_C, TRUE, TRUE, pdMS_TO_TICKS(10));vTaskDelay(pdMS_TO_TICKS(250));   // 延时250ms}	
}

通过xEventGroupSetBits函数,设置 g_EventGroup 结构体中的事件状态标志位,表示task1执行完成。
通过xEventGroupWaitBits函数,等待task3完成后清除标志位并执行。(EVENT_C)

4、task2任务函数vTask_b实现

void vTask_b(void const * argument)
{for(;;){xEventGroupWaitBits(g_EventGroup, EVENT_A, FAILED, TRUE, pdMS_TO_TICKS(10));xEventGroupSetBits(g_EventGroup, EVENT_B);printf("DWB -- vTask_b \n\r");vTaskDelay(pdMS_TO_TICKS(300));   // 延时300ms}	
}

通过xEventGroupWaitBits函数,等待task1完成后不清除标志位并执行。(EVENT_A)
通过xEventGroupSetBits函数,设置 g_EventGroup 结构体中的事件状态标志位,表示task2执行完成。

5、task3任务函数vTask_c实现

void vTask_c(void const * argument)
{for(;;){xEventGroupWaitBits(g_EventGroup, EVENT_A|EVENT_B, TRUE, TRUE, pdMS_TO_TICKS(10));xEventGroupSetBits(g_EventGroup, EVENT_C);printf("DWB -- vTask_c \n\r");vTaskDelay(pdMS_TO_TICKS(300));   // 延时300ms}	
}

通过xEventGroupWaitBits函数,等待task1 和 task2完成后不清除标志位并执行。(EVENT_A|EVENT_B)
通过xEventGroupSetBits函数,设置 g_EventGroup 结构体中的事件状态标志位,表示task3执行完成。


三、结果演示

从串口可以看出,任务c是在任务a和任务b都完成之后执行。
在这里插入图片描述


四、代码下载

[ FreeRTOS ] 事件组 功能应用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/867595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二维Gamma分布的激光点云去噪

目录 1、Gamma 分布简介2、实现步骤 1、Gamma 分布简介 Gamma 分布在合成孔径雷达( Synthetic Aperture Radar,SAR) 图像分割中具有广泛应用,较好的解决了SAR 图像中相干斑噪声对图像分割的影响。采用二维Gamma 分布对…

web前端开发——开发环境和基本知识

今天我来针对web前端开发讲解一些开发环境和基本知识 什么是前端 前端通常指的是网站或者Web应用中用户可以直接与之交互的部分,包括网站的结构、设计、内容和功能。它是软件开发中的一个专业术语,特别是指Web开发领域。前端开发涉及的主要技术包括HTML…

昇思25天学习打卡营第15天|linchenfengxue

Pix2Pix实现图像转换 Pix2Pix概述 Pix2Pix是基于条件生成对抗网络(cGAN, Condition Generative Adversarial Networks )实现的一种深度学习图像转换模型,该模型是由Phillip Isola等作者在2017年CVPR上提出的,可以实现语义/标签到…

Java常用算法集合扩容机制分析

基础篇 基础篇要点:算法、数据结构、基础设计模式 1. 二分查找 要求 能够用自己语言描述二分查找算法能够手写二分查找代码能够解答一些变化后的考法 算法描述 前提:有已排序数组 A(假设已经做好) 定义左边界 L、右边界 R&…

东芝TB6560AHQ/AFG步进电机驱动IC:解锁卓越的电机控制性能

作为一名工程师,一直在寻找可靠且高效的组件来应用于你的项目中。东芝的TB6560AHQ/AFG步进电机驱动IC能够提供精准且多功能的电机控制,完全符合现代应用的高要求,保证高性能和易用性。在这篇文章中,我们将探讨TB6560AHQ/AFG的主要…

硅纪元视角 | 国内首款鸿蒙人形机器人“夸父”开启应用新篇章

在数字化浪潮的推动下,人工智能(AI)正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展,捕捉行业动态;提供深入的新闻解读,助您洞悉技术背后的逻辑;汇聚行业专家的见解,…

es6新语法

es6新语法 1 什么是ES6 JS语法分三块 ECMAScript : 基础语法BOM 浏览器对象 history location windowDOM 文档对象 document 编程语言JavaScript是ECMAScript的实现和扩展 。ECMAScript是由ECMA(一个类似W3C的标准组织)参与进行标准化的语法规范。ECMAS…

医疗器械企业CRM系统推荐清单(2024版)

近年来,我国医疗器械行业在国家政策支持、医改深入、人口老龄化和消费能力提升等因素推动下,得到了快速发展,正日益成为创新能力增强、市场需求旺盛的朝阳产业。然而,行业也面临价格压力、市场份额重新分配、合规风险以及产品和服…

解决 MEX 文件 ‘xxx.mexw64‘ 无效: 找不到指定的模块。的问题

1.问题描述 在matlab R2021b中运行编译好后的gptoolbox工具箱中的函数[SVtemp,SFtemp,IF] selfintersect(V,F);报错如下 MEX 文件 E:\MATLAB_File\gptoolbox\mex\selfintersect.mexw64 无效: 找不到指定的模块。出错 offset_bunny (第 15 行) [SVtemp,SFtemp,IF] selfinter…

论文略读:Learning and Forgetting Unsafe Examples in Large Language Models

随着发布给公众的大语言模型(LLMs)数量的增加,迫切需要了解这些模型从第三方定制的微调数据中学习的安全性影响。论文研究了在包含不安全内容的噪声定制数据上微调的LLMs的行为,这些数据集包含偏见、毒性和有害性 发现虽然对齐的L…

3033. 修改矩阵 Easy

给你一个下标从 0 开始、大小为 m x n 的整数矩阵 matrix ,新建一个下标从 0 开始、名为 answer 的矩阵。使 answer 与 matrix 相等,接着将其中每个值为 -1 的元素替换为所在列的 最大 元素。 返回矩阵 answer 。 示例 1: 输入:…

查看电脑显卡(NVIDIA)应该匹配什么版本的CUDA Toolkit

被串行计算逼到要吐时,决定重拾CUDa了,想想那光速般的处理感觉(夸张了)不要太爽,记下我的闯关记录。正好我的电脑配了NVIDIA独显,GTX1650,有菜可以炒呀,没有英伟达的要绕道了。回到正…

【Linux】生物信息学常用命令

参考资料来自生信技能树 先输入echo export PS1"[\033]2;\h:\u \w\007\033[33;1m]\u \033[35;1m\t\033[0m [\033[36;1m]\w[\033[0m]\n[\e[32;1m]$ [\e[0m]" >> ~/.bashrc 再输入source ~/.bashrc就能够让命令字体带上颜色,同时命令将会在下一行开…

软件设计之Java入门视频(12)

软件设计之Java入门视频(12) 视频教程来自B站尚硅谷: 尚硅谷Java入门视频教程,宋红康java基础视频 相关文件资料(百度网盘) 提取密码:8op3 idea 下载可以关注 软件管家 公众号 学习内容: 该视频共分为1-7…

每日一题~ (判断是否是合法的出栈序列)

大概的题意: 将 1-n 按照顺序进栈,问 输入的序列是否是合法的出栈序列。 遍历序列,如果当前这个值a小于 栈顶的值,说明它还未进栈(因为我们是按照顺序进栈的),所以我们将 一些元素进栈&#xff…

nacos源码 nacos注册中心1.4.x 源码 spring cloud alibaba 的discovery做了什么 nacos客户端是如何启动的(二)

spring-cloud-alibaba-nacos-discovery 老版本中如何调用nacos的 1. 整体结构: 2. 思考: 如果你来做,如何做client 向server注册服务: 1.2.1 读yml,或本地文件找到服务器地址,以及其他配置 1.2.2 向server注册服务 1.2…

6800和8080单片机读写时序和液晶屏接口

前言: 随着单片机发展,集成度越来越高,因此目前单片机较少使用RD和WR信号操作外设,因此很多时候,变成了6800和8080单片机读写液晶屏了。早期的读写本质上是对一个地址进行即时的操作,现在可能是等数据送到…

网易游戏员工怒怼丁磊上热搜:每天员工陪你演戏点赞有意思吗

【头部财经】近日,网易游戏一员工在内部群怒怼丁磊的聊天记录曝光,引发网友关注。据头部财经了解,该员工名叫石佳煊,是网易游戏的游戏开发工程师,毕业于华盛顿大学,已在网易工作四年多。 截图显示&#xf…

【国产开源可视化引擎Meta2d.js】铅笔

铅笔 铅笔是可以任意涂鸦的绘图小工具 在线体验: 乐吾乐2D可视化 示例: // 开始铅笔绘画 meta2d.drawingPencil();// 鼠标抬起结束// 停止铅笔绘画(关闭铅笔绘画状态) meta2d.stopPencil(); 国产开源 乐吾乐潜心研发&#xff…

基于星火大模型的群聊对话分角色要素提取挑战赛

赛事任务与数据 2024 iFLYTEK A.I.开发者大赛-讯飞开放平台 (xfyun.cn) 从给定的<客服>与<客户>的群聊对话中, 提取出指定的字段信息&#xff0c;待提取的全部字段见下数据说明。 赛题方提供了184条真实场景的群聊对话数据以及人工标注后的字段提取结果&#xf…