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

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.mzph.cn/news/746890.shtml

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

相关文章

【Java 并发】AbstractQueuedSynchronizer

1 AQS 简介 在同步组件的实现中, AQS 是核心部分, 同步组件的实现者通过使用 AQS 提供的模板方法实现同步组件语义。 AQS 则实现了对同步状态的管理, 以及对阻塞线程进行排队, 等待通知等一些底层的实现处理。 AQS 的核心也包括了这些方面: 同步队列, 独占式锁的获取和释放, 共…

做一个微信小程序需要什么条件?

在移动互联网时代,微信小程序已成为连接用户与服务的重要桥梁。它们无需下载安装,使用方便,功能强大,成为商家和开发者的新宠。如果你想要开发一个微信小程序,需要满足哪些条件? 一、开发小程序的基本条件…

Redis 持久化-RDB

RDB(Redis DataBase),在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。 Redis会单独创建(fork)一个子进程来进行持久化&…

用网格大师网络重划分时,坐标原点按照XML文件原点填写,导出的瓦块文件命名不对,坐标原点该怎么填写

瓦块名称和原来不一致的原因是瓦块原点这里设置的不对,要和重建设置的瓦块原点保持一致。 网格大师是一款能够解决实景三维模型空间参考、原点、瓦块大小不统一,重叠区域处理问题的工具“百宝箱”,集格式转换、坐标转换、轻量化、瓦片重划分…

ModStartBlog v9.1.0 桌面快捷应用,图片上传前端压缩

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场,后台一键快速安装 …

淘宝商品销量数据接口,淘宝API接口

淘宝商品销量数据接口是淘宝开放平台提供的一种API接口,通过该接口,商家可以获取到淘宝平台上的商品销量数据。 淘宝商品销量数据接口可以用于获取特定商品的销量数据、特定店铺的销量数据、特定类目的销量数据等。商家可以根据自己的需求来调用该接口&…

控制学习_正弦波无刷直流力矩电机建模、控制带宽讨论与选择

无刷电机通过电子换向器实现定子的磁场旋转,去电刷后使用寿命大幅提升,是现在更流行的选择。三相无刷电机则是无刷电机中比较流行的一款。三相无刷电机的驱动方式有多种,最简单的被称为梯形波驱动、方波驱动或正弦波驱动。而正弦波驱动技术可…

前端路由跳转bug

路由后面拼接了id的千万不能取相近的名字,浏览器分辩不出,只会匹配前面的路径 浏览器自动跳转到上面的路径页面,即使在菜单管理里面配置了正确的路由 跳转了无数次,页面始终不对,检查了路由配置,没有任何问…

java枚举与模拟方法

枚举 枚举的定义 枚举算法(穷举算法),这种算法就是在解决实际问题的时候去使用所有的方式去解决这个问题,会通过推理去考虑事件发生的每一种可能性,最后推导出结果 优点 简单粗暴,他暴力的枚举所有可能&…

3.14号arm

1. 计算机基础理论 1.1 计算机的组成 输入设备:将数据转换成计算机可以识别,存储,处理的形式,发送到计算机中 输出设备:将计算机对程序和数据的运算结果输送到外部的设备 存储器:用于将数据保存的模块。 …

【火猫TV】欧联:8强无弱队,意甲英超球队扎堆,利物浦和药厂优势很大!

2023-2024欧联杯八强正式出炉,马赛、本菲卡、勒沃库森、利物浦、西汉姆联、罗马、亚特兰大和AC米兰成功拿到了晋级名额,于是球迷们即将看到近20年竞争最激烈的欧联杯八强对决。虽然这些队伍实力有强有弱,但是能够拼到现在的球队没有弱旅&…

1335:【例2-4】连通块

【算法分析】 设数组vis,vis[i][j]表示(i,j)位置已经访问过。遍历地图中的每个位置,尝试从每个位置开始进行搜索。如果该位置不是0且没有访问过,那么访问该位置,并尝试从其上下左右四个位置开始搜索。在看一个新的位置时&#xff…

医疗设备控费系统防止私收、漏收、人情费

加19339904493(康) 医院完成信息化建设,不仅是一次技术性人深过信息化技术,医院能够更好地管理病患信息,提高诊断的准确性和效率,同时优化医疗资源的配置,降低医疗成本。在信息化的推动下&#…

Git概述及安装步骤

一、Git简介 Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。Git 易于学习,占地面积小,性能极快。它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于Subversion、CV…

Linux下的多线程编程:原理、工具及应用(1)

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:Flower of Life—陽花 0:34━━━━━━️💟──────── 4:46 🔄 ◀️ ⏸ ▶️ ☰ …

文献速递:深度学习乳腺癌诊断---使用深度学习改善乳腺癌组织学分级

Title 题目 Improved breast cancer histological grading using deep learning 使用深度学习改善乳腺癌组织学分级 01 文献速递介绍 乳腺癌组织学分级是乳腺癌中一个确立的临床变量,它包括来自三个方面的信息,即小管形成程度、核多态性和有丝分裂计…

IP证书有什么作用?怎么申请?

关于IP地址证书,它的主要作用有这么几个点: 1.验明正身:就像身份证一样,它可以证明某个服务器的IP地址是真的、合法的,让咱知道咱们连接的就是正确的服务器,而不是冒牌货。这样一来,就可以降低像…

【C++设计模式】策略模式

文章目录 前言一、策略模式是什么?二、策略模式的实现原理三、UML图四、代码实现总结 前言 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。通过将每个算法封装到具有共同接口的独立类中,客户端可以在不改变自身代码的情况下选择…

Bugku MISC做题笔记

简单套娃DX 这一题需要对png图片的结构有所了解。详细可参考https://www.w3.org/TR/png/ 幸好每一张图片只有一个错误,逐步调试,就可以发现所有错误,修正即可。具体错误参看python程序中的注释: import ossrc_dir .\\XD\\ de…

微信每天通过好友上限是多少个呢?

微信每天通过好友上限是多少个呢? 1、新号和不活跃的号 微信新号是指注册不满15十五天,或者注册超过15天,但是没有好好养号的的账号。(包括很多长期不活跃的账号,突然使用的情况) 2、正常帐号 &#xf…