首页 > 其他分享 >FreeRTOS-队列基础

FreeRTOS-队列基础

时间:2024-06-04 15:34:39浏览次数:23  
标签:函数 FreeRTOS 队列 写入 void 基础 QueueHandle GPIO

以下内容为个人的初学记录,如有错误,欢迎指正

一、概述

  • 队列用于数据的传输,数据按照**“先进先出”**(FIFO)的规则;一般情况下,数据被放入到底部(Back)指向的位置(除非使用向头部写入数据的函数),被头部(Front)指向时被读出
  • 队列能够进行阻塞、唤醒,当接收任务发现队列为空时,会进入阻塞而不占用CPU,发送任务发现队列为满时也会进入阻塞,这样能够提高运行效率。

使用队列传输数据的方式有两种:

  1. 拷贝(将数据值复制到队列中);
  2. 引用(将数据的地址复制到队列中);

下面通过简单的练习来初步了解队列的基本内容,包含:

  1. 队列的动态创建
  2. 队列的阻塞访问

二、基本函数

队列创建

队列的创建(动态和静态),返回值是pdPASS/NULL:

QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );

uxQueueLength:队列的长度;
uxItemSize:队列数据的大小(单位为byte)

QueueHandle_t xQueueCreateStatic( 
                           UBaseType_t uxQueueLength, 
                           UBaseType_t uxItemSize, 
                           uint8_t *pucQueueStorageBuffer, 
                           StaticQueue_t *pxQueueBuffer 
                       );

(与上面重复的不再描述)
pucQueueStorageBuffer:指向一个uint8_t数组的指针,该数组存储队列的消息数据
pxQueueBuffer:指向StaticQueue_t结构体的指针,该结构体存储队列的数据结构

写入队列函数,返回值是pdPASS/errQUEUE_FULL

BaseType_t xQueueSend( 
                  QueueHandle_t    xQueue, 
                  const void       *pvItemToQueue, 
                  TickType_t       xTicksToWait 
              ); 

pvItemToQueue:写入的数据的指针
xTicksToWait:阻塞时长

BaseType_t xQueueSendToBack( 
                          QueueHandle_t  xQueue, 
                          const void     *pvItemToQueue, 
                          TickType_t     xTicksToWait 
                      ); 

xQueueSend本身就是往队列的尾部执行写操作,因此和xQueueSendToBack的作用是一样的;另外有往头部进行写操作的函数

读取队列,返回值pdPASS/errQUEUE_EMPTY


BaseType_t xQueueReceive( QueueHandle_t xQueue, 
                          void * const pvBuffer, 
                          TickType_t xTicksToWait ); 

pvBuffer:指向存放读取数据的变量的指针
除了上述普通的队列读写函数,另外还有专门用在中断函数内的队列读写函数(xQueueSendToBackFromISR、xQueueSendToFrontFromISR、xQueueReceiveFromISR)

删除队列:

void vQueueDelete(QueueHandle_t xQueue);

三、练习

写入队列的任务函数该函数在每次发送数据后,会转置一次PC13电平。定义如下:

void SendTask(void* argument){
	uint16_t data = 0;
	while(1){
		vTaskDelay(100/portTICK_PERIOD_MS);
		BaseType_t SendStatus = xQueueSendToBack(TaskQueueHandle, &data, portMAX_DELAY);	
		HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
		data++;
	}
}

读取队列的任务函数在PC14电平被人为置高电平后接收并打印数据,置低电平停止读取队列。定义如下:

void ReceiveTask(void* argument){
	uint16_t buffer;
	while(1){
		if( HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_14)==SET ){
			BaseType_t ReceiveStatus = xQueueReceive(TaskQueueHandle, &buffer, portMAX_DELAY);
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_RESET);
			if(ReceiveStatus == pdPASS)
				printf("receive = %u\r\n", buffer);
		}
	}
}

现象如下,其中红色电平信息为【写入任务】,绿色为【读取任务】。一开始PC14未置高,【写入任务】在发送5次数据后进入阻塞(后续的代码不会执行,包括电平不会翻转、data不会自增)
在这里插入图片描述
接收数据没有出现“断层”,说明data在没有在写入失败时继续自增,也说明了【写入任务】进入了阻塞
在这里插入图片描述

