FreeRTOS从入门到精通 第十四章(队列集)
参考教程:【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili
一、队列集简介
1、队列集概述
(1)一个队列只允许任务间传递的消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,那么就可以使用队列集。
(2)队列集可用于对多个队列或信号量进行“监听”,其中不管哪一个消息到来,都可让任务退出阻塞状态。
(3)队列集大致使用流程:
①启用队列集功能需要将宏configUSE_QUEUE_SETS配置为1。
②创建队列集。
③创建队列或信号量。
④往队列集中添加队列或信号量。
⑤往队列发送信息或释放信号量。
⑥获取队列集的消息。
2、队列集相关API函数介绍
(1)队列集相关API函数概览:
函数 | 描述 |
xQueueCreateSet() | 创建队列集 |
xQueueAddToSet() | 队列添加到队列集中【队列在被添加到队列集之前,队列中不能有有效的消息】 |
xQueueRemoveFromSet() | 从队列集中移除队列【队列在从队列集移除之前,必须没有有效的消息】 |
xQueueSelectFromSet() | 获取队列集中有有效消息的队列 |
xQueueSelectFromSetFromISR() | 在中断中获取队列集中有有效消息的队列 |
(2)xQueueCreateSet函数:
①函数定义:
QueueSetHandle_t xQueueCreateSet
(const UBaseType_t uxEventQueueLength
);
②函数参数:
形参 | 描述 |
uxEventQueueLength | 队列集可容纳的队列数量 |
③返回值:
返回值 | 描述 |
NULL | 队列集创建失败 |
其它值 | 队列集创建成功,返回队列集句柄 |
(3)xQueueAddToSet函数:
①函数定义:
BaseType_t xQueueAddToSet
(QueueSetMemberHandle_t xQueueOrSemaphore ,QueueSetHandle_t xQueueSet
);
②函数参数:
形参 | 描述 |
xQueueOrSemaphore | 待添加的队列句柄 |
xQueueSet | 队列集 |
③返回值:
返回值 | 描述 |
pdPASS | 队列集添加队列成功 |
pdFAIL | 队列集添加队列失败 |
(4)xQueueRemoveFromSet函数:
①函数定义:
BaseType_t xQueueRemoveFromSet
(QueueSetMemberHandle_t xQueueOrSemaphore ,QueueSetHandle_t xQueueSet
);
②函数参数:
形参 | 描述 |
xQueueOrSemaphore | 待移除的队列句柄 |
xQueueSet | 队列集 |
③返回值:
返回值 | 描述 |
pdPASS | 队列集添加队列成功 |
pdFAIL | 队列集添加队列失败 |
(5)xQueueSelectFromSet函数:
①函数定义:
QueueSetMemberHandle_t xQueueSelectFromSet
(QueueSetHandle_t xQueueSet,TickType_t const xTicksToWait
)
②函数参数:
形参 | 描述 |
xQueueSet | 队列集 |
xTicksToWait | 阻塞超时时间 |
③返回值:
返回值 | 描述 |
NULL | 获取消息失败 |
其他值 | 获取到消息的队列句柄 |
二、队列集操作实验
1、原理图与实验目标
(1)原理图(串口外设的接法与列表项的插入和删除实验相同,下图未示出):
(2)实验目标:
①设计3个任务——start_task、task1、task2:
[1]start_task:用于创建其它任务,并创建队列集,队列/信号量,将队列/信号量添加到队列集中。
[2]task1:用于扫描按键,当按键1按下,往队列写入数据,当按键2按下,释放二值信号量。
[3]task2:读取队列集中的消息,并打印。
②预期实验现象:
[1]程序下载到板子上后,板子上无任何明显现象。
[2]串口助手中输出相关调试信息。
2、实验步骤
(1)将“列表项的插入和删除实验”的工程文件夹复制一份,在拷贝版中进行实验。
(2)在FreeRTOSConfig.h文件中将宏configUSE_QUEUE_SETS配置为1。
#define configUSE_QUEUE_SETS 1
(3)更改FreeRTOS_experiment.c文件的内容,如下所示。
#include "FreeRTOS.h"
#include "task.h"
#include "LED.h"
#include "Key.h"
#include "Serial.h"
#include "queue.h"
#include "semphr.h"//宏定义
#define START_TASK_STACK_SIZE 128 //start_task任务的堆栈大小
#define START_TASK_PRIO 1 //start_task任务的优先级
#define TASK1_STACK_SIZE 128 //task1任务的堆栈大小
#define TASK1_PRIO 2 //task1任务的优先级
#define TASK2_STACK_SIZE 128 //task2任务的堆栈大小
#define TASK2_PRIO 3 //task2任务的优先级//任务函数声明
void start_task(void);
void task1(void);
void task2(void);//任务句柄
TaskHandle_t start_task_handler; //start_task任务的句柄
TaskHandle_t task1_handler; //task1任务的句柄
TaskHandle_t task2_handler; //task2任务的句柄QueueSetHandle_t queueset_handle;
QueueHandle_t queue_handle;
QueueHandle_t semphr_handle;void FreeRTOS_Test(void)
{//创建任务start_taskxTaskCreate((TaskFunction_t)start_task, //指向任务函数的指针"start_task", //任务名字START_TASK_STACK_SIZE, //任务堆栈大小,单位为字NULL, //传递给任务函数的参数START_TASK_PRIO, //任务优先级(TaskHandle_t *) &start_task_handler //任务句柄,就是任务的任务控制块);//开启任务调度器vTaskStartScheduler();
}void start_task(void)
{taskENTER_CRITICAL(); //进入临界区queueset_handle = xQueueCreateSet(2); //创建队列集,可以存放2个队列if(queueset_handle != NULL){Serial_Printf("队列集创建成功!!\r\n");}queue_handle = xQueueCreate(1, sizeof(uint8_t)); //创建队列 semphr_handle = xSemaphoreCreateBinary(); //创建二值信号量xQueueAddToSet(queue_handle,queueset_handle);xQueueAddToSet(semphr_handle,queueset_handle);xTaskCreate((TaskFunction_t) task1,(char *) "task1",(configSTACK_DEPTH_TYPE) TASK1_STACK_SIZE,(void *) NULL,(UBaseType_t) TASK1_PRIO,(TaskHandle_t *) &task1_handler );xTaskCreate((TaskFunction_t) task2,(char *) "task2",(configSTACK_DEPTH_TYPE) TASK2_STACK_SIZE,(void *) NULL,(UBaseType_t) TASK2_PRIO,(TaskHandle_t *) &task2_handler );vTaskDelete(NULL);taskEXIT_CRITICAL();
}void task1(void)
{uint8_t key = 0;BaseType_t err = 0;while(1) {key = Key_GetNum();if(key == 1){err = xQueueSend(queue_handle, &key, portMAX_DELAY );if(err == pdPASS){Serial_Printf("往队列queue_handle写入数据成功!!\r\n");}}else if(key == 2){err = xSemaphoreGive(semphr_handle);if(err == pdPASS){Serial_Printf("释放信号量成功!!\r\n");}}vTaskDelay(10);}
}void task2(void)
{QueueSetMemberHandle_t member_handle;uint8_t key;while(1){member_handle = xQueueSelectFromSet(queueset_handle,portMAX_DELAY);if(member_handle == queue_handle){xQueueReceive(member_handle,&key,portMAX_DELAY);Serial_Printf("获取到的队列数据为:%d\r\n",key);}else if(member_handle == semphr_handle){xSemaphoreTake(member_handle, portMAX_DELAY);Serial_Printf("获取信号量成功!!\r\n");}}
}
(4)程序完善好后点击“编译”,然后将程序下载到开发板上,打开串口助手分析信息。
3、程序执行流程
(1)main函数全流程:
①初始化串口模块。
②调用FreeRTOS_Test函数。
(2)测试函数全流程:
①创建任务start_task。
②开启任务调度器。
(3)多任务调度执行阶段较为简单,这里不再赘述。
相关文章:
FreeRTOS从入门到精通 第十四章(队列集)
参考教程:【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili 一、队列集简介 1、队列集概述 (1)一个队列只允许任务间传递的消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,那么就可以…...
Python实现U盘数据自动拷贝
功能:当电脑上有U盘插入时,自动复制U盘内的所有内容 主要特点: 1、使用PyQt5创建图形界面,但默认隐藏 2、通过CtrlAltU组合键可以显示/隐藏界面 3、自动添加到Windows启动项 4、监控USB设备插入 5、按修改时间排序复制文件 6、静…...
Vue.js 什么是 Composition API?
Vue.js 什么是 Composition API? 今天我们来聊聊 Vue 3 引入的一个重要特性:组合式 API(Composition API)。如果你曾在开发复杂的 Vue 组件时感到代码难以维护,那么组合式 API 可能正是你需要的工具。 什么是组合式 …...
关于产品和技术架构的思索
技术架构或者设计应该和产品设计分离,但是又不应该和产品架构独立。 听起来非常的绕并且难以理解。 下面我们用一个例子来解读这两者的关系 产品(族谱图) 如果把人类当作产品,那设计师应该是按照上面设计的(当然是正常的伦理道德)…...
Python设计模式 - 组合模式
定义 组合模式(Composite Pattern) 是一种结构型设计模式,主要意图是将对象组织成树形结构以表示"部分-整体"的层次结构。这种模式能够使客户端统一对待单个对象和组合对象,从而简化了客户端代码。 组合模式有透明组合…...
蓝桥杯模拟算法:蛇形方阵
P5731 【深基5.习6】蛇形方阵 - 洛谷 | 计算机科学教育新生态 我们只要定义两个方向向量数组,这种问题就可以迎刃而解了 比如我们是4的话,我们从左向右开始存,1,2,3,4 到5的时候y就大于4了就是越界了&…...
24_游戏启动逻辑梳理总结
首先这个项目从游戏根入口GameRoot.cs的初始化开始 分为 服务层初始化Svc.cs 与 业务系统层初始化Sys.cs 而服务层 分为 资源加载服务层ResSvc.cs 与 音乐播放服务层AudioSvc.cs 而在 资源加载服务层ResSvc.cs中 初始化了 名字的 配置文件 而音乐播放服务层AudioSvc.cs 暂时没…...
TikTok 推出了一款 IDE,用于快速构建 AI 应用
字节跳动(TikTok 的母公司)刚刚推出了一款名为 Trae 的新集成开发环境(IDE)。 Trae 基于 Visual Studio Code(VS Code)构建,继承了这个熟悉的平台,并加入了 AI 工具,帮助开发者更快、更轻松地构建应用——有时甚至无需编写任何代码。 如果你之前使用过 Cursor AI,T…...
如何运用python爬虫爬取百度贴吧动态加载的图片?
动态加载的图片通常是在页面加载后通过JavaScript异步请求获取的,而requests和BeautifulSoup只能获取页面的初始HTML内容,无法执行JavaScript代码。 要处理动态加载的图片,可以使用以下方法: 1. 使用Selenium Selenium是一个用…...
在Rust应用中访问.ini格式的配置文件
在Rust应用中访问.ini格式的配置文件,你可以使用第三方库,比如 ini 或 config. 下面是一个使用 ini 库的示例,该库允许你读取和解析.ini文件。 使用 ini 库 添加依赖 首先,你需要在你的 Cargo.toml 文件中添加 ini 库的依赖&am…...
Van-Nav:新年,将自己学习的项目地址统一整理搭建自己的私人导航站,供自己后续查阅使用,做技术的同学应该都有一个自己网站的梦想
嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 Van-Nav是一个基于Vue.js开发的导航组件库,它提供了多种预设的样式和灵活的配置选项,使得开发者可以轻松地定制出符合项目需求…...
【某大厂一面】Map和Set区别
在 Java 中,Map 和 Set 都是集合框架中的重要接口,它们具有不同的特性和用途。虽然它们都用于存储一组元素,但它们之间有一些重要的区别。下面将详细介绍它们之间的差异。 1. Set 和 Map 的基本定义 Set 是一个集合接口,它用于存…...
Vue.js组件开发-使用Vue3如何实现上传word作为打印模版
使用Vue 3实现Word模板上传、解析和打印功能的完整解决方案: 一、实现步骤 安装依赖创建文件上传组件实现.docx文件解析创建打印预览组件实现打印功能样式优化 二、完整代码实现 1. 安装依赖 npm install mammoth axios2. 创建文件上传组件(FileUploa…...
Consul持久化配置报错1067---consul_start
报错都是文件写的有问题或者格式问题,直接复制我的这个改改地址就行 先创建文本文件consul_start.txt--->再复制代码保存---->再把.txt改成.bat 持久化存储的地址在:mydata 注:D:\consul\consul_1.20.2_windows_386改成自己consul的…...
动态规划DP 最长上升子序列模型 总览
最长上升子序列模型 最长上升子序列 怪盗基德的滑翔伞...
如何解压7z文件?8种方法(Win/Mac/手机/网页端)
7z 文件是一种高效的压缩文件格式,由 7 - Zip 软件开发者所采用。它运用独特的压缩算法,能显著缩小文件体积,便于存储与传输各类数据,像软件安装包、大型资料集等。但要使用其中内容,就必须解压,因为处于压…...
2023年吉林省职业院校技能大赛网络系统管理样题-网络配置(华三代码)
目录 附录1:拓扑图 附录2:地址规划表 1.S1 2.S3 3.S4 4.S5 5.S7 6.S8 7.S9 8.R1 9.R2 10.R3 11.EG1 12.EG2 13.AC1 14.AC2 附录1:拓扑图 编号 型号...
Flutter使用Flavor实现切换环境和多渠道打包
在Android开发中通常我们使用flavor进行多渠道打包,flutter开发中同样有这种方式,不过需要在原生中配置 具体方案其实flutter官网个了相关示例(https://docs.flutter.dev/deployment/flavors),我这里记录一下自己的操作 Android …...
【linux三剑客】grep练习题
题目 进入/lianxi目录,复制/etc/passwd到当前目录下,然后对passwd进行操作查找出当前passwd文件中以ftp或者mail开头的行,在屏幕上输出。查找出当前passwd文件中有没有以r、m、f开头的行,在屏幕上输出。查找出当前passwd文件中以…...
冬天适合养什么鱼?
各位鱼友们,冬天来了,是不是还在为养什么鱼而烦恼?别担心,今天就来给大家好好推荐一些适合冬天养的鱼,让你的水族箱在寒冷的冬天也能生机勃勃! 一、金鱼:冬日里的“小暖男” 金鱼绝对是冬季养鱼…...
Effective C++ 规则43:学习处理模板化基类内的名称
1、背景 在 C 中,模板化基类为我们提供了强大的灵活性。然而,模板化基类的名称查找却经常会引发困惑,甚至导致编译错误。这是因为模板的名称查找规则与普通类不同。在普通类中,派生类可以直接访问基类的成员变量和成员函数&#…...
DeepSeek R1 linux云部署
云平台:AutoDL 模型加载工具:Ollama 参考:https://github.com/ollama/ollama/blob/main/docs/linux.md 下载Ollama 服务器上下载ollama比较慢,因此我使用浏览器先下载到本地电脑上。 https://ollama.com/download/ollama-linux…...
混合专家模型MoE的全面详解
什么是混合专家(MoE)? 混合专家(MoE)是一种利用多个不同的子模型(或称为“专家”)来提升LLM质量的技术。 MoE的两个主要组成部分是: 专家:每个前馈神经网络(…...
vue3相关知识点
title: vue_1 date: 2025-01-28 12:00:00 tags:- 前端 categories:- 前端vue3 Webpack ~ vite vue3是基于vite创建的 vite 更快一点 一些准备工作 准备后如图所示 插件 Main.ts // 引入createApp用于创建应用 import {createApp} from vue // 引入App根组件 import App f…...
【2025美赛D题】为更美好的城市绘制路线图建模|建模过程+完整代码论文全解全析
你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的美赛O奖、国赛国一的数学建模团队,我们将为你带来本次数学建模竞赛的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解析,…...
games101-(5/6)
光栅化 投影完成之后,视图区域被确定在从[-1,1]的单位矩阵中,下一步就是光栅化 长宽比:ratio 垂直的可视角度:fild-of-view 可以看到的y 轴的范围,角度越小 越接近正交投影 屏幕坐标系 、 将多边形转化成像素 显示…...
UE5.3 C++ CDO的初步理解
一.UObject UObject是所有对象的基类,往上还有UObjectBaseUtility。 注释:所有虚幻引擎对象的基类。对象的类型由基于 UClass 类来定义。 这为创建和使用UObject的对象提供了 函数,并且提供了应在子类中重写的虚函数。 /** * The base cla…...
前端——js高级25.1.27
复习:对象 问题一: 多个数据的封装提 一个对象对应现实中的一个事物 问题二: 统一管理多个数据 问题三: 属性:组成:属性名属性值 (属性名为字符串,属性值任意) 方…...
Python 魔术方法
1. 什么是魔术方法 在 Python 中,魔术方法(Magic Methods),又叫 特殊方法 或 双下方法,是以两个下划线(__)开头和结尾的方法。 这些方法为 Python 提供了对类和对象的特殊操作功能,…...
websocket webworker教程及应用
WebSocket 和 Web Workers 是两种不同的 Web 技术,分别用于实现实时通信和后台线程处理。以下是它们的简要教程: WebSocket 教程 1. 什么是 WebSocket? WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许服务器主动向客户端推…...
qwen2.5-vl:阿里开源超强多模态大模型(包含使用方法、微调方法介绍)
1.简介 在 Qwen2-VL 发布后的五个月里,众多开发者基于该视觉语言模型开发了新的模型,并向 Qwen 团队提供了极具价值的反馈。在此期间,Qwen 团队始终致力于打造更具实用性的视觉语言模型。今天,Qwen 家族的最新成员——Qwen2.5-VL…...
PaddleSeg 从配置文件和模型 URL 自动化运行预测任务
git clone https://github.com/PaddlePaddle/PaddleSeg.git# 在ipynb里面运行 cd PaddleSegimport sys sys.path.append(/home/aistudio/work/PaddleSeg)import os# 配置文件夹路径 folder_path "/home/aistudio/work/PaddleSeg/configs"# 遍历文件夹,寻…...
Java实战项目-基于 springboot 的校园选课小程序(附源码,部署,文档)
Java 基于 springboot 的校园选课小程序 博主介绍:✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ 🍅文末获取源码联系🍅 👇&…...
网络工程师 (7)进程管理
一、进程相关的概念 (一)定义 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,也是操作系统结构的基础。进程是程序的一次执行实例,具有动…...
大屏 UI 设计风格的未来趋势
在科技飞速革新的时代,大屏设备的应用领域不断拓展,从城市的智能交通指挥中心,到商场的互动广告大屏,再到家庭的超大尺寸智能电视,大屏已然成为信息展示与交互的关键载体。大屏 UI 设计风格也随之不断演变,…...
Kmesh v1.0 正式发布
2025 年 1 月 23 日,Kmesh 团队正式发布了 Kmesh v1.0235。Kmesh 作为一款开源的服务网格解决方案,v1.0 版本在网络流量管理领域引入了多项重磅特性2。具体如下134: IPsec 加密通信:引入 IPsec 加密协议,将节点间流量加…...
低代码系统-产品架构案例介绍、轻流(九)
轻流低代码产品定位为零代码产品,试图通过搭建来降低企业成本,提升业务上线效率。 依旧是从下至上,从左至右的顺序 名词概述运维层底层系统运维层,例如上线、部署等基础服务体系内置的系统能力,发消息、组织和权限是必…...
深入理解动态规划(dp)--(提前要对dfs有了解)
前言:对于动态规划:该算法思维是在dfs基础上演化发展来的,所以我不想讲的是看到一个题怎样直接用动态规划来解决,而是说先用dfs搜索,一步步优化,这个过程叫做动态规划。(该文章教你怎样一步步的…...
C++传送锚点的内存寻址:内存管理
文章目录 1.C/C内存分布回顾2.C内存管理2.1 内存申请2.2 operator new与operator delete函数2.3 定位new表达式 3.关于内存管理的常见知识点3.1 malloc/free和new/delete的区别3.2 内存泄漏 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 继C语…...
webAPI -DOM 相关知识点总结(非常细)
title: WebAPI语法 date: 2025-01-28 12:00:00 tags:- 前端 categories:- 前端WEB API 了解DOM的结构并掌握其基本的操作,体验 DOM 在开发中的作用 API简介 就是使用js来操作html和浏览器 什么是DOM? 就是一个文档对象模型,是用来呈现预计于任意htm…...
Deepseek的RL算法GRPO解读
在本文中,我们将深入探讨Deepseek采用的策略优化方法GRPO,并顺带介绍一些强化学习(Reinforcement Learning, RL)的基础知识,包括PPO等关键概念。 策略函数(policy) 在强化学习中, a…...
设计模式的艺术-策略模式
行为型模式的名称、定义、学习难度和使用频率如下表所示: 1.如何理解策略模式 在策略模式中,可以定义一些独立的类来封装不同的算法,每个类封装一种具体的算法。在这里,每个封装算法的类都可以称之为一种策略(Strategy…...
MyBatis 写法
MyBatis 高效使用技巧 常见 MyBatis 使用技巧,这些技巧有助于简化数据库操作,提高开发效率,并增强系统的性能。 1. 动态 SQL 动态 SQL 让开发者能够依据参数灵活地构建 SQL 语句,避免了手动拼接字符串带来的复杂性和错误风险。…...
Git图形化工具【lazygit】
简要介绍一下偶然发现的Git图形化工具——「lazygit」 概述 Lazygit 是一个用 Go 语言编写的 Git 命令行界面(TUI)工具,它让 Git 操作变得更加直观和高效。 Github地址:https://github.com/jesseduffield/lazygit 主要特点 主要…...
K8s运维管理平台 - xkube体验:功能较多
目录 简介Lic安装1、需要手动安装MySQL,**建库**2、启动命令3、[ERROR] GetNodeMetric Fail:the server is currently unable to handle the request (get nodes.metrics.k8s.io qfusion-1) 使用总结优点优化 补充1:layui、layuimini和beego的详细介绍1.…...
5.3.1 软件设计的基本任务
文章目录 软件设计解决的问题概要设计基本任务详细设计基本任务 软件设计解决的问题 需求分析解决“做什么”的问题,软件设计解决“如何做”的问题。软件设计分为概要设计、详细设计两块。概要设计是设计软件和数据的总体框架,比详细设计的颗粒度更大。详…...
Go学习:字符、字符串需注意的点
Go语言与C/C语言编程有很多相似之处,但是Go语言中在声明一个字符时,数据类型与其他语言声明一个字符数据时有一点不同之处。通常,字符的数据类型为 char,例如 :声明一个字符 (字符名称为 ch) 的语句格式为 char ch&am…...
LabVIEW无线齿轮监测系统
本案例介绍了基于LabVIEW的无线齿轮监测系统设计。该系统利用LabVIEW编程语言和改进的天牛须算法优化支持向量机,实现了无线齿轮故障监测。通过LabVIEW软件和相关硬件,可以实现对齿轮箱振动信号的采集、传输和故障识别,集远程采集、数据库存储…...
基于SpringBoot的租房管理系统(含论文)
基于SpringBoot的租房管理系统是一个集订单管理、房源信息管理、屋主申诉处理、用户反馈等多项功能于一体的系统。该系统通过SpringBoot框架开发,拥有完善的管理员后台、屋主管理模块、用户功能模块等,适用于房地产租赁平台或中介公司进行日常管理与运营…...
剑指 Offer II 008. 和大于等于 target 的最短子数组
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20008.%20%E5%92%8C%E5%A4%A7%E4%BA%8E%E7%AD%89%E4%BA%8E%20target%20%E7%9A%84%E6%9C%80%E7%9F%AD%E5%AD%90%E6%95%B0%E7%BB%84/README.md 剑指 Offer II 008.…...