FATFS 初学之 f_sync

 1 /*-----------------------------------------------------------------------*/
 2 /* Synchronize the File Object                                           */
 3 /*-----------------------------------------------------------------------*/
 4
 5 FRESULT f_sync (
 6     FIL *fp        /* Pointer to the file object */
 7 )
 8 {
 9     FRESULT res;
10     DWORD tim;
11     BYTE *dir;
12
13
14     res = validate(fp->fs, fp->id);        /* Check validity of the object */
15     if (res == FR_OK) {
16         if (fp->flag & FA__WRITTEN) {    /* Has the file been written? */
17 #if !_FS_TINY    /* Write-back dirty buffer */
18             if (fp->flag & FA__DIRTY) {
19                 if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK)
20                     LEAVE_FF(fp->fs, FR_DISK_ERR);
21                 fp->flag &= ~FA__DIRTY;
22             }
23 #endif
24             /* Update the directory entry */
25             res = move_window(fp->fs, fp->dir_sect);
26             if (res == FR_OK) {
27                 dir = fp->dir_ptr;
28                 dir[DIR_Attr] |= AM_ARC;                    /* Set archive bit */
29                 ST_DWORD(dir+DIR_FileSize, fp->fsize);        /* Update file size */
30                 ST_CLUST(dir, fp->sclust);                    /* Update start cluster */
31                 tim = get_fattime();                        /* Update updated time */
32                 ST_DWORD(dir+DIR_WrtTime, tim);
33                 fp->flag &= ~FA__WRITTEN;
34                 fp->fs->wflag = 1;
35                 res = sync(fp->fs);
36             }
37         }
38     }
39
40     LEAVE_FF(fp->fs, res);
41 }

函数功能:冲洗一个写文件的缓存信息

描述:

f_sync函数当 _FS_READONLY == 0时可用。
f_sync函数和 f_close函数执行同样的过程,但是文件仍处于打开状态,并且可以继续对文件执行读/写/移动
指针操作。这适用于以写模式长时间打开文件,比如数据记录器。定期的或f_write后立即执行f_sync可以将
由于突然断电或移去磁盘而导致数据丢失的风险最小化。在 f_close前立即执行 f_sync没有作用,因为在
f_close中执行了f_sync。换句话说,这两个函数的差异就是文件对象是不是无效的。

---------------------------------------- 我是分割线 ----------------------------------------

原文地址:http://blog.sina.com.cn/s/blog_66ffe2770100w2p7.html

当对FAT文件系统的写操作由于默写意外而中断,如突然断电,不正确的磁盘移除或不可恢复的磁盘错误,FAT结构可以被毁坏。下面的图片显示了FatFs的临界段。

红色区域的中断会导致一个交叉链接,结果,正在修改的文件/目录可能会丢失。而黄色区域中断可能导致的效果在下面列出:

正在重写的文件数据被毁坏。

正在添加内容的文件回到初始状态。

丢失新建的文件。

一个新建或覆盖的文件保持长度为0。

因为丢失关联,磁盘的使用效率变坏。

在文件不是用写模式打开时,这些情况不会发生。为了最小化磁盘数据的丢失,临界段可以像图表5显示的那样最小化,通过最小化文件处于写模式打开的时间或者适当的使用f_sync函数。

---------------------------------------- 我是分割线 ----------------------------------------

FATFS 初学之 f_sync

时间: 2024-11-05 23:38:20

FATFS 初学之 f_sync的相关文章

FATFS 初学之 f_open/ f_close

f_open: 1 /*-----------------------------------------------------------------------*/ 2 /* Open or Create a File */ 3 /*-----------------------------------------------------------------------*/ 4 5 FRESULT f_open ( 6 FIL *fp, /* Pointer to the blank

FATFS 初学之 f_mkdir/ unlink

f_mkdir: 1 /*-----------------------------------------------------------------------*/ 2 /* Create a Directory */ 3 /*-----------------------------------------------------------------------*/ 4 5 FRESULT f_mkdir ( 6 const TCHAR *path /* Pointer to th

FATFS 初学之 f_forward

1 /*-----------------------------------------------------------------------*/ 2 /* Forward data to the stream directly (available on only tiny cfg) */ 3 /*-----------------------------------------------------------------------*/ 4 5 FRESULT f_forward

FATFS 初学之 f_rename

1 /*-----------------------------------------------------------------------*/ 2 /* Rename File/Directory */ 3 /*-----------------------------------------------------------------------*/ 4 5 FRESULT f_rename ( 6 const TCHAR *path_old, /* Pointer to th

FATFS 初学之 f_mkfs

1 /*-----------------------------------------------------------------------*/ 2 /* Create File System on the Drive */ 3 /*-----------------------------------------------------------------------*/ 4 5 FRESULT f_mkfs ( 6 BYTE drv, /* Logical drive numb

FATFS 初学之 f_getfree

1 /*-----------------------------------------------------------------------*/ 2 /* Get Number of Free Clusters */ 3 /*-----------------------------------------------------------------------*/ 4 5 FRESULT f_getfree ( 6 const TCHAR *path, /* Pointer to

FATFS 初学之 f_chmod/ f_utime

f_chmod: 1 /*-----------------------------------------------------------------------*/ 2 /* Change Attribute */ 3 /*-----------------------------------------------------------------------*/ 4 5 FRESULT f_chmod ( 6 const TCHAR *path, /* Pointer to the

FATFS 初学之 f_chdir/ f_chdrive

1 FRESULT f_chdir ( 2 const TCHAR *path /* Pointer to the directory path */ 3 ) 4 { 5 FRESULT res; 6 DIR dj; 7 DEF_NAMEBUF; 8 9 10 res = chk_mounted(&path, &dj.fs, 0); 11 if (res == FR_OK) { 12 INIT_BUF(dj); 13 res = follow_path(&dj, path); /*

FATFS 初学之 f_opendir/ f_readdir

f_opendir: 1 /*-----------------------------------------------------------------------*/ 2 /* Create a Directroy Object */ 3 /*-----------------------------------------------------------------------*/ 4 5 FRESULT f_opendir ( 6 DIR *dj, /* Pointer to