FreeRTOS——队列及其实战

1.队列概念

1)队列是任务到任务、任务到中断、中断到任务数据交流的一种机制(消息传递)
2)队列类似数组,只能存储有限数量、相同类型的数据,在创建时需指定队列长度与队列项大小
3)出队入队阻塞:
若阻塞时间为0 :直接返回不会等待;
若阻塞时间为0~port_MAX_DELAY :等待设定的阻塞时间,若在该时间内还无法入队,超时后直接返回不再等待;
若阻塞时间为port_MAX_DELAY :死等,一直等到可以入队为止。出队阻塞与入队阻塞类似;
4)数据传递方式:FreeRTOS中队列采用实际值传递,即将数据拷贝到队列中进行传递, FreeRTOS采用拷贝数据传递,也可以传递指针,所以在传递较大的数据的时候采用指针传递
在这里插入图片描述

2.队列结构体

typedef struct QueueDefinition
{
int8_t * pcHead /* 存储区域的起始地址 /
int8_t * pcWriteTo; /
下一个写入的位置 /
union
{
QueuePointers_t xQueue;
SemaphoreData_t xSemaphore;
} u ;
List_t xTasksWaitingToSend; /
等待发送列表 /
List_t xTasksWaitingToReceive; /
等待接收列表 /
volatile UBaseType_t uxMessagesWaiting; /
非空闲队列项目的数量 /
UBaseType_t uxLength; /
队列长度 /
UBaseType_t uxItemSize; /
队列项目的大小 /
volatile int8_t cRxLock; /
读取上锁计数器 /
volatile int8_t cTxLock; /
写入上锁计数器 /
/
其他的一些条件编译 */
} xQUEUE;
在这里插入图片描述

3队列相关API函数介绍

3.1 创建队列

xQueueCreate() 动态创建
xQueueCreateStatic() 静态创建
实际调用xQueueGenericCreate()
#define xQueueCreate ( uxQueueLength, uxItemSize ) \
xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), (queueQUEUE_TYPE_BASE ))
返回值: NULL 创建失败
其他值 创建成功
注意队列类型6种:
#define queueQUEUE_TYPE_BASE ( ( uint8_t ) 0U ) /* 队列 /
#define queueQUEUE_TYPE_SET ( ( uint8_t ) 0U ) /
队列集 /
#define queueQUEUE_TYPE_MUTEX ( ( uint8_t ) 1U ) /
互斥信号量 /
#define queueQUEUE_TYPE_COUNTING_SEMAPHORE ( ( uint8_t ) 2U ) /
计数型信号量 /
#define queueQUEUE_TYPE_BINARY_SEMAPHORE ( ( uint8_t ) 3U ) /
二值信号量 /
#define queueQUEUE_TYPE_RECURSIVE_MUTEX ( ( uint8_t ) 4U ) /
递归互斥信号量 */

3.2 队列写入消息API函数

