~~NOTOC~~
===== tn_fmem_get() =====
Функция предназначена для получения блока памяти из пула. Указатель на получаемый блок передается в сервис в качестве параметра ''p_data''. Содержимое блока памяти после получения его задачей не определено.
Если в пуле есть свободные блоки, то один из них выделяется для задачи, и сервис возвращает код ''TERR_NO_ERR''. Если свободные блоки в пуле отсутствуют, задача переводится в состояние ожидания и ставится в конец очереди задач, ожидающих освобождение блока памяти.
Параметр ''timeout'' задает время ожидания блока памяти в системных тиках. Если в течении этого времени блок не будет выделен для задачи, она удаляется из очереди ожидающих блок и переводится в состояние готовых к выполнению. Сервис возвращает значение TERR_TIMEOUT.
**Вызов:**
TN_RETVAL tn_fmem_get (TN_FMP *fmp, void **p_data, TN_TIMEOUT timeout);
**Разрешен вызов:** \\
В контексте задачи
**Параметры функции:**
; ''fmp'' : указатель на пул из которого будет выделяться блок памяти
; ''p_data'' : указатель на указатель, который после успешного выполнения сервиса будет содержать адрес выделенного блока
; ''timeout'' : таймаут в системных тиках, в течении которого задача будет ожидать освобождения блока
\\
**Возвращаемые значения:**
; ''TERR_WRONG_PARAM'' : некорректное значение параметра ((данный код возврата возможен только в случае использования сервисов с проверкой параметров))
; ''TERR_NOEXS'' : попытка получения блока из несуществующего пула
; ''TERR_WCONTEXT'' : вызов сервиса из обработчика прерывания или пользовательской критической секции
; ''TERR_TIMEOUT'' : выход из сервиса по таймауту
; ''TERR_NO_ERR'' : успешное выполнение
\\
**Пример вызова:**
#define BLOCK_SIZE 4
TN_FMP my_pool;
TN_UWORD my_pool_mem[NUM_BLOCKS * (MAKE_ALIG(BLOCK_SIZE) / sizeof(TN_UWORD))];
TN_UWORD *block_pt;
tn_fmem_create (&my_pool, my_pool_mem, BLOCK_SIZE, NUM_BLOCKS);
tn_fmem_get (&my_pool, &block_pt, TN_WAIT_INFINITE);
\\
----
[[tnkernel:ref:mpool:intro#Сервисы управления пулами блоков памяти|К списку сервисов]]