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〜)并没有出现在整个项目中,而是刚刚定义的。)
队列是否有任何原因必须具有“可用性状态”?
答案 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
都不是时,它也可以用于队列。
只能使用它而不检查它是否“可用”
啊,但是你知道。您只需要使用常量即可。
queue->queue_status != LD_QUEUE_EMPTY
来检查队列queue->queue_status != LD_QUEUE_FULL
来检查队列这两个检查都检查队列是否处于状态0,因为否定否为空。但是正如您所看到的,除了设置状态外,无需使用常量LD_QUEUE_AVAILABLE
和LD_DATA_AVAILABLE
即可完成状态0的检查。
因此,常量未在其他任何地方使用的事实并不意味着没有任何东西可以检查该状态。