为什么在此代码中使用“ LD_QUEUE_AVAILABLE”状态

时间:2019-06-29 05:31:36

标签: c queue

  if (LD_QUEUE_FULL != queue->queue_status){
/* prcess queue tail */
if ((LD_QUEUE_EMPTY == queue->queue_status)|| (LD_NO_DATA == queue->queue_status)){
  /* Set status of queue */
   if (TRANSMISSION == direction)
    queue->queue_status = LD_QUEUE_AVAILABLE;
   else
   queue->queue_status = LD_DATA_AVAILABLE;
} else {
/* Check if queue size equal to queue tail */
  if (queue->queue_max_size == queue->queue_tail + 1){
    queue->queue_tail = 0;
  } else {
    queue->queue_tail++;
  }
}
/* copy data to queue */
for (i=0; i<8; i++){
  queue_data[queue->queue_tail][i] = data[i];
}
/* update queue status */
queue->queue_current_size++;
if (queue->queue_current_size >= queue->queue_max_size){
    queue->queue_status = LD_QUEUE_FULL;
}

}

Tx队列的状态为“ LD_QUEUE_AVAILABLE”,并且 接收队列的状态为“ LD_DATA_AVAILABLE”。

在此代码示例中,我认为没有理由使用“可用”状态

因为当队列的状态为“ NO_DATA”或“ EMPTY”时,它必须可用并且某些任务可以使用它而不检查它是否为“ AVAILABLE” (实际上,这两个状态(LD_QUEUE〜,LD_DATA〜)并没有出现在整个项目中,而是刚刚定义的。)

队列是否有任何原因必须具有“可用性状态”?

1 个答案:

答案 0 :(得分:2)

代码需要检查队列是否已满(两种状态)。

代码需要检查队列是否为空(两种状态)。

                 | Full            |
                 +--------+--------+
                 | No     | Yes    |
--------+--------+--------+--------+
 Empty  | No     | 0      | 1      |
        +--------+--------+--------+
        | Yes    | 2      | 3      |
--------+--------+--------+--------+

总共有四个状态(0、1、2、3)。

如果队列不可能永远都满了,那么状态(3)就是不可能的,所以我们剩下了三个状态。

                            | queue->queue_status
                            +--------------------+-------------------
 State                      | Tx queue           | Rx queue
----------------------------+--------------------+-------------------
 0 (Not full and not empty) | LD_QUEUE_AVAILABLE | LD_DATA_AVAILABLE
 1 (Full and not empty)     | LD_QUEUE_FULL      | ?
 2 (Not full and empty)     | LD_QUEUE_EMPTY     | LD_NO_DATA

一个可以使用两个布尔变量而不是三个值的“枚举”,但这不会改变状态数。


  

因为当队列的状态为“ NO_DATA”或“ EMPTY”时,该队列必须可用

是的,但是当queue->queue_status都不是时,它也可以用于队列。

  

只能使用它而不检查它是否“可用”

啊,但是你知道。您只需要使用常量即可。

  • 状态为0或状态1时,有一个队列可用于出队。
    可以使用queue->queue_status != LD_QUEUE_EMPTY来检查队列
  • 状态为0或状态2时,有一个队列可供排队。
    可以使用queue->queue_status != LD_QUEUE_FULL来检查队列

这两个检查都检查队列是否处于状态0,因为否定否为空。但是正如您所看到的,除了设置状态外,无需使用常量LD_QUEUE_AVAILABLELD_DATA_AVAILABLE即可完成状态0的检查。

因此,常量未在其他任何地方使用的事实并不意味着没有任何东西可以检查该状态。