FreeRtos任务通信之消息队列

入队阻塞:往队列写数据时,队列满时的阻塞。当阻塞结束时,优先级最高的任务优先进入就绪态,同 优先级时,阻塞时间最长的进入就绪态

出队阻塞:读队列时,队列为空时的阻塞。当阻塞结束时,优先级最高的任务优先进入就绪态,同优先 级时,阻塞时间最长的进入就绪态

数据的操作:FIFO机制:先进的先出

也可以强制写队列头部:覆盖头部数据

数据的传输时:值拷贝方式

创建队列函数:

/*  uxQueueLength    队列长度,最多能存放多少个数据(item)
    uxItemSize    每个数据(item)的大小:以字节为单位
    返回值    非0:成功,返回句柄,以后使用句柄来操作队列
              NULL:失败,因为内存不足
*/
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );

队列复位函数

/* pxQueue : 复位哪个队列;
 * 返回值: pdPASS(必定成功)
 */
BaseType_t xQueueReset( QueueHandle_t pxQueue);

队列删除函数

/*参数:队列的句柄*/
void vQueueDelete( QueueHandle_t xQueue );

写队列函数

/* 等同于xQueueSendToBack():参数都相同,名字不一样,往尾部写数据 */
BaseType_t xQueueSend(
                                QueueHandle_t    xQueue,
                                const void       *pvItemToQueue,
                                TickType_t       xTicksToWait
                            );

/* 在中断函数中使用,不可阻塞往队列尾部写入数据,*/
BaseType_t xQueueSendToBackFromISR(
                                      QueueHandle_t xQueue,
                                      const void *pvItemToQueue,
                                      BaseType_t *pxHigherPriorityTaskWoken
                                   );
/*往头部写入数据*/
BaseType_t xQueueSendToFront(
                                QueueHandle_t    xQueue,
                                const void       *pvItemToQueue,
                                TickType_t       xTicksToWait
                            );

/*  往队列头部写入数据,此函数可以在中断函数中使用,不可阻塞*/
BaseType_t xQueueSendToFrontFromISR(
                                      QueueHandle_t xQueue,
                                      const void *pvItemToQueue,
                                      BaseType_t *pxHigherPriorityTaskWoken
                                   );
/*参数说明
    xQueue         :队列句柄,要写哪个队列
    pvItemToQueue  :数据指针,这个数据的值会被复制进队列,
    xTicksToWait   :任务阻塞时间
        设为0,无法写入数据时函数会立刻返回;
        设为portMAX_DELAY,则会一直阻塞直到有空间可写
    返回值   :pdPASS:数据成功写入了队列
            :errQUEUE_FULL:写入失败,因为队列满了。
*/

任务读队列

//任务
BaseType_t xQueueReceive( QueueHandle_t xQueue,
                          void * const pvBuffer,
                          TickType_t xTicksToWait );
//中断
BaseType_t xQueueReceiveFromISR(
                                    QueueHandle_t    xQueue,
                                    void             *pvBuffer,
                                    BaseType_t       *pxTaskWoken
                                );

/*参数说明
    xQueue         :队列句柄,要写哪个队列
    pvBuffer  :数据指针,读出队列的数据存放处,
    xTicksToWait   :任务阻塞时间
        设为0,无法读出数据时函数会立刻返回;
        设为portMAX_DELAY,则会一直阻塞直到有数据可以读出
    返回值   :pdPASS:数据成功写入了队列
            :errQUEUE_FULL:读出失败,因为队列没有数据。
*/

队列覆盖函数

/* 覆盖队列,对于数据队列长度为1的才可以使用,不会阻塞
 * xQueue: 写哪个队列
 * pvItemToQueue: 数据地址
 * 返回值: pdTRUE表示成功, pdFALSE表示失败
 */
BaseType_t xQueueOverwrite(
                           QueueHandle_t xQueue,
                           const void * pvItemToQueue
                      );

BaseType_t xQueueOverwriteFromISR(
                           QueueHandle_t xQueue,
                           const void * pvItemToQueue,
                           BaseType_t *pxHigherPriorityTaskWoken
                      );

读队列,不清除原数据函数

/* 偷看队列
 * xQueue: 读哪个队列
 * pvItemToQueue: 数据地址, 用来保存读出来的数据
 * xTicksToWait: 阻塞时间
 * 返回值: pdTRUE表示成功, pdFALSE表示失败
 */
BaseType_t xQueuePeek(
                          QueueHandle_t xQueue,
                          void * const pvBuffer,
                          TickType_t xTicksToWait
                      );

BaseType_t xQueuePeekFromISR(
                                 QueueHandle_t xQueue,
                                 void *pvBuffer,
                             );

队列查询函数

/*返回队列中可用数据的个数*/
UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue );

/* 返回队列中可用空间的个数*/
UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值