标签:函数,FreeRTOS,队列,写入,void,基础,QueueHandle,GPIO
From: https://blog.csdn.net/2301_78981010/article/details/139394633

相关文章

  • 数据库初识、介绍、SQL语句的由来(库、表、记录表头、表单)、SQL语句基础(注释以及修
    【一】数据库初识【1】文件存储(1)基于内存保存一开始做员工系统是基于列表或字典(内存)来存储数据(2)文件操作在Python指令中学习文件操作,将一些数据都保存到了本地的文本文件中。因为先前学习了如何搭建TCP的客户端和服务端并且在这之中TCP服务端作为存储服务,TCP客户......
  • webf 开发工具:数据库持久层基础文件生成工具
    WZW.SqlMapHelpForJava是运行在.NetFramework4.0上的数据库持久层基础文件生成工具,支持多种关系型数据库的持久层基础文件、Java类的生成以及对配置文件的更新,与webf框架进行紧密配合,减少了数据库持久层基础文件编写工作量,提高持久层代码的有效及准确性。WZW.SqlMapHelpFo......
  • canvas的基础使用
    目录1.了解canvas1.1canvas元素1.2兼容性1.3支持性2.使用canvas2.1获取canvas绘图上下文2.2绘制demo3.绘制矩形4.绘制path4.1绘制线条lineTo4.2绘制圆arc5.设置线条宽度、颜色、连接点样式等5.1线条宽度lineWidth5.2颜色fillStyle、strokeStyle5.3连接......
  • Python编程学习第一篇——Python零基础快速入门(五)-列表(List)
    今天我们来一起学习Python的列表(list),Python中的列表(List)是一种有序、可变的数据结构,可以用来存储多个值。列表可以包含不同类型的数据,例如整数、浮点数、字符串等。以下是关于Python列表定义、语法和基本操作的详细示例:1.定义列表:   可以使用方括号[]来定义一个列表。......
  • Java数据结构-delayQueue-优先队列--信号量
    原编辑链接:https://www.yuque.com/zhaozhaozhaozhao-khkij/lp7g2t/blwysxg3ygb00dw6?singleDoc#《3delayqueue》Queue问题单端队列和双端队列,分别对应的实现类是哪个?○Java中的单项队列queue是用链表实现的,Queue本身是一个接口,继承了Collection集合;○双端队列(De......
  • 【Linux】(一)——Linux基础和Linux命令基础语法
    目录Linux基础Linux发行版本Linux终端Linux命令Linux基础Linux,通常指的是GNU/Linux操作系统,这是一个开源且免费使用的类UNIX操作系统。它的核心组件——Linux内核,由林纳斯·托瓦兹(LinusTorvalds)在1991年10月5日首次发布。Linux内核的设计灵感来源于Minix和Unix,并......
  • 【Linux】多进程基础
    文章目录查看进程相关命令进程相关函数孤儿进程僵尸进程进程回收进程通信(IPC)匿名管道pipe通信的使用有名管道:FIFO读写管道总结mmap内存映射查看进程相关命令ps-ef:SystemV风格查询所有的进程信息,-e参数表示显示所有进程,-f表示使用全格式输出,包含更多的列信息......
  • (十三)统计学基础练习题七(选择题T301-350)
    本文整理了统计学基础知识相关的练习题,共50道,适用于想巩固统计学基础或备考的同学。来源:如荷学数据科学题库(技术专项-统计学二)。序号之前的题请看往期文章。301)302)303)304)305)306)307)308)309)310)311)312)313)314)315)316)317)318)319)320)321)322)......
  • Java基础——抽象类与抽象方法
    抽象方法:    将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容不一样,所以,在父类中不能确定具体的方法体。该方法可以定义为抽象方法抽象类:    如果一个类中存在抽象方法,那么该类就必须声明为抽象类抽象方法的定义格式:    publicabstra......
  • 代码随想录算法训练营day13(栈与队列)
    代码随想录算法训练营day:学习内容:今天主要学习队列239347学习产出:239一开始想着直接暴力遍历,但是时间复杂度为nk。采用deque实现一个单调队列,因为我们需要一个队列,这个队列呢,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最......