【正点原子FreeRTOS学习笔记】————(13)队列集

一、队列集简介(了解)

一个队列只允许任务间传递的消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,那么就可以使用队列集 !
作用:用于对多个队列或信号量进行“监听”,其中不管哪一个消息到来,都可让任务退出阻塞状态
假设:有个接收任务,使用到队列接收和信号量的获取,如下:
在这里插入图片描述

二、队列集相关API函数介绍(熟悉)

在这里插入图片描述

QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength );

此函数用于创建队列集。
在这里插入图片描述

BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore ,
QueueSetHandle_t xQueueSet );

此函数用于往队列集中添加队列,要注意的是,队列在被添加到队列集之前,队列中不能有有效的消息
在这里插入图片描述

BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore , QueueSetHandle_t xQueueSet );

此函数用于从队列集中移除队列, 要注意的是,队列在从队列集移除之前,必须没有有效的消息
在这里插入图片描述

QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, TickType_t const xTicksToWait )

此函数用于在任务中获取队列集中有有效消息的队列
在这里插入图片描述

三、队列集操作实验(掌握)

1、实验目的:学习 FreeRTOS 的队列集相关API的使用。
2、实验设计:将设计三个任务:start_task、task1、task2
三个任务的功能如下:
在这里插入图片描述

QueueSetHandle_t queueset_handle;
QueueHandle_t    queue_handle;
QueueHandle_t    semphr_handle;

void start_task( void * pvParameters )
{
    taskENTER_CRITICAL();                               /* 进入临界区 */
    queueset_handle = xQueueCreateSet( 2 );             /* 创建队列集,可以存放2个队列 */
    if(queueset_handle != NULL)
    {
        printf("队列集创建成功!!\r\n");
    }
    
    queue_handle = xQueueCreate( 1, sizeof(uint8_t) );  /* 创建队列 */ 
    semphr_handle = xSemaphoreCreateBinary();           /* 创建二值信号量 */
    
    xQueueAddToSet( queue_handle,queueset_handle);
    xQueueAddToSet( semphr_handle,queueset_handle);
    
    xTaskCreate((TaskFunction_t         )   task1,
                (char *                 )   "task1",
                (configSTACK_DEPTH_TYPE )   TASK1_STACK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   TASK1_PRIO,
                (TaskHandle_t *         )   &task1_handler );
                
    xTaskCreate((TaskFunction_t         )   task2,
                (char *                 )   "task2",
                (configSTACK_DEPTH_TYPE )   TASK2_STACK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   TASK2_PRIO,
                (TaskHandle_t *         )   &task2_handler );
                             
    vTaskDelete(NULL);
    taskEXIT_CRITICAL();                /* 退出临界区 */
}

/* 任务一,实现队列发送以及信号量释放 */
void task1( void * pvParameters )
{
    uint8_t key = 0;
    BaseType_t err = 0;
    while(1) 
    {
        key = key_scan(0);
        if(key == KEY0_PRES)
        {
            err = xQueueSend( queue_handle, &key, portMAX_DELAY );
            if(err == pdPASS)
            {
                printf("往队列queue_handle写入数据成功!!\r\n");
            }
        }else if(key == KEY1_PRES)
        {
            err = xSemaphoreGive(semphr_handle);
            if(err == pdPASS)
            {
                printf("释放信号量成功!!\r\n");
            }
        }
        vTaskDelay(10);
    }
}

/* 任务二,获取队列集的消息 */
void task2( void * pvParameters )
{
    QueueSetMemberHandle_t member_handle;
    uint8_t key;
    while(1)
    {
        member_handle = xQueueSelectFromSet( queueset_handle,portMAX_DELAY);
        if(member_handle == queue_handle)
        {
            xQueueReceive( member_handle,&key,portMAX_DELAY);
            printf("获取到的队列数据为:%d\r\n",key);
        }else if(member_handle == semphr_handle)
        {
            xSemaphoreTake( member_handle, portMAX_DELAY );
            printf("获取信号量成功!!\r\n");
        }
    }
}



  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 正点原子freertos pdf是一份详细的技术文档,主要介绍了正点原子FreeRTOS实时操作系统的基本架构和实现方法。该文档详细介绍了FreeRTOS的任务管理、时间管理、内存管理、中断管理、队列管理等相应的应用、算法、数据结构、函数和宏等的使用方法和实现原理。该文档还包括了多个实际例子,展示了如何使用FreeRTOS在真实项目中实现任务调度、时间管理、共享资源管理等功能。 该文档对于想要学习和掌握FreeRTOS实时操作系统的开发人员来说,是一份非常有价值的资料。通过学习该文档,开发人员可以深入了解FreeRTOS的设计思路、内部实现和应用场景,掌握FreeRTOS的核心功能和使用方法,从而更加熟练地应用FreeRTOS进行实时操作系统开发。同时,该文档还提供了大量的代码示例,让开发人员可以更加快速地理解和应用FreeRTOS,帮助开发人员在项目开发过程中更高效地完成任务。总之,正点原子freertos pdf是一份对于实时操作系统开发人员非常有用的学习资料,可以帮助开发人员更快速地掌握FreeRTOS技术,提高开发效率。 ### 回答2: 正点原子freertos是一种嵌入式实时操作系统,采用轻量级设计的freertos内核。它具有高度可移植性、可扩展性、可配置性、可靠性等优点,可以很好地处理实时任务和多任务之间的优先级和调度问题,满足各种应用的不同需求。正点原子freertos提供了丰富的API接口,支持线程、信号量、消息队列、定时器、互斥锁等功能,方便编写实时应用程序。在使用过程中,用户可以根据系统需求进行配置参数,如内存大小、最大线程数量、时钟频率等。同时,正点原子freertos还支持跨平台开发,通过移植可以在不同的硬件平台上运行,提高了应用程序的可移植性和可重用性。normal,正点原子freertos官方也提供了详细的编程手册和示例代码,方便开发者学习和参考。总之,正点原子freertos是一款高效、灵活、可靠的实时操作系统,可以为嵌入式系统的开发提供强有力的支持。 ### 回答3: 正点原子是一家国内知名的开源电子硬件平台品牌,其推出了一款名为 FreeRTOS 的操作系统软件。该软件旨在让开发者和工程师们更加方便地进行电子设备的开发和编程。此外,正点原子还为该软件提供了一份详细的使用手册——FreeRTOS PDF。 FreeRTOS PDF 是一份面向初学者和资深工程师的完整使用手册,其中包括了从安装软件、核心概念、任务管理、队列和信号量、定时器等各方面的详细教程和指导。通过这份手册,用户可以更加深入地理解 FreeRTOS 软件的运作机制和一些常见问题的解决方案。同时,手册也提供了丰富的示例代码,方便用户在开发过程中进行参考和借鉴。 总之,正点原子FreeRTOS PDF 告诉我们,通过该软件可以轻松地实现完整的多任务管理系统,支持多个处理器、各种架构和设备等,并能保证高性能和实时性。而该手册则是完美地展现了 FreeRTOS 的功能和使用方法,为广大工程师和开发者提供了强有力的支持和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值