~~NOTOC~~
===== tn_task_ireference() =====
{{tnkernel:ref:attr_call_int.png|Разрешен вызов только в прерывании}}
Функция предназначена для получения информации о задаче в прерывании. После вызова функции заполняется структура типа ''TN_TASK_REF'', указатель на которую передается в качестве параметра функции:
typedef struct _TN_TASK_REF
{
TN_TASK_STATE state;
TN_TASK_WAIT_REASON wait_reason;
TN_UWORD base_priority;
TN_UWORD current_priority;
TN_TIMEOUT timeout;
} TN_TASK_REF;
В состав структура ''TN_TASK_REF'' входят следующие элементы:
; ''state'' : состояние задачи, может принимать одно из следующих значений:
{| class = "fpl"
|-
| ''TSK_STATE_RUNNABLE''
| Задача находится в очереди готовых к выполнению
|-
| ''TSK_STATE_WAIT''
| Задача ожидает событие
|-
| ''TSK_STATE_SUSPEND''
| Задача приостановлена
|-
| ''TSK_STATE_DORMANT''
| Задача создана, но еще не запущена
|}
; ''wait_reason'' : событие, которого ожидает задача, может принимать одно из следующих значений:
{| class = "fpl"
|-
| ''TSK_WAIT_REASON_SLEEP''
| Задача ожидает таймаута, переведена в состояние ожидания функцией ''tn_task_sleep()''
|-
| ''TSK_WAIT_REASON_SEM''
| Задача ожидает освобождения семафора
|-
| ''TSK_WAIT_REASON_EVENT''
| Задача ожидает флаг
|-
| ''TSK_WAIT_REASON_DQUE_WSEND''
| Задача ожидает освобождение очереди сообщений
|-
| ''TSK_WAIT_REASON_DQUE_WRECEIVE''
| Задача ожидает сообщения
|-
| ''TSK_WAIT_REASON_MUTEX_C''
| Задача ожидает освобождения ресурса, заблокированного "priority ceiling" мютексом FIXME
|-
| ''TSK_WAIT_REASON_MUTEX_C_BLK''
| Задача ожидает освобождения ресурса, заблокированного "priority ceiling" мютексом FIXME
|-
| ''TSK_WAIT_REASON_MUTEX_I''
| Задача ожидает освобождения ресурса, заблокированного "priority inheritance" мютексом
|-
| ''%%TSK_WAIT_REASON_WFIXMEM%%''
| Задача ожидает освобождения блока памяти фиксированного размера
|}
; ''base_priority'' : базовый приоритет задачи (назначенный при ее создании)
; ''current_priority'' : текущий приоритет задачи
; ''timeout'' : время в системных тиках до момента перевода задачи в состояние ''TSK_STATE_RUNNABLE'' (актуально в случае, если задача находится в состоянии ожидания с таймаутом)
\\
**Вызов:**
TN_RETVAL tn_task_ireference(TN_TCB *task, TN_TASK_REF *ref);
**Разрешен вызов:** \\
В прерывании
**Параметры функции:**
; ''task'' : указатель на TCB задачи
; ''ref'' : указатель на структуру информации о задаче
**Возвращаемые значения:**
; ''TERR_WRONG_PARAM'' : некорректное значение параметра (__замечание:__ данный код возврата возможен только в случае использования сервисов с проверкой параметров)
; ''TERR_NOEXS'' : задача не существует (еще не создана)
; ''TERR_WCONTEXT'' : попытка вызова сервиса в контексте задачи
; ''TERR_NO_ERR'' : успешное выполнение
\\
**Пример вызова:**
extern TN_TCB tcb_Task1 TN_DATA;
TN_TASK_REF task_info;
tn_sys_interrupt (_T2Interrupt) /* прерывание от таймера */
{
IFS0bits.T2IF = 0; /* сброс флага прерывания */
if (tn_task_ireference(&tcb_Task1, &task_info) == TERR_NO_ERR)
{
if (task_info.state == TSK_STATE_SUSPEND)
tn_task_iresume(&tcb_Task1);
}
}
\\
----
[[tnkernel:ref:task:intro#сервисы_управления_задачами|К списку сервисов]]