You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

140 lines
3.4KB

  1. /*
  2. * This program is a simple binary write/read benchmark
  3. * for the standard Arduino SD.h library.
  4. */
  5. #include <SPI.h>
  6. #include <SD.h>
  7. // SD chip select pin
  8. const uint8_t chipSelect = SS;
  9. #define FILE_SIZE_MB 5
  10. #define FILE_SIZE (1000000UL*FILE_SIZE_MB)
  11. #define BUF_SIZE 100
  12. uint8_t buf[BUF_SIZE];
  13. // test file
  14. File file;
  15. //------------------------------------------------------------------------------
  16. void error(char* s) {
  17. Serial.println(s);
  18. while(1);
  19. }
  20. //------------------------------------------------------------------------------
  21. void setup() {
  22. Serial.begin(9600);
  23. while (!Serial) {} // wait for Leonardo
  24. }
  25. //------------------------------------------------------------------------------
  26. void loop() {
  27. uint32_t maxLatency;
  28. uint32_t minLatency;
  29. uint32_t totalLatency;
  30. // discard any input
  31. while (Serial.read() >= 0) {}
  32. // F() stores strings in flash to save RAM
  33. Serial.println(F("Type any character to start"));
  34. while (Serial.read() <= 0) {}
  35. delay(400); // catch Due reset problem
  36. if (!SD.begin(chipSelect)) {
  37. error("begin");
  38. }
  39. // open or create file - truncate existing file.
  40. file = SD.open("Bench.dat", O_RDWR | O_TRUNC | O_CREAT);
  41. if (!file) {
  42. error("open failed");
  43. }
  44. // fill buf with known data
  45. for (uint16_t i = 0; i < (BUF_SIZE-2); i++) {
  46. buf[i] = 'A' + (i % 26);
  47. }
  48. buf[BUF_SIZE-2] = '\r';
  49. buf[BUF_SIZE-1] = '\n';
  50. Serial.print(F("File size "));
  51. Serial.print(FILE_SIZE_MB);
  52. Serial.println(F("MB"));
  53. Serial.print(F("Buffer size "));
  54. Serial.print(BUF_SIZE);
  55. Serial.println(F(" bytes"));
  56. Serial.println(F("Starting write test. Please wait up to a minute"));
  57. // do write test
  58. uint32_t n = FILE_SIZE/sizeof(buf);
  59. maxLatency = 0;
  60. minLatency = 999999;
  61. totalLatency = 0;
  62. uint32_t t = millis();
  63. for (uint32_t i = 0; i < n; i++) {
  64. uint32_t m = micros();
  65. if (file.write(buf, sizeof(buf)) != sizeof(buf)) {
  66. error("write failed");
  67. }
  68. m = micros() - m;
  69. if (maxLatency < m) {
  70. maxLatency = m;
  71. }
  72. if (minLatency > m) {
  73. minLatency = m;
  74. }
  75. totalLatency += m;
  76. }
  77. file.flush();
  78. t = millis() - t;
  79. double s = file.size();
  80. Serial.print(F("Write "));
  81. Serial.print(s/t);
  82. Serial.print(F(" KB/sec\n"));
  83. Serial.print(F("Maximum latency: "));
  84. Serial.print(maxLatency);
  85. Serial.print(F(" usec, Minimum Latency: "));
  86. Serial.print(minLatency);
  87. Serial.print(F(" usec, Avg Latency: "));
  88. Serial.print(totalLatency/n);
  89. Serial.print(F(" usec\n\n"));
  90. Serial.println(F("Starting read test. Please wait up to a minute"));
  91. // do read test
  92. file.seek(0);
  93. maxLatency = 0;
  94. minLatency = 99999;
  95. totalLatency = 0;
  96. t = millis();
  97. for (uint32_t i = 0; i < n; i++) {
  98. buf[BUF_SIZE-1] = 0;
  99. uint32_t m = micros();
  100. if (file.read(buf, sizeof(buf)) != sizeof(buf)) {
  101. error("read failed");
  102. }
  103. m = micros() - m;
  104. if (maxLatency < m) {
  105. maxLatency = m;
  106. }
  107. if (minLatency > m) {
  108. minLatency = m;
  109. }
  110. totalLatency += m;
  111. if (buf[BUF_SIZE-1] != '\n') {
  112. error("data check");
  113. }
  114. }
  115. t = millis() - t;
  116. Serial.print(F("Read "));
  117. Serial.print(s/t);
  118. Serial.print(F(" KB/sec\n"));
  119. Serial.print(F("Maximum latency: "));
  120. Serial.print(maxLatency);
  121. Serial.print(F(" usec, Minimum Latency: "));
  122. Serial.print(minLatency);
  123. Serial.print(F(" usec, Avg Latency: "));
  124. Serial.print(totalLatency/n);
  125. Serial.print(F(" usec\n\n"));
  126. Serial.print(F("Done\n\n"));
  127. file.close();
  128. }