Hi!
I'm datalogging at a very high speed using a teensy 3.6, an onboard microsd card, and SdFat. The data logging has looked great, but upon further inspection, I realized the datapoints occasionally skip a significant amount of time.
I wrote a short piece of code to demonstrate this. I typically get that the maximum amount of time to execute file.write() once is several hundred microseconds compared to a minimum of 1 microsecond:
#include "SdFat.h"
#include <avr/io.h>
#include <avr/wdt.h>
SdFatSdio sd;
SdFatSdioEX sdEx;
File file;
void setup() {
Serial.begin(9600);
delay(10);
Serial.println("started!");
// put your setup code here, to run once:
if (!sdEx.begin()) {
sdEx.initErrorHalt("SdFatSdioEX begin() failed");
}
// make sdEx the current volume.
sdEx.chvol();
String fName = "testSpeed.bin";
char nameArr[fName.length()];
fName.toCharArray(nameArr,fName.length());
if (!file.open(nameArr, O_RDWR | O_CREAT)) {
Serial.print(nameArr);
sdEx.errorHalt("open failed: ");
}
file.truncate(0);//truncate file size to 0
int buffSize =6;
char abuff[buffSize];
unsigned long diff = 0;
unsigned long mindiff = 10000000;
unsigned long maxdiff = 0;
for(int i=0;i<10000;i++)
{
unsigned long preOp = micros();
file.write(abuff,buffSize);
unsigned long postOp = micros();
diff = postOp-preOp;
if(diff<mindiff)
mindiff=diff;
if(diff>maxdiff)
maxdiff=diff;
//delay(1);
}
Serial.println(mindiff);
Serial.println(maxdiff);
file.close();
}
void loop() {
// put your main code here, to run repeatedly:
}
The average write speed is fine, but missing several hundred microseconds of data typically causes me a lot of problems when making use of the logged data. Does anyone know the reason for these occasional slow write times?
Thanks in advance for all the help!