队列管理

1.队列的特性

  队列可以保存有限个具有确定长度的数据单元。队列可以保存最大数目被称为队列的深度。在创建队列时需要确定队列的长度和每个单元的大小。

    xQueueHandle xQueueCreate(unsigned portBASE_TYPE uxQueueLength,//the depth of the queue

                  unsigend portBASE_TYPE uxItemSzie);//the size of a single element

    RETURN VALUE :

            NULL :there if not enougth space .

            xQueueHandle :the handle of the queue .            

   当读队列时,队列为空,那么读队列函数将会阻塞。通过xQueueReceive(),xQueuePeek()从队列中获取元素(中断中调用xQueueReceiveFromISR())。可以通过函数第三个参数设置超时,若在超时时间内没有读取到数据,则函数返回NULL.当多个任务同时等待读取同一个队列时,优先级最高的,和等待时间最长的任务会优先读取到队列。

  portBASE_TYPE xQueueReceive (xQueueHandlle xQueue,//队列句柄

                   const void * pvBuffer,//接收缓存指针,指向一段内存区域,用来接收从队列中拷贝来的数据。

                  portTickType xTicksToWait);//设置超时时间,单位是心跳。

   写队列和读队列的阻塞情况相同。

2.工作于大型数据单元

  如果队列存储数据单元较大,那么最好是利用队列来传递数据指针,而不是队列数据本身在队列上一字节一字节拷贝。传递指针注意以下两点

    1.指针指向的内存空间的所有权必须明确。(原则上,共享内存在其指针发送到队列之前,内容只允许被发送任务访问:共享内存指针指针从队列读出后,其内容也之循序被接收任务访问)。

    2.指正指向的内存空间必须有效(如果指针指向的内存是动态分配的,只应该有一个任务负责对其进行内存释放)。

原文地址:https://www.cnblogs.com/a-lai/p/7805783.html