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

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仍然存在。