Библиотека FatFS: f_forward Печать
Добавил(а) microsin   

f_forward

Функция f_forward читает данные файла и перенаправляет их в потоковое устройство данных (data streaming device).

FRESULT f_forward (
  FIL* FileObject,                 /* Файловый объект */
  UINT (*Func)(const BYTE*,UINT),  /* Функция потоковых данных (Data streaming function) */
  UINT ByteToFwd,                  /* Количество байт для перенаправления */
  UINT* ByteFwd                    /* Количество перенаправленных данных */
);

Параметры

FileObject
Указатель на открытый файловый объект.
Func
Указатель на пользовательскую функцию (её код задает пользователь библиотеки) потоковых данных (data streaming function). Для подробностей см. пример кода.
ByteToFwd
Количество байт, которое должно быть перенаправлено, в диапазоне значений UINT.
ByteFwd
Указатель на переменную UINT, в которой будет возвращено количество перенаправленных байт.

Возвращаемые значения

FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

Описание

Функция f_forward читает данные из файла и перенаправляет их в исходящий поток (outgoing stream), без использования буфера данных. Такое использование чтения подходит для систем с дефицитом памяти, потому что в модуле приложения не нужен буфер для данных. Указатель позиции в файле внутри файлового объекта будет увеличиваться на количество перенаправленных байт. Если *ByteFwd < ByteToFwd, то это не обозначает ошибку, просто запрашиваемое количество байт не было перенаправлено по причине достижения конца файла (end of file, EOF), либо поток был занят во время передачи данных.

Краткая информация (QuickInfo)

Функция доступна, когда _USE_FORWARD == 1 и _FS_TINY == 1.

Пример кода (воспроизведение звука, Audio playback)

/*-------------------------------------------------------------------------*/
/* Пример кода функции передачи данных, которая будет вызвана из f_forward */
/*-------------------------------------------------------------------------*/
UINT out_stream (   /* Возвращает количество отправленных байт или состояние потока */
    const BYTE *p,  /* Указатель на данные отправляемого блока */
    UINT btf        /* >0: вызов передачи (количество байт для отправки). 0: вызов
запроса состояния (Sense call) */
) { UINT cnt = 0; if (btf == 0) { /* запрос состояния (Sense call) */ /* Возврат состояния потока (0: занят, 1: готов к работе) */ /* Когда вернулась готовность к опросу состояния, нужно принять по крайней мере 1 байт */ /* при последующих вызовах передачи, либо f_forward вернет ошибку FR_INT_ERR. */ if (FIFO_READY) cnt = 1; } else { /* запрос передачи (Transfer call) */ do { /* Повторяем, пока есть данные и поток готов их принять */ FIFO_PORT = *p++; cnt++; } while (cnt < btf && FIFO_READY); } return cnt; } /*------------------------------------------------------------------------*/ /* Пример кода, использующего функцию f_forward */ /*------------------------------------------------------------------------*/ FRESULT play_file ( char *fn /* Указатель на звуковой файл, который должен проигрываться */ ) { FRESULT rc; FIL fil; UINT dmy; /* Открытие аудиофайла в режиме только для чтения */ rc = f_open(&fil, fn, FA_READ); if (rc) return rc; /* Делаем цикл, пока указатель позиции в файле не достигнет конца файла */ while (rc == FR_OK && fil.fptr < fil.fsize) { /* тут могут работать любые другие процессы... */ /* Заполнение выходного потока периодически, либо по запросу */ rc = f_forward(&fil, out_stream, 1000, &dmy); } /* Закрытие файла и возврат */ f_close(&fil); return rc; }

См. также

f_open, f_gets, f_write, f_close, FIL

[Ссылки]

1. f_forward - прямая передача данных файла в поток (оригинал статьи на английском языке).