經驗:FatFs文件系統實時寫入


實時需求:接收來自CAN總線的數據,20ms一次,一次8個字節
經驗總結
0,FAT類文件系統不適合作為實時寫入
1,單文件寫入次數限制。減少對文件的操作次數,單文件操作次數小於1000次
2,文件打開關閉次數限制。每次寫入不要重復的開關文件,最好采用f_write和f_sync組合,無需每次寫入完成后關閉文件
3,文件開關時間不確定。單獨放到獨立實時任務
4,長時間高頻寫入速度變慢。采用多重大緩沖,緩沖區大小為512的整數倍,如4K
5,采用異步緩沖模式,接收數據和寫入數據分開操作
6,采用專供工具SD Card Formatter格式化SD卡
7,RL-FlashFs,完美解決實時存儲問題
 
來自網絡的原始資料
現在解決了寫入失敗的問題,是由文件名命名使用了一些特殊字符造成的,另外沒有按照8.3格式命名文件名也會造成寫失敗。每次18Kb,每秒寫入10個文件,寫了兩千多文件全部成功但寫到后面超時嚴重,寫一個,丟失兩個。每秒寫一次的話比較穩定,現在的想法是新建文件后寫入十次,再關閉文件,看看是否可以避免文件過多寫超時的問題。
采用F405RGT6,SPI DMA接收數據,SDIO DMA寫入TF卡,程序中定義5*18*1024的三維數組作為緩沖隊列,采用讀寫分離的方式。
現在60ms接收一次,每秒接收平均16.67次,每次18KB,每1000次數據存在一個文件內。多次測試,能達到接收三萬次數據無誤不丟失,基本滿足了需求。后續還會再進一步測試。
簡單分享一下實時寫入的一些注意事項:
(1) TF卡品質要好,不同廠家的性能差異很大,建議買閃迪等廠家的高速TF卡。
(2) 根據寫入數據需求對TF卡分配單元大小進行格式化,TF卡在FAT32格式化分配單元大小最大為64KB,實時寫入建議格式化為64KB,實測不同大小對實時性有很大影響。
(3) 文件系統中創建文件和關閉文件的時間不確定,開關次數過多可能造成某次耗時過長,影響后續數據寫入,所以采用每1000次數據寫入一個文件的方式,減少
     對文件的開關次數。
(4) 隨着寫入數據的增多,和文件數目的增多,TF卡的寫入速度會越來越慢,同樣大小的數據,寫入的時間也不確定,所以采用隊列進行FIFO緩沖。

基本就是這些,TF卡在數據量較大,寫入頻率較高時實時寫入還是比較有難度的,如果數據量較小頻率較低的話還是比較穩定的,做過很多測試。
簡單幾句話,卻是花費了大量時間精力調試測試得到的,記錄一下,希望對大家有所幫助。
使用兩個月,說一下使用的一些事項,
1. 1000次保存一次數據改為100次保存一次數據,不會降低穩定性。
2. 使用中多次保存超過50000次數據,數據不丟失不錯位。
3. 注意SPI連接線的長度以及電源的穩定性,在一台較老的機器進行測試時,經常出現數據丟失和錯位的情況,
    懷疑是由於SPI連接線過長且沒有屏蔽層,換用了較短的連接線,情況得到了一定改善,但數據依然會出問
    題,對比其他機器發現可能是由於機器電源不穩定造成的問題。建議SPI連接線使用屏蔽線,電源問題暫時
    未解決,
 
總結:穩定的數據寫入方法及其速度測試
1.  通過上面的測試可以得出
(1)采用4線DMA方式的話,建議調用f_write函數時,寫入的數據不要超過512字節(SD卡扇區大小是512字節),這樣比較穩定。
         如果超過512字節的話會調用multiblock傳輸,容易出錯。

#define TEST_FILE_LEN        (2*1024*1024)    /* 用於測試的文件長度 */    
#define BUF_SIZE                 (512)                   /* 每次讀寫SD卡的最大數據長度 */

每次寫4096字節,一次測試連續寫入TEST_FILE_LEN / 512= 4096次,共測試了20次,沒有出錯。
 
https://www.sdcard.org/downloads/formatter/index.html

SD卡聯盟強烈強烈建議使用此軟件來格式化SD/SDHC/SDXC卡,而不要使用各個操作系統隨附的格式化工具。通常,操作系統附帶的格式化工具可以格式化包括SD/SDHC/SDXC卡在內的各種存儲介質,但是可能無法針對SD/SDHC/SDXC卡進行優化,並且可能導致性能降低。

<ignore_js_op> SDCardFormatterv5_WinEN.zip (6.03 MB, 下載次數: 2029) 

<ignore_js_op> 




FatFS作者ChaN老師也建議大家不要使用操作系統自帶的工具來格式化:
<ignore_js_op> 


 

 
DMA的4字節對齊問題
 
 
改成f_open,然后循環調用 f_write, f_sync即可
 

做項目,因為硬件沒有設計停止寫文件的按鈕(或信號),設備斷電會導致文件無法在windows顯示。后來運用f_sync函數,每寫一次SD卡,就用f_sync保存起來。大約每秒使用16次,連續十幾個小時采集數據並保存。以為萬無一失,然而悲劇發生了。有的設備前幾小時數據正常,后面的數據直接出錯。有的設備第一次就直接寫入錯誤。

解決辦法: 

          (1)每次使用之前都給SD卡格式化。

          (2)減少f_sync函數的使用頻率。增加長緩沖區。

          (3)設備增加按鈕來停止寫文件,並用f_close函數關閉文件,不使用f_sync函數。

 

 
采用F405RGT6,SPI DMA接收數據,SDIO DMA寫入TF卡,程序中定義5*18*1024的三維數組作為緩沖隊列,采用讀寫分離的方式。
現在60ms接收一次,每秒接收平均16.67次,每次18KB,每1000次數據存在一個文件內。多次測試,能達到接收三萬次數據無誤不丟失,基本滿足了需求。后續還會再進一步測試。
簡單分享一下實時寫入的一些注意事項:
(1) TF卡品質要好,不同廠家的性能差異很大,建議買閃迪等廠家的高速TF卡。
(2) 根據寫入數據需求對TF卡分配單元大小進行格式化,TF卡在FAT32格式化分配單元大小最大為64KB,實時寫入建議格式化為64KB,實測不同大小對實時性有很大影響。
(3) 文件系統中創建文件和關閉文件的時間不確定,開關次數過多可能造成某次耗時過長,影響后續數據寫入,所以采用每1000次數據寫入一個文件的方式,減少
     對文件的開關次數。
(4) 隨着寫入數據的增多,和文件數目的增多,TF卡的寫入速度會越來越慢,同樣大小的數據,寫入的時間也不確定,所以采用隊列進行FIFO緩沖。

基本就是這些,TF卡在數據量較大,寫入頻率較高時實時寫入還是比較有難度的,如果數據量較小頻率較低的話還是比較穩定的,做過很多測試。
簡單幾句話,卻是花費了大量時間精力調試測試得到的,記錄一下,希望對大家有所幫助。

FAT類文件系統不適合作為實時寫入,隨着你的寫入的數據不斷加大,寫入時間也會加大。

好點的處理方案是創建多個文件進行記錄。然后每次寫入不要重復的開關文件,最好f_write和f_sync組合即可,無需關閉。
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM