FreeRTOS ~(五)队列的常规使用 ~ (1/5)队列解决同步缺陷

这篇具有很好参考价值的文章主要介绍了FreeRTOS ~(五)队列的常规使用 ~ (1/5)队列解决同步缺陷。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前情提要
FreeRTOS ~(四)同步互斥与通信 ~ (1/3)同步的缺陷
举例子说明:利用队列解决前述的"同步的缺陷"问题

static int sum = 0;						/* sum存放计算的结果 */
static volatile int flagCalcEnd = 0;	/* 标志位,用于逻辑分析仪抓取代码执行时长 */
static QueueHandle_t xQueueCalcHandle;	/* 队列句柄 */

void Task1Function(void * param)
{
	/* 这里故意加上 volatile 防止系统优化掉 */
	volatile int i = 0;
	while(1)
	{
		for(i = 0; i < 10000000; i++)
			sum++;
		/* 计算完成,将计算结果写入队列,传入的是地址
		   portMAX_DELAY的意思是阻塞的时长,下文介绍这个函数时会详解 */	
		xQueueSend(xQueueCalcHandle, &sum, portMAX_DELAY);
		/* 这里设置sum为1,想要说明的是,上面传入的sum值不会由于后面的赋值而更改 */
		sum = 1;
	}
}
void Task2Function(void * param)
{
	/* 用于接收sum的值 */
	int val;
	while(1)
	{
		/* 这里利用flag的目的是:利用逻辑分析仪查看Task2等待队列读取数据耗时
		   这个耗时也几乎是Task1完成那个复杂计算的时长,
		   FreeRTOS在这里优点就是:
		   使用了队列读取数据,当队列中有数据的时候,才会唤醒Task2来进行读取操作 */
		flagCalcEnd = 0;
		xQueueReceive(xQueueCalcHandle, &val, portMAX_DELAY);
		flagCalcEnd = 1;
		printf("sum = %d\r\n", val);
	}
}

int main( void )
{
	TaskHandle_t    xHandleTask1;
	prvSetupHardware();
	
	/* 创建队列,队列中有2个Item,每个Item的大小是sizeof(int)
	   具体以实际需要为准,这里由于sum是int类型的,队列想要传输的也是sum的值
	   这里的2并不是只能是2个,而是只要大于等于1个就可以,根据具体需求选择大小 */
	xQueueCalcHandle = xQueueCreate(2, sizeof(int));
	if (xQueueCalcHandle == NULL)
	{
		printf("can not create queue\r\n");
	}
	xTaskCreate(Task1Function,"Task1",100,NULL,1,&xHandleTask1);
	xTaskCreate(Task2Function,"Task2",100,NULL,1,NULL);
	
	/* Start the scheduler. */
	vTaskStartScheduler();

	return 0;
}
逻辑分析仪抓取波形如下:

FreeRTOS ~(五)队列的常规使用 ~ (1/5)队列解决同步缺陷,嵌入式FreeRTOS学习笔记,FreeRTOS文章来源地址https://www.toymoban.com/news/detail-528068.html

这里用到了三个函数:

1.创建队列 --- 动态分配内存
--- 函数原型:
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );
--- 参数:
uxQueueLength :队列长度,最多能存放多少个数据(item).
uxItemSize	  :每个数据(item)的大小:以字节为单位.
--- 返回值:
非 0 :成功,返回句柄,以后使用句柄来操作队列.
NULL :失败,因为内存不足.

2.写队列
--- 函数原型:
BaseType_t xQueueSend( QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait );
--- 参数:
xQueue		  :队列句柄,要写哪个队列.
pvItemToQueue :数据指针,这个数据的值会被复制进队列,复制多大的数据?在创建队列时已经指定了数据大小.
xTicksToWait  :如果队列满则无法写入新数据,可以让任务进入阻塞状态,
                xTicksToWait 表示阻塞的最大时间(Tick Count).
                如果被设为 0,无法写入数据时函数会立刻返回;
                如果被设为 portMAX_DELAY,则会一直阻塞直到有空间可写.
--- 返回值	  :pdPASS		  :数据成功写入了队列.
                errQUEUE_FULL :写入失败,因为队列满了.
/* 等同于 xQueueSendToBack 往队列尾部写入数据,如果没有空间,阻塞时间为 xTicksToWait */

3.读队列
--- 函数原型:
BaseType_t xQueueReceive( QueueHandle_t xQueue,void * const pvBuffer,TickType_t xTicksToWait );
--- 参数:
xQueue		  :队列句柄,要读哪个队列.
pvBuffer      :bufer 指针,队列的数据会被复制到这个buffer,复制多大的数据?在创建队列时已经指定了数据大小.
xTicksToWait  :如果队列空则无法读出新数据,可以让任务进入阻塞状态,
                xTicksToWait 表示阻塞的最大时间(Tick Count).
                如果被设为 0,无法读取数据时函数会立刻返回;
                如果被设为 portMAX_DELAY,则会一直阻塞直到有数据可读.
