// Simple performance test for Teensy 3.5/3.6 SDHC. // Demonstrates yield() efficiency. #include "SdFat.h" // 32 KiB buffer. const size_t BUF_DIM = 32768; // 8 MiB file. const uint32_t FILE_SIZE = 256UL*BUF_DIM; SdFatSdio sd; File file; uint8_t buf[BUF_DIM]; // buffer as uint32_t uint32_t* buf32 = (uint32_t*)buf; // Total usec in read/write calls. uint32_t totalMicros = 0; // Time in yield() function. uint32_t yieldMicros = 0; // Number of yield calls. uint32_t yieldCalls = 0; // Max busy time for single yield call. uint32_t yieldMaxUsec = 0; //----------------------------------------------------------------------------- // Replace "weak" system yield() function. void yield() { // Only count cardBusy time. if (!sd.card()->dmaBusy()) { return; } uint32_t m = micros(); yieldCalls++; while (sd.card()->dmaBusy()) { // Do something here. } m = micros() - m; if (m > yieldMaxUsec) { yieldMaxUsec = m; } yieldMicros += m; } //----------------------------------------------------------------------------- void setup() { Serial.begin(9600); while (!Serial) { } Serial.println("Type any character to begin"); while (!Serial.available()) { } if (!sd.begin()) { sd.initErrorHalt(); } if (!file.open("TeensyDemo.bin", O_RDWR | O_CREAT)) { sd.errorHalt("open failed"); } Serial.println("\nsize,write,read"); Serial.println("bytes,KB/sec,KB/sec"); for (size_t nb = 512; nb <= BUF_DIM; nb *= 2) { file.truncate(0); uint32_t nRdWr = FILE_SIZE/nb; Serial.print(nb); Serial.print(','); uint32_t t = micros(); for (uint32_t n = 0; n < nRdWr; n++) { // Set start and end of buffer. buf32[0] = n; buf32[nb/4 - 1] = n; if (nb != file.write(buf, nb)) { sd.errorHalt("write failed"); } } t = micros() - t; totalMicros += t; Serial.print(1000.0*FILE_SIZE/t); Serial.print(','); file.rewind(); t = micros(); for (uint32_t n = 0; n < nRdWr; n++) { if ((int)nb != file.read(buf, nb)) { sd.errorHalt("read failed"); } // crude check of data. if (buf32[0] != n || buf32[nb/4 - 1] != n) { sd.errorHalt("data check"); } } t = micros() - t; totalMicros += t; Serial.println(1000.0*FILE_SIZE/t); } file.close(); Serial.print("\ntotalMicros "); Serial.println(totalMicros); Serial.print("yieldMicros "); Serial.println(yieldMicros); Serial.print("yieldCalls "); Serial.println(yieldCalls); Serial.print("yieldMaxUsec "); Serial.println(yieldMaxUsec); Serial.println("Done"); } void loop() { }