fatfs-SDIO的写文件时间耗费在哪里了(之三)?

版权声明:本文为博主unsv29原创文章,未经博主允许不得转载。 https://blog.csdn.net/unsv29/article/details/83414866

在《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卡并不简单,我还是处于入门级别。。。。过一段时间情况可能会好转。。。。

猜你喜欢

转载自blog.csdn.net/unsv29/article/details/83414866