Freertos+FAT, data is lost.

nstcl wrote on Thursday, July 06, 2017:

Hi:
Hardware: STM32F207+S25FL128P
Software:Freertos+FAT, Spansion FFS FTL Driver.
Step 1: I write 20 bytes data into file /log/dat.bin, the print info as;
[FileSystemFileWriteCmd:587]:Write File:/log/dat.bin data(len=20) OK!
[slld_WriteOp:4791]:sys_addr=0xde0020, len_in_bytes=32
[slld_WriteOp:4791]:sys_addr=0xd73e00, len_in_bytes=512
[slld_WriteOp:4791]:sys_addr=0xde0040, len_in_bytes=32
Write file(/log/dat.bin, testdata0inlogfile.) ok!
I dump the file /log/dat.bin ,the print info as:
DPET:dump /log/dat.bin
DPET:[FileSystemFileDumpCmd:472]:File /log/dat.bin len=20!

0000: 74 65 73 74 64 61 74 61 30 69 6E 6C 6F 67 66 69
0100: 6C 65 2E 00

Step 2: I read data from flash directly, the print info as below:
DPET:flashr 0xd73e00 1 20
DPET:FLASH READ(addr=0xd73e00, unit=1, length=0x14) OK!

74 65 73 74 64 61 74 61 30 69 6e 6c 6f 67 66 69
6c 65 2e 00

Step 3: reset the CPU

Step 4: I dump the file /log/dat.bin ,the print info as:
DPET:dump /log/dat.bin
DPET:[FileSystemFileDumpCmd:466]:File /log/dat.bin len=0!
I get the file length through ff_filelength() function. I can not find the data in my file!

Step 5: I read the data from flash, the info as below:
DPET:flashr 0xd73e00 1 20
DPET:FLASH READ(addr=0xd73e00, unit=1, length=0x14) OK!

74 65 73 74 64 61 74 61 30 69 6e 6c 6f 67 66 69
6c 65 2e 00.

My question is the data was writen to the flash sucessfully, but the FAT system can not read it. Why?
I do not find a function like fflush() in linux.
Please help me.
Thank you.

heinbali01 wrote on Thursday, July 06, 2017:

Hi Lifei Yan,

Would it be possible that data has not been flushed to the flash at the moment the CPU gets a reset?
What I do know is that FreeRTOS+FAT will always flush data to disk as soon as you call ff_fclose().
But I do not know about your driver for the Spansion? Can you point out where to find that driver?

Regards.

nstcl wrote on Friday, July 07, 2017:

Hi Hein Tibosch,
The data has been flushed to the flash at the moment the CPU gets a reset.
In Step 5 : After reset, I read the data from flash, the info as below:
DPET:flashr 0xd73e00 1 20
DPET:FLASH READ(addr=0xd73e00, unit=1, length=0x14) OK!
74 65 73 74 64 61 74 61 30 69 6e 6c 6f 67 66 69
6c 65 2e 00.
wo can see that after reset, the data is in flash,but FAT can not get it.

We can apply Spansion driver through the link:
http://www.cypress.com/forum/nor-flash/where-get-spansion-flash-file-system-and-block-driver

Regards.

heinbali01 wrote on Friday, July 07, 2017:

Lifei Yan, I looked at the Cypress forum but didn’t find a link to the driver. It looks like one has to apply for it. And I’m not going to do that.

I do not find a function like fflush() in linux.

Yes there is this function:

FF_Error_t FF_FlushCache( FF_IOManager_t *pxIOManager )

Now if you want me to check the source code, you can send it privately to h [dot] tibosch [at] freertos [dot].org

nstcl wrote on Monday, July 10, 2017:

Hi Hein Tibosch,
Thank you very much.
I made a mistake in my code. There are to methods to solve this problem .
1, In Spansion FTL configuration file ftl_if_ex.h, the FTL_RPB_CACHE should be set to FALSE.
2, The function FTL_FlushTableCache() and FTL_FlushDataCache() should be called when FF_FlushCache( FF_IOManager_t pxIOManager ) is called.