FreeRTOS学习第10篇--队列使用示例

news2025/1/16 16:02:31

FreeRTOS学习第10篇–队列使用示例

本文目标:FreeRTOS学习第10篇–队列使用示例

按照本文的描述,可以进行简单的使用队列。

本文实验条件:拥有C语言基础,装有编译和集成的开发环境,比如:Keil uVision5

设计实验

在本次实验中,继续沿用上一篇的工程文件,将输入通过遥控器获取的数据改用队列的方式进行实现。

创建队列

函数原型

QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );

函数描述:

函数 xQueueCreate 用于创建队列。

第 1 个参数uxQueueLength是队列支持的消息个数,最多能存放多少个数据(item)

第 2 个参数uxItemSize是每个消息的大小,单位字节。

返回值:非 0:成功,返回句柄,以后使用句柄来操作队列NULL:失败,因为内存不足

写队列

函数原型

BaseType_t xQueueSend(
     QueueHandle_t xQueue, /* 消息队列句柄 */
     const void * pvItemToQueue, /* 要传递数据地址 */
     TickType_t xTicksToWait /* 等待消息队列有空间的最大等待时间*/
 );

函数描述:

第 1 个参数xQueue是消息队列句柄。

第 2 个参数pvItemToQueue要传递数据地址,每次发送都是将消息队列创建函数 xQueueCreate 所指定的单个消息大

小复制到消息队列空间中。

第 3 个参数xTicksToWait是当消息队列已经满时,等待消息队列有空间时的最大等待时间,单位系统时钟节拍。如果被设为 0,无法写入数据时函数会立刻返回;如果被设为 portMAX_DELAY,则会一直阻塞直到有空间可写

返回值,如果消息成功发送返回 pdPASS,失败返回 errQUEUE_FULL。

使用这个函数要注意的点:

  1. FreeRTOS 的消息传递是数据的复制,而不是传递的数据地址。

  2. 此函数是用于任务代码中调用的,故不可以在中断服务程序中调用此函数,中断服务程序中使用的是xQueueSendFromISR。

  3. 如果消息队列已经满且第三个参数为 0,那么此函数会立即返回。

  4. 如果用户将 FreeRTOSConfig.h 文件中的宏定义 INCLUDE_vTaskSuspend 配置为 1 且第三个参数配置为 portMAX_DELAY,那么此发送函数会永久等待直到消息队列有空间可以使用。

  5. 消息队列还有两个函数 xQueueSendToBack 和 xQueueSendToFront,函数 xQueueSendToBack实现的是 FIFO 方式的存取,函数 xQueueSendToFront 实现的是 LIFO 方式的读写。我们这里说的函数 xQueueSend 等效于 xQueueSendToBack,即实现的是 FIFO 方式的存取。

读队列

函数原型

BaseType_t xQueueReceive(
     QueueHandle_t xQueue, /* 消息队列句柄 */
     void *pvBuffer, /* 接收消息队列数据的缓冲地址 */
     TickType_t xTicksToWait /* 等待消息队列有数据的最大等待时间 */
 );

函数描述:

第 1 个参数xQueue是消息队列句柄。

第 2 个参数pvBuffer要传递数据地址,bufer 指针,队列的数据会被复制到这个 buffer复制多大的数据?在创建队列时已经指定了数据大小。缓冲区空间要大于等于消息队列创建函数 xQueueCreate 所指定的单个消息大小,否则取出的数据无法全部存储到缓冲区,从而造成内存溢出。

第 3 个参数xTicksToWait是当消息队列为空时,等待消息队列有数据的最大等待时间,单位系统时钟节拍。

本次实验示例代码片段

在本次工程中,按键获取数据的方式来自中断,在中断进行写队列,调用的如下的代码进行写队列:

    // 在中断的代码进行调用
    /* 写队列 */
    idata.dev = datas[0];
    idata.val = datas[2];
    xQueueSendFromISR(g_xQueuePlatform, &idata, NULL);

而在任务中使用如下的代码进行读队列

xQueueReceive(g_xQueuePlatform, &idata, portMAX_DELAY); 

在game1_task游戏中的代码片段

