почему в этом коде используется состояние "LD_QUEUE_AVAILABLE" - PullRequest
0 голосов
/ 29 июня 2019
  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", а Rx-очередь имеет состояние "LD_DATA_AVAILABLE".

В этом примере кода я подумал, что нет причин использовать "AVAILABLE "state

, потому что когда очередь имеет состояние" NO_DATA "или" EMPTY ", она должна быть доступна, и некоторые задачи могут просто использовать ее, не проверяя, является ли она" AVAILABLE "(ну, на самом деле, эти два состояния (LD_QUEUE)~, LD_DATA ~) скорее не присутствует во всем проекте, он был просто определен.)

Есть ли какая-либо причина, по которой у очереди должно быть "СОСТОЯНИЕ ДОСТУПНОСТИ" ???

1 Ответ

2 голосов
/ 29 июня 2019

Код должен проверить, заполнена очередь или нет (два состояния).

Код должен проверить, пуста очередь или нет (два состояния).

                 | 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

Можно использовать две логические переменные вместо трехзначного «enum», но это не изменит количество состояний.


, поскольку, когда очередь имеет состояние «NO_DATA» или «EMPTY», она должна быть доступна

Да, но она также может быть доступна (для очереди)когда queue->queue_status не относится ни к одному из них.

можно просто использовать, не проверяя, "ДОСТУПНО"

Ах, но вы делаете,Вам просто не нужно использовать константу, чтобы сделать это.

  • Очередь доступна для удаления из очереди, когда она находится в состоянии 0 или в состоянии 1.
    Это можно проверить с помощью queue->queue_status != LD_QUEUE_EMPTY
  • Очередь доступна для постановки в очередь, когда она находится в состоянии 0 или состоянии 2.
    Это можно проверить с помощью queue->queue_status != LD_QUEUE_FULL

Обе проверки проверяют, находится ли очередь в состоянии 0потому что отрицание пустого не является полным.Но, как вы можете видеть, проверка состояния 0 может выполняться без использования констант LD_QUEUE_AVAILABLE и LD_DATA_AVAILABLE, за исключением случаев установки состояния.

Таким образом, тот факт, что константы не используются где-либо еще, неозначает, что ничего не проверяет это состояние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...