No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

133 líneas
3.4KB

  1. /*
  2. * This sketch 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. // pstr 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)) error("begin");
  37. // open or create file - truncate existing file.
  38. file = SD.open("BENCH.DAT", FILE_WRITE | O_TRUNC);
  39. // file = SD.open("BENCH.DAT", O_CREAT | O_TRUNC | O_CREAT);
  40. if (!file) {
  41. error("open failed");
  42. }
  43. // fill buf with known data
  44. for (uint16_t i = 0; i < (BUF_SIZE-2); i++) {
  45. buf[i] = 'A' + (i % 26);
  46. }
  47. buf[BUF_SIZE-2] = '\r';
  48. buf[BUF_SIZE-1] = '\n';
  49. Serial.print(F("File size "));
  50. Serial.print(FILE_SIZE_MB);
  51. Serial.println(F("MB"));
  52. Serial.print(F("Buffer size "));
  53. Serial.print(BUF_SIZE);
  54. Serial.println(F(" bytes"));
  55. Serial.println(F("Starting write test. Please wait up to a minute"));
  56. // do write test
  57. uint32_t n = FILE_SIZE/sizeof(buf);
  58. maxLatency = 0;
  59. minLatency = 999999;
  60. totalLatency = 0;
  61. uint32_t t = millis();
  62. for (uint32_t i = 0; i < n; i++) {
  63. uint32_t m = micros();
  64. if (file.write(buf, sizeof(buf)) != sizeof(buf)) {
  65. error("write failed");
  66. }
  67. m = micros() - m;
  68. if (maxLatency < m) maxLatency = m;
  69. if (minLatency > m) minLatency = m;
  70. totalLatency += m;
  71. }
  72. file.flush();
  73. t = millis() - t;
  74. double s = file.size();
  75. Serial.print(F("Write "));
  76. Serial.print(s/t);
  77. Serial.print(F(" KB/sec\n"));
  78. Serial.print(F("Maximum latency: "));
  79. Serial.print(maxLatency);
  80. Serial.print(F(" usec, Minimum Latency: "));
  81. Serial.print(minLatency);
  82. Serial.print(F(" usec, Avg Latency: "));
  83. Serial.print(totalLatency/n);
  84. Serial.print(F(" usec\n\n"));
  85. Serial.println(F("Starting read test. Please wait up to a minute"));
  86. // do read test
  87. file.seek(0);
  88. maxLatency = 0;
  89. minLatency = 99999;
  90. totalLatency = 0;
  91. t = millis();
  92. for (uint32_t i = 0; i < n; i++) {
  93. buf[BUF_SIZE-1] = 0;
  94. uint32_t m = micros();
  95. if (file.read(buf, sizeof(buf)) != sizeof(buf)) {
  96. error("read failed");
  97. }
  98. m = micros() - m;
  99. if (maxLatency < m) maxLatency = m;
  100. if (minLatency > m) minLatency = m;
  101. totalLatency += m;
  102. if (buf[BUF_SIZE-1] != '\n') {
  103. error("data check");
  104. }
  105. }
  106. t = millis() - t;
  107. Serial.print(F("Read "));
  108. Serial.print(s/t);
  109. Serial.print(F(" KB/sec\n"));
  110. Serial.print(F("Maximum latency: "));
  111. Serial.print(maxLatency);
  112. Serial.print(F(" usec, Minimum Latency: "));
  113. Serial.print(minLatency);
  114. Serial.print(F(" usec, Avg Latency: "));
  115. Serial.print(totalLatency/n);
  116. Serial.print(F(" usec\n\n"));
  117. Serial.print(F("Done\n\n"));
  118. file.close();
  119. }