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的實時性了。
下面再看看如果不加定義器就是如果是採用《
如下圖:
可以看出沒給別的任務任何的執行時間,當然我的程式如何新增上別的任務,說不準仍然是上圖的掃描時間的值,主要看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卡並不簡單,我還是處於入門級別。。。。過一段時間情況可能會好轉。。。。