在这里插入图片描述调用函数xQueueGenericSend( ),只是指定了不同的写入位置有三种位置如下:
#define queueSEND_TO_BACK ( ( BaseType_t ) 0 ) /* 写入队列尾部 /
#define queueSEND_TO_FRONT ( ( BaseType_t ) 1 ) /
写入队列头部 /
#define queueOVERWRITE ( ( BaseType_t ) 2 ) /
覆写队列*/
xQueueGenericSend( QueueHandle_t xQueue, //待写入队列
const void * const //待写入消息
pvItemToQueue, //阻塞超时时间
TickType_t xTicksToWait, //写入位置
返回值: pdTRUE 队列写入成功
errQUEUE_FULL 队列写入失败

3.3 从队列读取消息API函数

在这里插入图片描述
BaseType_t xQueueReceive( QueueHandle_t xQueue, //带读取队列
void * const pvBuffer, //信息读取缓冲区
TickType_t xTicksToWait ) //阻塞超时时间
返回值: pdTRUE 读取成功
errQUEUE_FULL 读取失败

4 队列实战

在这里插入图片描述

4.1 freertos_demo.c

#include "freertos_demo.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"//1任务 配置//1.1START_TASK 任务 配置
#define START_TASK_PRIO 1                   /* 任务优先级 */
#define START_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            StartTask_Handler;  /* 任务句柄 */
void start_task(void *pvParameters);        /* 任务函数 *///1.2TASK1 任务 配置
#define TASK1_PRIO      2                   /* 任务优先级 */
#define TASK1_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            Task1Task_Handler;  /* 任务句柄 */
void task1(void *pvParameters);             /* 任务函数 *///1.3TASK2 任务 配置
#define TASK2_PRIO      3                   /* 任务优先级 */
#define TASK2_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            Task2Task_Handler;  /* 任务句柄 */
void task2(void *pvParameters);             /* 任务函数 */#define TASK3_PRIO         4
#define TASK3_STK_SIZE   128
TaskHandle_t    task3_handler;
void task3( void * pvParameters );//2 队列配置
QueueHandle_t key_queue;        /* 小数据句柄 */
QueueHandle_t big_date_queue;   /* 大数据句柄 */
char buff[100] = {"我是一个大数组,大大的数组 124214 uhsidhaksjhdklsadhsaklj"};//2 freertos_demo函数中创建start_task1任务
void freertos_demo(void)
{xTaskCreate((TaskFunction_t )start_task,            /* 任务函数 */(const char*    )"start_task",          /* 任务名称 */(uint16_t       )START_STK_SIZE,        /* 任务堆栈大小 */(void*          )NULL,                  /* 传入给任务函数的参数 */(UBaseType_t    )START_TASK_PRIO,       /* 任务优先级 */(TaskHandle_t*  )&StartTask_Handler);   /* 任务句柄 */vTaskStartScheduler();
}//2 start_task函数中创建task1、task2任务
void start_task(void *pvParameters)
{//2.2进入临界区 taskENTER_CRITICAL();  /* 队列的创建 */key_queue = xQueueCreate( 2, sizeof(uint8_t) );if(key_queue != NULL){printf("key_queue队列创建成功!!\r\n");}else printf("key_queue队列创建失败!!\r\n");big_date_queue = xQueueCreate( 1, sizeof(char *) );if(big_date_queue != NULL){printf("big_date_queue队列创建成功!!\r\n");}else printf("big_date_queue队列创建失败!!\r\n");// 2.1创建任务1 xTaskCreate((TaskFunction_t )task1,(const char*    )"task1",(uint16_t       )TASK1_STK_SIZE,(void*          )NULL,(UBaseType_t    )TASK1_PRIO,(TaskHandle_t*  )&Task1Task_Handler);// 2.2创建任务2 xTaskCreate((TaskFunction_t )task2,(const char*    )"task2",(uint16_t       )TASK2_STK_SIZE,(void*          )NULL,(UBaseType_t    )TASK2_PRIO,(TaskHandle_t*  )&Task2Task_Handler);// 2.3创建任务3xTaskCreate((TaskFunction_t )task3,(const char*    )"task3",(uint16_t       )TASK3_STK_SIZE,(void*          )NULL,(UBaseType_t    )TASK3_PRIO,(TaskHandle_t*  )&Task2Task_Handler);vTaskDelete(StartTask_Handler);//退出临界区taskEXIT_CRITICAL();  
}//3 task1实现入队
void task1(void *pvParameters)
{int8_t key = 0;char * buf;BaseType_t err =0;buf = &buff[0];while (1){key = key_scan(0);if (key == KEY0_PRES || key == KEY1_PRES){err = xQueueSend(key_queue, &key, portMAX_DELAY);    /* 将键值作为消息发送到队列中 */if(err != pdTRUE){printf("key_queue发送失败\r\n");}}else if(key == WKUP_PRES){err = xQueueSend(big_date_queue,&buf, portMAX_DELAY);    /* 将键值作为消息发送到队列中 */if(err != pdTRUE){printf("big_date_queue发送失败\r\n");}  }vTaskDelay(10);}}//4 他上课小数据出队
void task2(void *pvParameters)
{uint8_t key = 0;                    //接收从队列中的读取值BaseType_t err = 0;while(1){err=xQueueReceive(key_queue,&key,portMAX_DELAY);if(err != pdTRUE){printf("key_queue读取失败\r\n");}else{printf("key_queue读取队列成功,数据:%d\r\n",key);}}}//5 大数据出队
void task3(void *pvParameters)
{char* buf = 0;                    //接收从队列中的读取值BaseType_t err = 0;while(1){err=xQueueReceive(big_date_queue,&buf,portMAX_DELAY);if(err != pdTRUE){printf("big_date_queue读取失败\r\n");}else{printf("数据:%s\r\n",buf);}}}

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

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

相关文章

职场商务英语口语“自助餐”用英文怎么说?柯桥外语培训

“自助餐”用英语怎么说? ● 其实很简单,“自助餐”的英文就是:Buffet。 例句: At lunchtime, theres a choice between the buffet or the set menu.15857575376 午饭时,可以选择自助餐或套餐。 We are going to …

Dubbo 3.x源码(15)—Dubbo服务发布导出源码(4)

基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo 3.x源码(14)—Dubbo服务发布导出源码(3),也就是Dubbo服务导出的核心方法doExportUrl的上半部分源码,现在我们继续学习,服务导出的核心方法doExportUr…

多技术融合在生态系统服务功能社会价值评估中的应用及论文写作、拓展分析

生态系统服务是人类从自然界中获得的直接或间接惠益,可分为供给服务、文化服务、调节服务和支持服务4类,对提升人类福祉具有重大意义,且被视为连接社会与生态系统的桥梁。自从启动千年生态系统评估项目(Millennium Ecosystem Asse…

DolphinScheduler实际应用

前言 最近公司新启动了一个项目,然后领导想用一下新技术,并且为公司提供多个大数据调度解决方案,我呢就根据领导要求调研了下当前的开源调度工具,最终决定采用DolphinScheduler, 因此研究了一下DolphinScheduler &…

Vue3+Three.js星空球体

结果图 threejs比例不变自适应 首先是设置相机和render,要注意的就是相机要加上aspect不然如果页面不是正方形看到的样式就会失调。 // ---------相机设置------------- // 实例化一个透视投影相机对象 const camera new THREE.PerspectiveCamera(); //相机在Thr…

Modbus转Profinet解决方案,轻松搭建工业通信“桥梁”

在工业自动化领域,Modbus和Profinet是两种常见的通信协议。由于许多现有的工业设备使用的是Modbus协议,而现代化的工业系统通常采用Profinet,所以将Modbus转换为Profinet成为了解决方案的一个重要需求。 Modbus转Profinet解决方案具体包括以下…

Minio集群部署(docker版本)

先在/etc/hosts中添加虚拟域名 {ip} minio1 {ip} minio2 执行docker命令 docker run -it -d --name minio-01 --restartalways --nethost \ -e "MINIO_ROOT_USER{用户名}" \ -e "MINIO_ROOT_PASSWORD{密码}" \ -v /data/docker/minio/update:/data1 #…

CMake入门教程【基础篇】CMake+Visual Studio2022构建C++项目

文章目录 1.概述2.Visual Studio 2022简介3.安装Visual Studio 20224.安装CMake5.创建CMake项目6. 构建项目 1.概述 CMake和Visual Studio 2022结合 在现代软件开发中,CMake和Visual Studio 2022的结合提供了一个强大的环境,用于构建和管理各种规模的C项…

ITSS服务工程师vs ITSS服务经理:哪个职位更适合你?

✨在信息技术服务领域,ITSS服务工程师和ITSS服务经理是两个极具吸引力的职位。但它们各自的特点和要求是什么?哪个更适合你的职业规划和个人兴趣?接下来,我们将为你详细解读这两个职位的区别,帮助你做出明智的选择&…

环境准备-VMware安装

照顾到很多人不是很会环境搭建,我这里会将搭建的步骤讲的细致点 第一步,VMware下载。目的是通过VMware搭建Linux服务器,因为大家大部分还是Windows的电脑,我们先下载虚拟机搭建一个Linux系统的服务器 下载完成之后,点击安装,如下: 点击“下一步” 勾选“我接受许可协议…

【解决|三方工具】导入 XChart 后提示丢失关于 TMPPro 工具引用

开发平台:Unity 2021 版本 插件版本:XChart 3.0:官方文档 - https://github.com/XCharts-Team/XCharts   问题描述 导入 XChart 插件至 Unity 中出现 目录:Component、Theme 等提示丢失 TMPPro(TextMeshPro 工具&…

【数据结构和算法】寻找数组的中心下标

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 前缀和的解题模板 2.1.1 最长递增子序列长度 2.1.2 寻找数组中第 k 大的元素 2.1.3 最长公共子序列…