~~NOTOC~~ ===== tn_queue_ireceive() ===== Функция предназначена для приема сообщения через очередь сообщений ''dque'' //в прерывании//. Принятое сообщение (точнее говоря //адрес сообщения//) сохраняется по указателю ''data_ptr''. Если буфер очереди сообщений не пуст, функция передает первое сообщение в буфере по указателю ''data_ptr''. Таким образом, после выхода из сервиса ''data_ptr'' будет указывать на сообщение, которое было отправлено через очередь. Если есть задача (задачи) ожидающая освобождения буфера для того чтобы отправить сообщение - эта задача будет переведена в состояние готовых к выполнению, а ее сообщение будет положено в очередь. Если буфер очереди сообщений пуст, функция возвращает код ошибки ''TERR_TIMEOUT''. **Вызов:** TN_RETVAL tn_queue_ireceive (TN_DQUE *dque, void **data_ptr); **Разрешен вызов:** \\ В обработчике прерывания **Параметры функции:** ; ''dque'' : указатель на объект очереди сообщений. ; ''data_ptr'' : указатель на указатель, в который сохраняется адрес сообщения \\ **Возвращаемые значения:** ; ''TERR_WRONG_PARAM'' : некорректное значение параметра (__замечание:__ данный код возврата возможен только в случае использования сервисов с проверкой параметров) ; ''TERR_NOEXS'' : попытка обращения к объекту, который не является очередью (__замечание:__ данный код возврата возможен только в случае использования сервисов с проверкой параметров) ; ''TERR_WCONTEXT'' : вызов сервиса в пользовательской критической секции или в контексте задачи ; ''TERR_TIMEOUT'' : очередь сообщений пуста ; ''TERR_NO_ERR'' : успешное выполнение \\ **Пример вызова:** extern TN_DQUE queue TN_DATA; tn_sys_interrupt (_T2Interrupt) /* прерывание от таймера */ { MY_MSG message; IFS0bits.T2IF = 0; /* сброс флага прерывания */ if (tn_queue_ireceive(&queue, &message) == TERR_NO_ERR) { if (message->a) { /* ... */ } } } \\ ---- [[tnkernel:ref:dqueue:intro#Сервисы управления очередями сообщений|К списку сервисов]]