void game1_task(void *params)
{		
	
	uint8_t dev, data, last_data;
	struct input_data idata;
	g_framebuffer = LCD_GetFrameBuffer(&g_xres, &g_yres, &g_bpp);
	
	draw_init();
	draw_end();
	/* 创建队列 */
	g_xQueuePlatform = xQueueCreate(10, sizeof(struct input_data));
//	g_xQueueKey = xQueueCreate(10, sizeof(struct key_data));
	/* 创建一个按键任务,用于获取数据 */
//	xTaskCreate(KeyTask, "KeyTask", 128, NULL, osPriorityNormal, NULL);
    
	uptMove = UPT_MOVE_NONE;

	ball.x = g_xres / 2;
	ball.y = g_yres - 10;
	ball.velX = -0.5;
	ball.velY = -0.6;
//	ball.velX = -1;
//	ball.velY = -1.1;

	blocks = pvPortMalloc(BLOCK_COUNT);
  memset(blocks, 0, BLOCK_COUNT);
	
	lives = lives_origin = 3;
	score = 0;
	platformX = (g_xres / 2) - (PLATFORM_WIDTH / 2);
	
	// 创建一个挡球板任务
//	xTaskCreate(platform_task, "platform_task", 128, NULL, osPriorityNormal, NULL);

	game1_draw();
	LCD_Flush(); 
	while (1)
	{
				/* 读取红外遥控器 */
//		if (0 == IRReceiver_Read(&dev, &data))
		xQueueReceive(g_xQueuePlatform, &idata, portMAX_DELAY);
		data = idata.val;
		
		{
						if (data == 0x00)
						{
								data = last_data;
						}
						
						if (data == 0xe0) /* Left */
						{
								btnLeft();
						}

						if (data == 0x90)  /* Right */
						{
								btnRight();
						}
						last_data = data;
		}
			game1_draw();
			draw_end();
			vTaskDelay(50);
	}
}

实验结果

使用如上的代码在我硬件中进行测试,当我按下遥控器的左键时,挡球板跟着向左移动,当我按下遥控器的右键时,挡球板跟着向右进行移动,完成改造成使用队列读写demo。

在这里插入图片描述

本文中使用的工程

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

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

相关文章

独家授权!广东盈世获网易邮箱反垃圾服务的独家授权,邮件反垃圾更全面

近日,广东盈世计算机科技有限公司(以下简称“Coremail”)成功获得了网易(杭州)网络有限公司(以下简称“网易”)授予的网易邮箱反垃圾服务独家使用权。这一授权使得Coremail能够在邮件安全产品上…

创建出色用户界面的五个关键技巧,助您实现用户体验的提升!

易于理解的用户界面通常很容易阅读,它们有美丽的布局和完美的颜色组合,通过提供简单和直观的选项,告诉用户应用程序可以做什么。 因此,在创建用户界面时,(UI)当时,UI设计师往往优先…

人大金仓大小写敏感处理

人大金仓安装的时候,不管是否选择大小写敏感;查询的时候加和不加双引号,查询出来的都是小写 针对人大金仓大小写,我们实际引用全是大写的情况,解决方案如下 添加配置,将查询结果全都转成大写 1、本地打开…

FastAPI 是什么?深入解析

FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建基于 Python 的 API。它是一个开源项目,基于 Starlette 和 Pydantic 库构建而成,提供了强大的功能和高效的性能。 FastAPI 官网地址:fastapi.tiango…

npm WARN config init.license Use `--init-license` instead.

背景:近期升级本地node版本(v14.15.4 --> v18.19.1),npm -v报警 npm WARN config init.license Use --init-license instead. npm WARN config init.author.name Use --init-author-name instead. 分析: npm高版本…

使用pgadmin备份数据库

