1. 程式人生 > >fatfs-SDIO的寫檔案時間耗費在哪裡了(之三)?

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的叫法)是多少?

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

下面再看看如果不加定義器就是如果是採用《

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
 

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

 

 

另外實戰的話,可能還要新增一些函式,比如f_lseek。

 

 

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

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

就需要用WINHEX分析一下了。

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