最新版 FatFS f_forward 详解

作者:fly 发布于:2014-3-24 16:36 分类:嵌入式

f_forward

读取文件数据并将其转发到数据流设备。

FRESULT f_forward (

 FIL* FileObject,                 /* 文件对象 */

 UINT (*Func)(const BYTE*,UINT),  /* 数据流函数 */

 UINT ByteToFwd,                  /* 要转发的字节数 */

 UINT* ByteFwd                    /* 已转发的字节数 */

);

参数

FileObject


打开的文件对象的指针。

Func


用户定义的数据流函数的指针。详情参考示例代码。

ByteToFwd


要转发的字节数,UINT范围内。

ByteFwd


返回已转发的字节数的UINT变量的指针。

返回值

FR_OK (0)


函数成功。

FR_DENIED


由于文件已经以非读模式打开,而导致函数失败。

FR_DISK_ERR


由于底层磁盘I/O函数中的错误,而导致该函数失败。

FR_INT_ERR


由于一个错误的FAT结构或一个内部错误,而导致该函数失败。

FR_NOT_READY


由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。

FR_INVALID_OBJECT


文件对象无效。

描述

f_forward函数当_USE_FORWARD == 1并且_FS_TINY == 1时可用。

f_forward函数从文件中读取数据并将数据转发到输出流,而不使用数据缓冲区。这适用于小存储系统,因为它在应用模块中不需要任何数据缓冲区。文件对象的文件指针以转发的字节数增加。如果*ByteFwd < ByteToFwd并且没有错误,则意味着由于文件结束或在数据传输过程中流忙,请求的字节不能被传输。


例子(音频播放)

/*-----------------------------------------------------------------------*/

/* 示例代码:数据传输函数,将被f_forward函数调用                                 */

/*-----------------------------------------------------------------------*/


UINT out_stream (   /* 返回已发送字节数或流状态 */

   const BYTE *p,  /* 将被发送的数据块的指针 */

   UINT btf        /* >0: 传输调用(将被发送的字节数)。0: 检测调用 */

)

{

   UINT cnt = 0;



   if (btf == 0) {     /* 检测调用 */

       /* 返回流状态(0: 忙,1: 就绪) */

       /* 当检测调用时,一旦它返回就绪,那么在后续的传输调用时,它必须接收至少一个字节,或者f_forward将以FR_INT_ERROR而失败。 */

       if (FIFO_READY) cnt = 1;

   }

   else {              /* 传输调用 */

       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);


   /* 重复,直到文件指针到达文件结束位置 */

   while (rc == FR_OK && fil.fptr < fil.fsize) {


       /* 任何其他处理... */


       /* 定期或请求式填充输出流 */

       rc = f_forward(&fil, out_stream, 1000, &dmy);

   }


   /* 该只读的音频文件对象不需要关闭就可以被丢弃 */

   return rc;

}


发表评论:

 
Powered by emlog sitemap