stm32cubemx hal学习记录:FreeRTOS消息队列

news2025/1/17 4:04:48

一、基本介绍

1、消息队列就是一个像容器一样的东西,我们所有的任务都可以往内部写,然后队列会将我们的消息按顺序存下来,所有的任务也可以按顺序将其读出来。

2、队列需要明确数据的大小以及队列的长度,写队列和读队列都是采用赋值的方式将数据复制过去使用的。

3、数据的操作默认采用先进先出的方式,写数据时放到尾部,读数据时从头部读

二、基本配置

1、配置RCC、USART1、时钟84MHz

2、配置SYS,将Timebase Source修改为除滴答定时器外的其他定时器。

3、初始化LED的两个引脚、两个按键引脚

4、开启FreeRTOS,v1与v2版本不同,一般选用v1即可

5、创建消息队列

Queue Name: 队列名称
Queue Size: 队列能够存储的最大单元数目,即队列深度
Queue Size: 队列中数据单元的长度,以字节为单位
Allocation: 分配方式:Dynamic 动态内存创建
Buffer Name: 缓冲区名称
Buffer Size: 缓冲区大小
Conrol Block Name: 控制块名称

6、创建两个线程,一个接收,一个发送

 7、生成代码

三、API

1、队列ID:osMessageQId

osMessageQId TestQueueHandle;

2、使用动态内存的方式创建一个新的队列:osMessageCreate

  osMessageQDef(TestQueue, 16, uint16_t);
  TestQueueHandle = osMessageCreate(osMessageQ(TestQueue), NULL);

3、队列删除:osMessageDelete

osMessageDelete(TestQueueHandle);

4、向队列尾部发送一个队列消息:osMessagePut

消息以拷贝的形式入队,而不是以引用的形式,可用在中断服务程序中。

osMessagePut(TestQueueHandle,send_data1,0);
三个参数分别为:消息队列的句柄,发送的消息内容,等待时间
void Send_thread_entry(void const * argument)
{
  /* USER CODE BEGIN Send_thread_entry */
  /* Infinite loop */
  osEvent xReturn;
	uint32_t send_data1;
  for(;;)
  {
		if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8)==0)
		{
			printf("send_data1\n");
			xReturn.status=osMessagePut(TestQueueHandle,send_data1,0);
			
			if(osOK!=xReturn.status)
			{
				printf("send fail\n");
			}
		}
		osDelay(100);
  }
  /* USER CODE END Send_thread_entry */
}

5、从一个队列中接收消息并把消息从队列中删除:osMessageGet

接收的消息是以拷贝的形式进行的,所以我们必须提供一个足够大的空间的缓冲区,可以在中断服务中运行。

osMessageGet(TestQueueHandle,osWaitForever);
两个参数分别为:消息队列的句柄,等待时间(此时为一直等待)
void Receive_thread_entry(void const * argument)
{
  /* USER CODE BEGIN Receive_thread_entry */
  /* Infinite loop */
	osEvent event;
  for(;;)
  {
    event=osMessageGet(TestQueueHandle,osWaitForever);
		
		if(osEventMessage==event.status)
		{
			printf("receive data:%d\n",event.value.v);
		}
		else
		{
			printf("error:0x%d\n",event.status);
		}
  }
  /* USER CODE END Receive_thread_entry */
}

6、从队列中接收数据单元,但是并不删除接收到的单元:osMessagePeek

从队列中接收到数据后,不会修改队列中的数据,也不会改变数据在队列中的存储顺序

7、查询队列中当前有校的数据单元个数:osMessageWaiting

uint32_t a=osMessageWaiting(TestQueueHandle);

四、代码解释

这个功能相当于在两个任务之间传递数据,一个发送,一个接收。

1、传输数字

①发送

void Send_thread_entry(void const * argument)
{
  osEvent xReturn;
  uint32_t send_data1;

  for(;;)
  {

	printf("send_data1\n");
	xReturn.status=osMessagePut(TestQueueHandle,send_data1,0);
			
	if(osOK!=xReturn.status)
	{
		printf("send fail\n");
	}
		
	osDelay(100);
  }
}

②接收

void Receive_thread_entry(void const * argument)
{
  osEvent event;
  for(;;)
  {
    event=osMessageGet(TestQueueHandle,osWaitForever);
		
	if(osEventMessage==event.status)
	{
		printf("receive data:%d\n",event.value.v);
	}
	else
	{
		printf("error:0x%d\n",event.status);
	}
  }
}

2、传输字符串或者结构体

①发送

typedef struct
{
	uint8_t name;
	uint8_t id;
	uint8_t age;
}T_data;

void Send_thread_entry(void const * argument)
{

  for(;;)
  {
		T_data m_data;
		m_data.age=20;
		m_data.id=2;
		m_data.name=1;
		
		osMessagePut(TestQueueHandle,(uint32_t)&m_data,0);
		
		osDelay(100);
  }
}

②接收

