write buffer要32Byte及以上对齐,一次写入尽量多的数据,经测试一次写20个block会比单个block快10倍以上。
这里讲的是另一个问题。f_write写512B,大部分时候都几ms,但有时候写一次要200ms,速度不均匀。这是合乎SD卡协议的,SD卡协议规定write可以有250ms的延时,即sd卡可以持续最多250ms的busy信号(Data0线拉低)给host。
那SD卡为什么会有这个延时呢?原因有两种说法。
一是SD卡内部的buffer满了,给sd卡发的数据经过CRC校验后实际放在了buffer里,然后再写入存储介质中(一般是nand flash),只有等buffer空出来,才会将data0线拉高表示不再busy。
二是wear leveling,sd卡为了保证寿命,就要做到利用到整个地址空间,而不是只去用小部分区域,wear leveling算法就是做这个的。
这是硬件特性决定的,也没有什么特别好的解决方法。推荐下面两种方法:
一是建立能够保存250ms数据的缓冲区
二是选用高速sd卡,我用class4的卡这种200ms的latency出现的概率非常高,用uhs-3的卡就没有出现过了。