~~NOTOC~~
===== tn_queue_create() =====

Функция предназначена для создания очереди сообщений. Поле ''id_dque'' очереди ''dque'' должно быть равно нулю до момента создания, таким образом уже созданные очереди защищаются от повторного создания. 

Память для управляющей структуры ''dque'' и буфера сообщений должна быть выделена до момента создания очереди. Память может быть выделена на этапе компиляции (объявление глобальной переменной типа ''TN_DQUE'' для управляющей структуры и массива с элементами типа ''*void'' для буфера), либо динамически, если пользовательское приложение использует менеджер памяти. В последнем случае размер буфера сообщений должен быть равен (в байтах) ''(sizeof(*void) · num_entries)''

**Вызов:**
<code cpp>
TN_RETVAL tn_queue_create (TN_DQUE   *dque,
                           void     **data_fifo,
                           TN_UWORD   num_entries
                          );
</code>

**Разрешен вызов:** \\ 

В контексте задачи, в пользовательской критической секции, в прерывании

**Параметры функции:**

  ; ''dque'' : указатель на объект очереди сообщений. Структура ''dque'' типа ''TN_DQUE'' должна быть создана до момента вызова функции, статически или динамически
  ; ''data_fifo'' : указатель на буфер сообщений, который представляет собой массив элементов типа ''*void''. Параметр может быть равен 0 или ''TN_NULL'' - в этом случае сервисы будут возвращать код ошибки ''TERR_OUT_OF_MEM''.
  ; ''num_entries'' : размер буфера сообщений. Другими словами, максимальное количество сообщений, хранимых в очереди. Параметр должен быть равен количеству элементов в массиве ''data_fifo''. Если указатель ''data_fifo'' равен 0 или ''TN_NULL'', значение параметра может быть произвольным.

<note>
**Внимание!** Количество элементов очереди должно быть фактически на 1 больше, чем планируется использовать. Т.е. если ''num_entries = 2'', то в очереди будет хранится один элемент и при попытке передачи второго сервис вернет ошибку. Не следует использовать очередь с одним элементом.
</note>

**Возвращаемые значения:**  

  ; ''TERR_WRONG_PARAM'' : некорректное значение параметра ((данный код возврата возможен только в случае использования сервисов с проверкой параметров))
  ; ''TERR_EXS'' : попытка создания очереди, которая уже создана
  ; ''TERR_NO_ERR'' : успешное выполнение

\\ 
**Пример вызова:**  
<code cpp>
#define QUEUE_SIZE    8

TN_DQUE  queue                   TN_DATA;  /* объект типа очередь */
void     *queue_fifo[QUEUE_SIZE] TN_DATA;  /* буфер сообщений     */

tn_queue_create(&queue, queue_fifo, QUEUE_SIZE);
</code>

\\ 

----
[[tnkernel:ref:dqueue:intro#Сервисы управления очередями сообщений|К списку сервисов]]