void Receive_thread_entry(void const * argument)
{
  osEvent event;
  for(;;)
  {
    event=osMessageGet(TestQueueHandle,osWaitForever);
		
		if(event.status==osEventMessage)
		{
			T_data *pData=(T_data *)event.value.p;
			printf("data=%d\n",pData->age);
			printf("id=%d\n",pData->id);
			printf("name=%d\n",pData->name);
		}
  }
}

3、以邮箱的形式传输数据

邮箱不能使用cubemx自动生成,需要手动添加

osMailQId mailQ01Handle;

osMailQDef(mailQ01,15,T_data);
mailQ01Handle=osMailCreate(osMailQ(mailQ01),NULL);

①邮箱发送数据

T_data m_data;
m_data.age=20;
m_data.id=2;
m_data.name=1;		
		
osMailPut(mailQ01Handle,&m_data);

②邮箱接收数据

osEvent event=osMailGet(mailQ01Handle,osWaitForever);
if(event.status==osEventMail)
{
	T_data *m_Data=(T_data *)event.value.p;
	printf("data=%d\n",m_Data->age);
	printf("id=%d\n",m_Data->id);
	printf("name=%d\n",m_Data->name);			
}

五、代码总结

创建一个队列:

osMessageQId TestQueueHandle;

osMessageQDef(TestQueue, 16, uint16_t);
TestQueueHandle = osMessageCreate(osMessageQ(TestQueue), NULL);

删除队列:

osMessageDelete(TestQueueHandle);

发送一个数字:

uint32_t send_data=100;

osMessagePut(myQueue01Handle,send_data,0);

接收一个数字:

osMessageGet(myQueue01Handle,osWaitForever);

发送一个字符串或者结构体:

typedef struct
{
    uint8_t name;
    uint8_t age;
    uint8_t id;
}T_Data;

T_Data m_data;
m_data.age=18;
m_data.name=12;
m_data.id=123;
        
osMessagePut(myQueue01Handle,(uint32_t)&m_data,0);

  

接收一个字符或者结构体:

uint8_t name;
uint8_t id;
uint8_t age;

osEvent event=osMessageGet(myQueue01Handle,osWaitForever);
T_Data *p_data=(T_Data *)event.value.p;
name=p_data->name;
id=p_data->id;
age=p_data->age;

创建邮箱:

osMailQId mailQ01Handle;

 

收发的类型设置为结构体T_data

osMailQDef(mailQ01,15,T_data);
mailQ01Handle=osMailCreate(osMailQ(mailQ01),NULL);

邮箱发送数据:

T_Data m_data;
m_data.age=18;
m_data.name=12;
m_data.id=123;
osMailPut(mailQ01Handle,&m_data);

邮箱接收数据:

osEvent event=osMailGet(mailQ01Handle,osWaitForever);
T_Data *p_data=(T_Data *)event.value.p;
name=p_data->name;
id=p_data->id;
age=p_data->age;

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

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

相关文章

16.面试重点CookieSession

一、文件上传(使用频率高,但不是很重要) 1.通过form表单 前端: form表单,method必须是POST, enctype属性是multipart/form-data, type是file 引起HTTP请求体的格式以multipart的形式传输 后端: 正常…

UnRaid虚拟机安装Uos家庭版并由Windows远程桌面访问的成功流程

文章目录0、前言1、UnRaid虚拟机安装Uos家庭版1.1、下载Uos系统镜像1.1.1、在https://home.uniontech.com/官网下载镜像安装包(如下图:)1.1.2、上传至Unraid1.1.3、添加虚拟机1.1.4、激活Uos家庭版2、开启Uos的远程桌面2.1、为Uos安装xrdp服务…

【制作数字人】零门槛通过三维重建技术生成个人三维模型

依托各项技术的发展,数字人技术开始拔地而起。我们发现,各大一线互联网企业、三大运营商,还有不少创业型公司都纷纷入局数字人。 难道元宇宙的入门票是数字人?等不及了,马上接触下这门技术。经简单了解,现…

前端学习路线(三)

往期回顾↓↓↓ 前端学习路线(一) 前端学习路线(二) 在前两章中,我们讲了如何去学习前端三剑客、js高级和bootstrap的重点,得到了很多前端初学者的好评,收藏量也是每天都在增加,所以…

【身份证识别】基于matlab GUI BP神经网络身份证识别【含Matlab源码 2239期】

⛄一、身份证号码识别简介 1 引言 当今是一个信息高度发达的时代,对于每个公民而言身份证那一连串的数字体现了个人信息的唯一性,出于保障公民合法权益和社会治安的考虑,越来越多的行业都开始建立自己的安全保障体系,其中最为关键…

STA:虚拟时钟(virtual clock)与I/O延时约束

1.什么是虚拟时钟? 虚拟时钟(virtual clock)是存在但没有clock source(pin/port)定义的时钟,仅作为输入输出端口延时约束的参考时钟。定义方式如下例: create_clock -name virtual_clock -period 10 -waveform {0 5} &#xff1…

第四章:Spring七大核心模块Bean、Core、Context

