首页 > 其他分享 >FreeRTOS-(2)-队列

FreeRTOS-(2)-队列

时间:2024-12-14 20:31:34浏览次数:7  
标签:U8G2 读取 FreeRTOS 队列 OLED ---------------------------------------------- WU

一、什么是队列?

        队列又称消息队列,是一种常用于 任务间通信 的数据结构,队列可以在任务与任务间、中断和任务间传递信息。         为什么不使用全局变量 ?         如果使用全局变量,任务 1  修改了变量 a ,等待 任务 3 处理,但任务 3处理速度很慢,在处理数据的过程中,任务2 有可能又修改了变量 a ,导致 任务3 有可能得到的不是正确的数据。在这种情况下,就可以使用队列。任务1  和 任务2 产生的数据放在流水线上,任务 3 可以慢慢一个个依次理。         队列的几个名词:         队列项目: 队列中的每一个数据;          队列长度: 队列能够存储队列项目的最大数量;         创建队列时,需要指定队列长度及队列项目大小。

二、队列特点

1. 数据入队出队方式
       通常采用 先进先出 ( FIFO )的数据存储缓冲机制,即先入队的数据会先从队列中被读取。也可以配置为后进先出(LIFO )方式,但用得比较少。
2. 数据传递方式
       采用实际值传递,即将数据拷贝到队列中进行传递,也可以传递指针,在 传递较大的数据的时候采用指针传递 。
3. 多任务访问
       队列不属于某个任务,任何任务和中断都可以向队列发送 / 读取消息
4. 出队、入队阻塞
       当任务向一个队列发送消息时,可以指定一个阻塞时间,假设此时当队列已满无法入队。        阻塞时间如果设置为:      (1)0 :直接返回不会等待;      (2)0~port_MAX_DELAY :等待设定的阻塞时间,若在该时间内还无法入队,超时后直接返回不再等待;      (3)port_MAX_DELAY :死等,一直等到可以入队为止。出队阻塞与入队阻塞类似;

三、队列相关 API 函数

1. 创建队列
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength,
                             UBaseType_t uxItemSize );
参数:                uxQueueLength :队列可同时容纳的最大项目数 。                uxItemSize :存储队列中的每个数据项所需的大小(以字节为单位)。 返回值:                 如果队列创建成功,则返回所创建队列的句柄 。 如果创建队列所需的内存无法分配 ,则返回 NULL 。
2. 写队列
  写队列总共有以下几个函数:
-------------函数---------------------------------------描述-------------------
|xQueueSend()                  |往队列的尾部写入消息                          
|------------------------------|----------------------------------------------
|xQueueSendToBack()            |同xQueueSend()                               
|------------------------------|----------------------------------------------
|xQueueSendToFront()           |往队列的头部写入消息
|------------------------------|----------------------------------------------
|xQueueOverwrite()             |覆写队列消息(只用于队列长度为 1 的情况)
|------------------------------|----------------------------------------------
|xQueueSendFromISR()           |在中断中往队列的尾部写入消息
|------------------------------|----------------------------------------------
|xQueueSendToBackFromISR()     |同xQueueSendFromISR()
|------------------------------|----------------------------------------------
|xQueueSendToFrontFromISR()    |在中断中往队列的头部写入消息
|------------------------------|-----------------------------------------------
|xQueueOverwriteFromISR()      |在中断中覆写队列消息(只用于队列长度为 1 的情况) 
|------------------------------|-----------------------------------------------
BaseType_t xQueueSend(
QueueHandle_t xQueue,
const void * pvItemToQueue,
TickType_t xTicksToWait
);
参数:               xQueue :队列的句柄,数据项将发送到此队列。              pvItemToQueue :待写入数据              xTicksToWait :阻塞超时时间 返回值:                 如果成功写入数据,返回 pdTRUE ,否则返回 errQUEUE_FULL 。
3. 读队列
  读队列总共有以下几个函数:
-------------函数---------------------------------------描述---------------------
|xQueueReceive()                 |从队列头部读取消息,并删除消息                          
|--------------------------------|----------------------------------------------
|xQueuePeek()                    |从队列头部读取消息,但是不删除消息                               
|--------------------------------|----------------------------------------------
|xQueueReceiveFromISR()          |在中断中从队列头部读取消息,并删除消息
|--------------------------------|----------------------------------------------
|xQueuePeekFromISR()             |在中断中从队列头部读取消息
|--------------------------------|----------------------------------------------



BaseType_t xQueueReceive(
QueueHandle_t xQueue,
void *pvBuffer,
TickType_t xTicksToWait
);
参数:               xQueue :待读取的队列              pvItemToQueue :数据读取缓冲区              xTicksToWait :阻塞超时时间 返回值:               成功返回 pdTRUE ,否则返回 pdFALSE 。

四、cubeMX配置

  简单 主要代码案例:
u8 wu_cs=5;
u8 d1,d2;
uint16_t buf = 100;



void WU_Task_1(viod)
{
	BaseType_t status;


	if(click()==1)
	{
		wu_cs++;buf=123;
		status = xQueueSend(WUQueue01Handle, &buf, 0);//写入队列
		if (status == pdTRUE)
			d1=1;
		else
			d1=0;
	}


}



void WU_Task_2(viod)
{
	LED_GREEN_TogglePin;
	osDelay(1000);
}