--- 返回值	  :pdPASS		  :从队列读取数据成功.
                errQUEUE_EMPTY:读取失败,因为队列空了.


后面会把队列相关的函数统一做一个整理.

到了这里,关于FreeRTOS ~(五)队列的常规使用 ~ (1/5)队列解决同步缺陷的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FreeRTOS——队列及其实战

    1)队列是任务到任务、任务到中断、中断到任务数据交流的一种机制(消息传递) 2)队列类似数组,只能存储有限数量、相同类型的数据,在创建时需指定队列长度与队列项大小 3)出队入队阻塞: 若阻塞时间为0 :直接返回不会等待; 若阻塞时间为0~port_MAX_DELAY :等待设

    2024年02月03日
    浏览(26)
  • FreeRTOS(3)----消息队列

    一.消息队列的基本概念 队列成为消息队列,可以进行任务与任务间,中断和任务间传递信息,实现任务接收来自其他任务或中断的不固定长度的消息,任务可以从队列中读取消息,当队列消息为空的时候,读取消息的任务将会被阻塞,但是可以设定等待阻塞任务的时候xTic

    2024年03月18日
    浏览(64)
  • FreeRTOS - 消息队列

    消息队列(queue):可以在任务与任务间、中断和任务间传递消息,实现任务接收来自其他任务或中断的不固定的消息 1、使用消息队列检测串口输入 2、通过串口发送字符串openled1,openled2,openled3,分别打开板载led1,led2,led3 3、通过串口发送字符串closeled1,closeled2,closele

    2023年04月08日
    浏览(38)
  • FreeRTOS 消息队列 详解

    目录 什么是队列? 消息队列特点 1. 数据入队出队方式 2. 数据传递方式 3. 多任务访问 4. 出队、入队阻塞 消息队列相关 API 函数 1. 创建队列 2. 写队列 3. 读队列 消息队列实操 队列又称 消息队列 ,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任 务

    2024年02月08日
    浏览(33)
  • FreeRTOS教程4 消息队列

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCOM V2.6串口助手 本文主要学习 FreeRTOS 消息队列的相关知识, 包括消息队列概述、创建删除复位队列、写入/读取数据到队列等关于队列的基础知识 在一个实时操作系统构成的

    2024年03月14日
    浏览(32)
  • FreeRTOS-消息队列详解

    ✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!! 📃个人主页: @rivencode的个人主页 🔥系列专栏: 玩转FreeRTOS 💬保持学习、保持热爱、认真分享、一起进步!!! 本文将详细全方位的讲解FreeRTOS的队列消息,其实在FreeRTOS中队列的重要性也不言

    2024年02月05日
    浏览(36)
  • 【FreeRTOS】详细讲解FreeRTOS中消息队列并通过示例讲述其用法

      在裸机系统中,两个程序间需要共享某个资源通常使用全局变量来实现;但在含操作系统(下文就拿 FreeRTOS 举例)的开发中,则使用消息队列完成。那么这两者有啥区别呢?🤔🤔🤔   其实在FreeRTOS系统中也能够像裸机似的,使用全局变量实现多程序共享某个资源(这里

    2024年02月09日
    浏览(31)
  • 中断与freeRTOS任务进行同步

    S32K144在做CAN通信时,通过FlexCAN中断接收CAN数据,并希望让freeRTOS 的CAN处理任务拿到CAN数据并进行数据处理。因此就需要找到能够满足中断与freeRTOS任务进行同步的方式方法。 遇到这个问题,第一时间想到的就是查找freeRTOS手册《FreeRTOS_Reference_Manual_V10.0.0.pdf》 通过查看手册,

    2024年02月05日
    浏览(30)
  • FreeRTOS源码分析-7 消息队列

    目录 1 消息队列的概念和作用 2 应用 2.1功能需求 2.2接口函数API 2.3 功能实现 3 消息队列源码分析 3.1消息队列控制块 3.2消息队列创建 3.3消息队列删除 3.4消息队列在任务中发送 3.5消息队列在中断中发送 3.6消息队列在任务中接收 3.7消息队列在中断中接收  消息队列(queue),可

    2024年02月14日
    浏览(29)
  • 【FreeRTOS】【应用篇】消息队列【下篇】

    本篇文章主要对 FreeRTOS 中消息队列的概念和相关函数进行了详解 消息队列【下篇】详细剖析了消息队列中发送、接收时队列消息控制块中各种指针的行为,以及几个发送消息和接收消息的函数的运作流程 笔者有关于 【FreeRTOS】【应用篇】消息队列【上篇】——队列基本概念

    2024年02月10日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包