天天看點

fatfs-SDIO的寫檔案時間耗費在哪裡了(之三)?

在《fatfs-SDIO的寫檔案時間耗費在哪裡了(之一)?》我們用了如下的做法來測試f_write()的執行時間:

f_open();
while(1) {     
 f_write(); 
}
           

在《fatfs-SDIO的寫檔案時間耗費在哪裡了(之二)?》我們用了如下做法來測試f_open 和f_write和f_close這三個函數加在一起的的執行時間:

while(1)
{
    f_open();
    f_write();
    f_close();
}
           

在上面這兩篇文章中,犯了一個嚴重錯誤,就是不應該不停的打開寫入關閉,而是應該定時的執行。就是首先看看這三個函數最大的執行時間是多少,然後再用稍微多一點的時間定時執行。

比如我先測出來這三個函數的最大執行時間是38ms,那麼可以50ms定時執行這三個函數:如下:

while(1)
{
    if (到了50ms) {
       f_open();
       f_write();
       f_close();
    }
}
           

這樣的話,就是每間隔50ms才執行一次寫入檔案的操作。

這樣我們來看一下整個whle循環内的掃描時間(注:掃描時間是PLC的叫法)是多少?

fatfs-SDIO的寫檔案時間耗費在哪裡了(之三)?

上圖看出,高點一般是30ms左右。那麼每50ms執行一次,還有20ms可以幹點别的活,比如用這20ms來弄個485發送啊之類的。就是說這個系統可以確定50ms的實時性了。

下面再看看如果不加定義器就是如果是采用《fatfs-SDIO的寫檔案時間耗費在哪裡了(之二)?》的做法的話,掃描時間是多少呢?

如下圖:

fatfs-SDIO的寫檔案時間耗費在哪裡了(之三)?

可以看出沒給别的任務任何的執行時間,當然我的程式如何添加上别的任務,說不準仍然是上圖的掃描時間的值,主要看SD驅動那頭怎麼處理了。

===========================================================================================

通過上面實驗,看起來是(希望事實也是如此)找到了裸機寫SD卡的最佳方法,如下圖(下圖兩個時間定義):

函數SD_WaitWriteOperation();裡面主要有兩個延時:如下:

while ((DMAEndOfTransfer == 0x00) && (TransferEnd == 0) && (TransferError == SD_OK) && (timeout > 0))//耗費時間tM_1

while(((SDIO->STA & SDIO_FLAG_TXACT)) && (timeout > 0))//耗費時間tN_1

fatfs-SDIO的寫檔案時間耗費在哪裡了(之三)?

可以猜測出來,寫入檔案耗費的30多ms分散的花在了不同的地方,tN_1花了不到10ms,那麼其餘時間具體用到了哪裡,以後再說吧。

另外實戰的話,可能還要添加一些函數,比如f_lseek。

還要研究WINHEX軟體,并長時間測試,看看寫入SD的實際情況。

我手裡有兩張同時買的SD卡,其中一張經常使用,結果發現這張用的長的執行寫入的時間也長一些。至于為什麼會發生這種情況

就需要用WINHEX分析一下了。

SD卡并不簡單,我還是處于入門級别。。。。過一段時間情況可能會好轉。。。。