Функция предназначена для получения информации о задаче, такой как текущее состояние, причина ожидания, время таймаута, текущий приоритет и др. После вызова функции заполняется структура типа 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_reference(TN_TCB *task, TN_TASK_REF *ref);
Разрешен вызов:
В контексте задачи
Параметры функции:
task
ref
Возвращаемые значения:
TERR_WRONG_PARAM
TERR_NOEXS
TERR_WCONTEXT
TERR_NO_ERR
Пример вызова:
TN_TASK_REF task_info; if (tn_task_reference(&task_1, &task_info) == TERR_NO_ERR) { if (task_info.state == TSK_STATE_WAIT && task_info.wait_reason == TSK_WAIT_REASON_SLEEP ) { tn_task_wakeup(&task_1); } }
if (tn_task_reference(&task_1, &task_info) == TERR_NOEXS) { /* задача не создана */ }