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.hqwc.cn/news/541621.html

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

相关文章

KKView远程控制: todesk内网穿透

Todesk内网穿透:实现远程访问的新途径 在数字化时代,远程访问已成为许多企业和个人的基本需求。Todesk作为一款远程桌面控制软件,其内网穿透功能为用户提供了便捷、安全的远程访问体验。本文将介绍Todesk内网穿透的原理、应用场景及其优势&a…

【机器学习】走进监督学习:构建智能预测模型的第一步

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

2024年【天津市安全员C证】考试内容及天津市安全员C证考试报名

题库来源:安全生产模拟考试一点通公众号小程序 天津市安全员C证考试内容是安全生产模拟考试一点通生成的,天津市安全员C证证模拟考试题库是根据天津市安全员C证最新版教材汇编出天津市安全员C证仿真模拟考试。2024年【天津市安全员C证】考试内容及天津市…

开发反应式API

开发反应式API 开发反应式API1 使用SpringWebFlux1.1 Spring WebFlux 简介1.2 编写反应式控制器 2 定义函数式请求处理器3 测试反应式控制器3.1 测试 GET 请求3.2 测试 POST 请求3.3 使用实时服务器进行测试 4 反应式消费RESTAPI4.1 获取资源4.2 发送资源4.3 删除资源4.4 处理错…

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

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

数据结构知识点汇总(持续更新版)

数据结构 一、绪论 检测知识: 1.1基本概念 以前的计算机 弹道计算机 现如今 主要运用于非数值的计算 基本概念和术语 数据:是信息的载体,描述客观事物属性的值,字符以及所有能输入到计算机中并被计算机程序识别和处理的符号的…

CorelDRAW2024中文版全新来袭,让你的设计创意无限!

一、CorelDRAW软件的概述 CorelDRAW是一款由加拿大Corel公司开发的矢量图形编辑软件,自1989年以来,一直以其强大的功能和易用性深受广大设计师的喜爱。CorelDRAW软件不仅适用于个人创作者,还广泛应用于各类企业、出版社、教育机构等领域&…

考研C语言复习进阶(5)

目录 1. 为什么使用文件 2. 什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3. 文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 4. 文件的顺序读写 ​编辑 ​编辑 4.1 对比一组函数: ​编辑 5. 文件的随机读写 5.1 fseek 5.2 ftell 5.3 rewind…

【MySQL基础】MySQL基础操作二

文章目录 🍎1.数据库约束🍐约束类型🍆1.1NOT NULL🍆1.2UNIQUE🍆1.3DEFAULT🍆1.4PRIMARY KEY🍆1.5FOREIGN KEY 🍏2.查询操作🍟2.1聚合查询🍔2.1.1聚合函数&…

植物miRNA数据库PmiREN2.0的使用

前记 miRNA数据库是一个用于存储和分析microRNA(miRNA)序列和相关信息的数据库。miRNA是一类具有约20-24个核苷酸的非编码小RNA分子,通过调控基因表达来参与细胞生物学过程。miRNA数据库中通常包含miRNA序列、miRNA靶向基因、miRNA表达谱、m…

【Linux】IPC-信号

💻文章目录 📄前言信号概念信号阻塞概念 信号的处理信号的使用 📓总结 📄前言 信号,一种无论是生活还是编程都离不开的东西。生活中,我们通过信号来对外部发生的事情进行反应,就好像你的手机来了…

20240304 json可以包含复杂数组(数组里面套数组)

欣赏一下我的思维,它会以漫画,表格,文字。。。各种各样的形式呈现 对于问题1问题2 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON本质上是一种文本…