void WU_Task_3(viod)
{
	BaseType_t status;

	if(click_2()==1)
	{
		wu_cs--;
		status = xQueueReceive(WUQueue01Handle, &buf, 0);//读取队列
		if (status == pdTRUE)
			d2=1;
		else
			d2=0;
	}
}



void WU_Task_4(viod)
{
	WU_OLED_U8G2_ClearBuffer();

	WU_OLED_U8G2_SetFont(u8g2_font_wqy13_t_gb2312a);//选择字库


	WU_OLED_U8G2_Printf(0,15,CHINA,"电压");
	WU_OLED_U8G2_Printf(0,30,CHINA,"测试数据:%d",wu_cs);

	d1?WU_OLED_U8G2_Printf(0,45,CHINA,"写入队列值:%d",buf):WU_OLED_U8G2_Printf(0,45,CHINA,"写入队列失败");
	d2?WU_OLED_U8G2_Printf(0,60,CHINA,"读取队列值:%d",buf):WU_OLED_U8G2_Printf(0,60,CHINA,"读取队列失败");



	WU_OLED_U8G2_SendBuffer();
}

标签:U8G2,读取,FreeRTOS,队列,OLED,----------------------------------------------,WU
From: https://blog.csdn.net/WU1707640034/article/details/144475064

相关文章

  • 任务延时队列
    目录现有问题延时队列设计设计实现现有问题每次时钟节拍都需要扫描所有任务,比较耗时不易支持多个任务具有相同优先级延时队列设计将所有需要延时的任务单独放置在一个队列中,每次发生系统节拍时,只需扫描该队列。方式一:独立保存延时时间插入延时任务比较简单,快......
  • 【Linux】:多线程(POSIX 信号量 、基于环形队列的生产消费者模型)
    ......
  • 开拓计划1 - 栈与队列
    开拓计划1-栈与队列栈与队列的概念及作用栈的概念Q:什么是栈?A:栈是一种后进先出(BIFO)的数据结构。栈的作用Q:栈有什么作用?A:只要满足栈的定义的场景都可以使用栈。eg:括号匹配,火车进站etc.计算后缀表达式时也会使用。队列的概念Q:什么是队列?A:队列是一种先进先......
  • ‌Bull是一个基于Redis的队列库,专为Node.js设计
    ‌Bull是一个基于Redis的队列库,专为Node.js设计,提供高性能和可靠的任务处理能力‌。它通过Redis作为后端存储,确保任务的持久性和高可用性。Bull的设计理念是简单、高效,同时具备强大的功能,能够满足各种复杂的任务调度需求‌12。Bull的主要功能‌高性能‌:Bull采用无轮询设计,极大......
  • Freertos低功耗-Tickless模式
    此篇文章在2023年5月15日被记录很多嵌入式设备都对功耗有严格的控制,特别是消费电子对功耗的控制更为严格,Tickless是freertos中的一个可选模块,主要实现低功耗功能STM32类芯片的低功耗模式STM32之类的arm芯片通常有三种低功耗模式:睡眠模式(sleep):仅CPU时钟关闭,其他所有外......
  • Freertos-CPU使用率统计
    此篇文章在2023年5月23日被记录RTOS-任务CPU占用统计在项目开发过程中,有时会需要查看各个任务的资源占用,需要用到rtos的CPU使用统计,其原理也很简单,就是开一个频率特别高的定时器,rtos在运行过程累计各个任务的实际占用时长,继而统计显示FreeRTOSConfig配置//计算CPU使用率#......
  • 使用C语言实现队列:基础与实践
    队列(Queue)是一种常见的数据结构,遵循“先进先出”(FIFO,FirstInFirstOut)的原则。队列在许多计算机科学领域中有着广泛的应用,例如任务调度、缓冲区管理等。本文将以C语言为例,详细介绍如何实现一个简单的队列,包括两种主要实现方式:基于数组和基于链表的实现。队列的基本操作一个队......
  • 四大主流消息队列 场景化选型指导:kafka、rocketmq、rabbitmq、pulsar
    探讨消息队列在软件开发中的应用与选择在日常的软件开发过程中,我们常常会遇到系统间的异步通信、流量削峰填谷、日志收集等需求。这时,消息队列就成为了解决这类问题的有效工具之一。比如,在电商平台中,当用户下单时,订单信息不仅需要立即保存到数据库中,还需要同步更新库存、生成物流......
  • 记录真实项目中遇到的bug--018:消息队列bug
    T18:消息队列BUG:1.优先级:T22.需求详情:CRM系统中客户有“优质客户”标签,创建订单时,打“优质订单标签”,历史数据不做处理。3.前提条件:(一)点击创建订单,除下单客户外,其他必填项填完(二)存在一笔带有“首单客户”标签的订单4.操作步骤:(一)下单客户选择带有“优质”标签(二)点击提交......
  • 1、消息队列框架:RabbitMQ - 开源项目研究文章
    RabbitMQ是一个开源的消息代理和队列服务器,它使用AMQP(高级消息队列协议)来实现跨语言和跨平台的消息传递。它由Erlang语言编写,支持多种消息队列协议,如STOMP和MQTT,并且提供了多种语言的客户端支持。RabbitMQ的核心组件包括Broker、VirtualHost、Connection、Chan......