Функция предназначена для получения информации о задаче в прерывании. После вызова функции заполняется структура типа 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
TSK_STATE_RUNNABLE |
Задача находится в очереди готовых к выполнению |
TSK_STATE_WAIT |
Задача ожидает событие |
TSK_STATE_SUSPEND |
Задача приостановлена |
TSK_STATE_DORMANT |
Задача создана, но еще не запущена |
wait_reason
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" мютексом |
TSK_WAIT_REASON_MUTEX_C_BLK |
Задача ожидает освобождения ресурса, заблокированного "priority ceiling" мютексом |
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
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); } }