[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 分布对…

Nginx Websocket 协议配置支持

前后分离的 Web 架构应用,在开发环境启动是可以直接连接支持 websocket 协议,因为没有中间件做转发处理。 当我们对前端进行编译后,通过 nginx 反向代理访问时,需要在nginx 配置文件中增加一些特定的头信息,让服务端识…

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

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

PySide(PyQt),记录最后一次访问文件的路径

1、在同目录下用文本编辑器创建JSON文件,命名为setting.json,并输入以下内容后保存: { "setting": { "last_file": [ "" ] } } 2、应用脚本: import json …

昇思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…

03:C语言运算符

C语言运算符 1、常见运算符2、赋值运算符3、判断运算符4、与- - 1、常见运算符 数学运算符号。常见数学运算符号,跟数学中理解相同 加号 - 减号 * 乘号 / 除号,相除以后的商 % 取余符号,相除以后余数是几 ()括号括起来优先级最高&#xff0…

计算机网络面试常见题目(一)

计算机网络面试中常见的问题涉及多个层面,包括网络协议、网络体系结构、网络安全、数据传输等。以下是一些常见题目的详解: 1. OSI七层模型是什么?每层的功能是什么? OSI七层模型是国际标准化组织(ISO)制…

医疗器械企业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就能够让命令字体带上颜色,同时命令将会在下一行开…

Python 学习之框架(七)

Python的框架是一系列可重用的代码库,它们为开发者提供了构建应用程序所需的基础设施和工具。这些框架广泛应用于Web开发、数据分析、机器学习、网络爬虫等多个领域。以下是对Python中一些主要框架的清晰归纳和介绍: 1. Web开发框架 ● Django&#xff1…

有些人的成功不是偶然

——读《张忠谋自传》有感 之前读了关于台积电创始人张忠谋先生的一篇公众号文章,对于他的人生经历产生了兴趣,于是找来《张忠谋自传(1931-1964)》阅读。读完之后我最大的感受是张先生的成功绝不是偶然,他的渊博学识、好学上进、人脉广泛等等…

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

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