fatfs-SDIO的寫檔案時間耗費在哪裡了(之一)?
分析的是這個驅動,也是網上流傳比較多的,如下:
* @file fatfs_drv.c
* @author MCD Application Team
* @version V1.1.0
* @date 31-July-2013
* @brief diskio interface
-------------
網上安富萊的例子用的是V1.1.2的驅動,也不知道比V1.1.0的驅動先進在哪裡。
今天就分析V1.1.0的。
具體的呼叫過程是
f_open();
while(1) {
f_write();
}
寫函式當然就是
這個函式disk_write,
就分析這個disk_write的裡面的扇區對齊且寫檔案是扇區的整數倍的時候的情形。
假設扇區512,通過f_write函式寫入1024*5個位元組。
#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */
/* Maximum sector size to be handled.
/ Always set 512 for memory card and hard disk but a larger value may be
/ required for on-board flash memory, floppy disk and optical disk.
/ When _MAX_SS is larger than 512, it configures FatFs to variable sector size
/ and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */
disk_write裡面
有如下的內容:
(1)SD_WriteMultiBlocks((BYTE *)buff, (uint32_t )(sector * BLOCK_SIZE), BLOCK_SIZE, count);//耗費時間tx_1
(2)sdstatus = SD_WaitWriteOperation(); //耗費時間ty_1
(3)while(SD_GetStatus() != SD_TRANSFER_OK) //耗費時間tz_1
看下時間,抓個圖:如下:
可見tx_1時間很固定,大概1個ms,tz_1時間多的有15ms,大部分10ms左右。ty_1的時間偶爾比較長,值是490ms。
10ms左右的延時在我的系統裡面還是可以勉強忍受的,但是490ms是無法容忍的。那麼就看看這490ms都耗費在哪裡?
函式SD_WaitWriteOperation();裡面主要有兩個延時:如下:
(4)while ((DMAEndOfTransfer == 0x00) && (TransferEnd == 0) && (TransferError == SD_OK) && (timeout > 0))//耗費時間tM_1
(5)while(((SDIO->STA & SDIO_FLAG_TXACT)) && (timeout > 0))//耗費時間tN_1
可以看出主要時間耗費在tM_1了。
那麼我們再看一下while ((DMAEndOfTransfer == 0x00) && (TransferEnd == 0) && (TransferError == SD_OK) && (timeout > 0))的幾個變數的走勢:
區域性放大一下:
看下函式SD_WaitWriteOperation的註釋:
/**
* @brief This function waits until the SDIO DMA data transfer is finished.
* This function should be called after SDIO_WriteBlock() and
* SDIO_WriteMultiBlocks() function to insure that all data sent by the
* card are already transferred by the DMA controller.
* @param None.
* @retval SD_Error: SD Card Error code.
*/
======================
測試到這裡就完活了,那麼重點來了,怎麼解決那490ms呢?
目前還沒有好的辦法,慢慢想吧,,,,
另外我的程式沒有同步資料,可以同步一下資料看看耗費時間。。。
具體的呼叫過程是
f_open();
while(1) {
f_write();
f_sync();
}
剛剛實驗了,同步之後這個390ms仍然存在。