Spring框架七大模块 容器模块(spring core)、应用上下文模块(spring context)、AOP模块(spring aop)、JDBC抽象和DAO模块(spring dao)、对象/关系映射集成模块(spring o…

R3LIVE代码详解(三)

0. 简介 在上一章中,我们过完了主函数以及LIO的操作,由于这部分代码在FAST-LIO2中已经充分详细的介绍过了,所以说这里在R3LIVE中就不过多介绍了,下面我们来看一下本系列的重点,即VIO部分。 1. 主函数 我们在之前分析…

美国访问学者申请|J1签证官方指定材料大全

美国访问学者申请需要哪些材料?下面就随知识人网老师一起来看一看J1签证官方指定材料大全。 一、 有效护照:如果您的护照将在距您预计抵美日期的六个月内过期、或已损坏、或护照上已无空白的签证签发页, 请在前来面谈之前先申请一本新护照。 二、DS-160…

leetcode:1957. 删除字符使字符串变好

难度:简单 一个字符串如果没有 三个连续 相同字符,那么它就是一个 好字符串 。 给你一个字符串 s ,请你从 s 删除 最少 的字符,使它变成一个 好字符串 。 请你返回删除后的字符串。题目数据保证答案总是 唯一的 。 示例 1&#xf…

Podman 部署私有镜像仓库

Podman 部署私有镜像仓库 文章目录Podman 部署私有镜像仓库1. 安装 Podman 和 httpd-tools2. 配置仓库存储位置3. 生成访问仓库的凭据3.1 htpasswd 用户名和密码3.2 TLS 密钥对4. 启动容器5. 测试5.1 登陆5.2 API访问5.3 镜像入库5.4 查询镜像信息Podman是一个无守护进程的开源…

JavaScript基础(14)_in、hasOwnProperty、instanceof的用法、垃圾回收

in 用法:检查对象和原型对象是否含有该属性。 语法:"属性名" in 对象名 hasOwnProperty 用法:检查对象自身是否含有该属性。 语法:对象名.hasOwnProperty("属性名") instanceof 用法:检查一个对…

在裸机上输出Hello,world! [rCore-lab1]

引言 非常简单的“Hello, world”应用程序,实际上有着多层硬件和软件工具和支撑环境隐藏在它背后,才让我们不必付出那么多努力就能够创造出功能强大的应用程序。生成应用程序二进制执行代码所依赖的是以 编译器 为主的开发环境;运行应用程序执行码所依赖…

寻找更好的分类模型loss

寻找更好的loss1.CE loss并不完美2.可能更好的loss函数2.1 CC-LOSS2.2 Center-LOSS参考文献1.CE loss并不完美 最常用于深度学习分类模型的损失函数可以说就是CE(交叉熵) loss了。正如CC-LOSS paper中所述,该loss更关注各类是否separated,而非不同类之间…

Zookeeper:实现“通知协调”的 Demo

应用配置集中到节点上,应用启动时主动获取,并在节点上注册一个 watcher,每次配置更新都会通知到应用。数据发布/订阅(Publish/Subscribe)系统,即所谓的配置中心,顾名思义就是发布者将数据发布到…

[机器翻译]——pivot-based zero-shot translation based on fairseq

文章目录前言翻译到en生成"伪"的、到英语的数据文件把每一个zs语言对翻译到en从fairseq-generate生成的文件中,抽取纯en文件把en数据和所有zs语言对的tgt数据形成平行语料,然后做预处理形成en到tgt的平行语料预处理在en到tgt语言的"伪&qu…

IMC附录A

目录 A.1 恒等式与不等式 THEOREM A.1 (Binomial expansion theorem) PROPOSITION A.2 PROPOSITION A.3 PROPOSITION A.4 A.2 渐进符号 DEFINITION A.5 A.3 概率论基础 PROPOSITION A.7 (Union Bound) THEOREM A.8 (Bayes’ Theorem) PROPOSITION A.9 PROPOSITI…

图扑 Web SCADA 零代码组态水泥生产工艺流程 HMI

水泥是建筑工业三大基本材料之一,素有“建筑工业的粮食”之称。2022 年 1-9 月水泥产量为 15.63 亿吨,生产方法包括新型干法、立窑、湿窑、干法中空窑和立波尔窑等。 水泥生产线链条长、关键环节多的特性要求执行严密的流程监控。图扑软件大屏组态、UI 组…

国内家具行业数据浅析

大家好,这里是小安说网控。 家具是国民消费必需品之一,受疫情影响,近期销量数据不佳。2022年上半年,规模以上家具制造业企业营业收入3604亿元,同比下降4%;实现利润总额174.8亿元,同比增长2.6%。…

数据结构排序算法之冒泡排序

一 相关概念 稳定排序:如果原数据中a在b之前,而且ab,排序后a任然在b之前 不稳定排序:如果原数据中a在b之前,而且ab,排序后a在b之后 时间复杂度:对排序数据的总的操作次数,反映当n变…