本人菜鸟, 在使用PostgreSQL数据库的时候, 经常会用到这个pgadmin的可视化工具 这个工具提供了很简单的备份和还原方法, 操作如下 备份 (1)首先鼠标右键选中你要备份的数据库,如图的 LBSYS (2)然后点击 backup (…

【SVG】前端-不依靠第三方包怎么画连线???

如何用SVG实现连线功能 在Web开发中,我们经常会遇到需要在页面上绘制图形或者实现一些图形交互的场景。SVG(Scalable Vector Graphics)作为一种用于描述二维图形的XML标记语言,在这方面提供了极大的便利。本文将以一个具体的例子…

WordPress网站启用cloudflare的CDN加速后,网站出现多重定向无法访问

这是一个使用Hostease的Linux虚拟主机的客户反馈的问题,Hostease的虚拟主机使用的也是cPanel面板,客户使用的是cPanel的softaculous安装的WordPress,但是在安装完成后,并且解析了域名之后,发现网站无法访问&#xff0c…

高校实验室科研仪器开放共享存在的问题及对策建议

随着科技的迅速发展和高校科研水平的提高,高校实验室科研仪器的开放共享已经成为推动科研进步和创新发展的重要手段。然而,在实际操作中,我们也面临着诸多问题和挑战。本文将分析高校实验室科研仪器开放共享存在的问题,并提出相应…

java复健-接口的开发及参数校验

遇到的问题以及解决方案 Q1. 开发接口的流程 A1: 明确需求阅读接口文档思路分析开发测试 Q2. 开发时用到的技术 A2: LomBok:Data,自动为我们的实体类创建构造方法,set(),get&am…

8. C++对象模型

1. 普通类对象是什么布局? struct Base {Base() default;~Base() default;void Func() {}int a;int b; };int main() {Base a;return 0; }2. 带虚函数的类对象是什么布局? struct Base {Base() default;virtual ~Base() default;void FuncA() {}v…

Uni-app跟学笔记(五):uni-ui组件库的使用、项目打包(小程序、h5、APP)

文章目录 1)uni-ui组件库的使用2)项目打包1:微信小程序打包2:h5打包3:安卓打包 本博客为 uni-app 此门课的跟学笔记,目的是便于个人复习和对知识快速索引,源码素材可在均可在视频评论区找到 1&a…

Vue2 父子组件某一属性的双向绑定

原本&#xff1a;父组件使用props传值给孩子组件初始化&#xff0c;触发事件子组件使用$emit传值给父组件&#xff0c;很麻烦后来&#xff1a;使用computed和$event例子代码&#xff1a; <template><div class"box">grandpa <el-input v-model"…

‍❄️Unity 官方免费资源大放送!森林、沙漠、北极等 350+逼真的自然纹理 Megapack等你来拿

&#x1f333;350自然纹理 Megapack&#xff0c;免费获取&#xff01;&#x1f381; 你是否热爱游戏开发&#xff0c;却被昂贵的资源库所困扰&#xff1f;你是否渴望创造出令人惊叹的自然场景&#xff0c;却被有限的纹理素材所束缚&#xff1f;如果你的答案是肯定的&#xff0c…

01- Java概述

第1章 Java概述 1.1 Java语言发展历史&#xff08;记关键点&#xff09; Java诞生于SUN&#xff08;Stanford University Network&#xff09;&#xff0c;09年SUN被Oracle&#xff08;甲骨文&#xff09;收购。 Java之父是詹姆斯.高斯林(James Gosling)。 1996年发布JDK1.…

分布式思想

1、单体架构设计存在的问题 传统项目采用单体架构设计,虽然可以在一定的程度上解决企业问题,但是如果功能模块众多,并且将来需要二次开发.由于模块都是部署到同一台tomcat服务器中,如果其中某个模块代码出现了问题,将直接影响整个tomcat服务器运行. 这样的设计耦合性太高.不便…

【软件测试基础篇】第二节.黑盒测试中常见方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言⼀、等价类法&#xff08;解决穷举问题&#xff09;二、边界值法&#xff08;解决边界限制问题&#xff09;三、正交表法&#xff08;解决多条件依赖问题&#…

Docker学习之镜像管理(超详解析)

Docker镜像生命周期&#xff08;可以把docker镜像理解为虚拟机镜像&#xff09; 实验内容&#xff1a; 搜索官方仓库镜像 [rootlocalhost ~]# docker search busybox //以查找busybox为例 搜索说明&#xff1a;name镜像名称 description镜像说明 stars点赞数量 official…

移动端使用 echarts中 滚动条 dataZoom 改造为内容区域可以左右滚动

移动端使用 echarts中 滚动条 dataZoom 改造为内容区域可以左右滚动 直接上图 &#xff1a; 主要是下面这段代码&#xff1a; "dataZoom": [{"type": "inside","show": false,"xAxisIndex": [0],"zoomOnMouseWheel&…

APP在应用商店该如何做好节日营销

38妇女节刚刚过去&#xff0c;不少商家吃上了一波节日红利。 你有没有注意到很多App在应用商店里改头换面&#xff0c;开展了很多以“三八节”为主题的营销活动&#xff0c;并且取得了不错的成绩。 可见季节性营销策划对产品的下载量和用户留存率还是很重要的。 那么我们如何…