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.

210 líneas
5.2KB

  1. // Benchmark comparing SdFile and StdioStream.
  2. #include <SPI.h>
  3. #include "SdFat.h"
  4. // Define PRINT_FIELD nonzero to use printField.
  5. #define PRINT_FIELD 0
  6. // Number of lines to list on Serial.
  7. #define STDIO_LIST_COUNT 0
  8. #define VERIFY_CONTENT 0
  9. const uint8_t SD_CS_PIN = SS;
  10. SdFat sd;
  11. SdFile printFile;
  12. StdioStream stdioFile;
  13. float f[100];
  14. char buf[20];
  15. const char* label[] =
  16. { "uint8_t 0 to 255, 100 times ", "uint16_t 0 to 20000",
  17. "uint32_t 0 to 20000", "uint32_t 1000000000 to 1000010000",
  18. "float nnn.ffff, 10000 times"
  19. };
  20. //------------------------------------------------------------------------------
  21. void setup() {
  22. uint32_t printSize;
  23. uint32_t stdioSize = 0;
  24. uint32_t printTime;
  25. uint32_t stdioTime = 0;
  26. Serial.begin(9600);
  27. while (!Serial) {
  28. SysCall::yield();
  29. }
  30. Serial.println(F("Type any character to start"));
  31. while (!Serial.available()) {
  32. SysCall::yield();
  33. }
  34. Serial.println(F("Starting test"));
  35. if (!sd.begin(SD_CS_PIN)) {
  36. sd.errorHalt();
  37. }
  38. for (uint8_t i = 0; i < 100; i++) {
  39. f[i] = 123.0 + 0.1234*i;
  40. }
  41. for (uint8_t dataType = 0; dataType < 5; dataType++) {
  42. for (uint8_t fileType = 0; fileType < 2; fileType++) {
  43. if (!fileType) {
  44. if (!printFile.open("print.txt", O_CREAT | O_RDWR | O_TRUNC)) {
  45. Serial.println(F("open fail"));
  46. return;
  47. }
  48. printTime = millis();
  49. switch (dataType) {
  50. case 0:
  51. for (uint16_t i =0; i < 100; i++) {
  52. for (uint8_t j = 0; j < 255; j++) {
  53. printFile.println(j);
  54. }
  55. }
  56. break;
  57. case 1:
  58. for (uint16_t i = 0; i < 20000; i++) {
  59. printFile.println(i);
  60. }
  61. break;
  62. case 2:
  63. for (uint32_t i = 0; i < 20000; i++) {
  64. printFile.println(i);
  65. }
  66. break;
  67. case 3:
  68. for (uint16_t i = 0; i < 10000; i++) {
  69. printFile.println(i + 1000000000UL);
  70. }
  71. break;
  72. case 4:
  73. for (int j = 0; j < 100; j++) {
  74. for (uint8_t i = 0; i < 100; i++) {
  75. printFile.println(f[i], 4);
  76. }
  77. }
  78. break;
  79. default:
  80. break;
  81. }
  82. printFile.sync();
  83. printTime = millis() - printTime;
  84. printFile.rewind();
  85. printSize = printFile.fileSize();
  86. } else {
  87. if (!stdioFile.fopen("stream.txt", "w+")) {
  88. Serial.println(F("fopen fail"));
  89. return;
  90. }
  91. stdioTime = millis();
  92. switch (dataType) {
  93. case 0:
  94. for (uint16_t i =0; i < 100; i++) {
  95. for (uint8_t j = 0; j < 255; j++) {
  96. #if PRINT_FIELD
  97. stdioFile.printField(j, '\n');
  98. #else // PRINT_FIELD
  99. stdioFile.println(j);
  100. #endif // PRINT_FIELD
  101. }
  102. }
  103. break;
  104. case 1:
  105. for (uint16_t i = 0; i < 20000; i++) {
  106. #if PRINT_FIELD
  107. stdioFile.printField(i, '\n');
  108. #else // PRINT_FIELD
  109. stdioFile.println(i);
  110. #endif // PRINT_FIELD
  111. }
  112. break;
  113. case 2:
  114. for (uint32_t i = 0; i < 20000; i++) {
  115. #if PRINT_FIELD
  116. stdioFile.printField(i, '\n');
  117. #else // PRINT_FIELD
  118. stdioFile.println(i);
  119. #endif // PRINT_FIELD
  120. }
  121. break;
  122. case 3:
  123. for (uint16_t i = 0; i < 10000; i++) {
  124. #if PRINT_FIELD
  125. stdioFile.printField(i + 1000000000UL, '\n');
  126. #else // PRINT_FIELD
  127. stdioFile.println(i + 1000000000UL);
  128. #endif // PRINT_FIELD
  129. }
  130. break;
  131. case 4:
  132. for (int j = 0; j < 100; j++) {
  133. for (uint8_t i = 0; i < 100; i++) {
  134. #if PRINT_FIELD
  135. stdioFile.printField(f[i], '\n', 4);
  136. #else // PRINT_FIELD
  137. stdioFile.println(f[i], 4);
  138. #endif // PRINT_FIELD
  139. }
  140. }
  141. break;
  142. default:
  143. break;
  144. }
  145. stdioFile.fflush();
  146. stdioTime = millis() - stdioTime;
  147. stdioSize = stdioFile.ftell();
  148. if (STDIO_LIST_COUNT) {
  149. size_t len;
  150. stdioFile.rewind();
  151. for (int i = 0; i < STDIO_LIST_COUNT; i++) {
  152. stdioFile.fgets(buf, sizeof(buf), &len);
  153. Serial.print(len);
  154. Serial.print(',');
  155. Serial.print(buf);
  156. }
  157. }
  158. }
  159. }
  160. Serial.println(label[dataType]);
  161. if (VERIFY_CONTENT && printSize == stdioSize) {
  162. printFile.rewind();
  163. stdioFile.rewind();
  164. for (uint32_t i = 0; i < stdioSize; i++) {
  165. if (printFile.read() != stdioFile.getc()) {
  166. Serial.print(F("Files differ at pos: "));
  167. Serial.println(i);
  168. return;
  169. }
  170. }
  171. }
  172. Serial.print(F("fileSize: "));
  173. if (printSize != stdioSize) {
  174. Serial.print(printSize);
  175. Serial.print(F(" != "));
  176. }
  177. Serial.println(stdioSize);
  178. Serial.print(F("print millis: "));
  179. Serial.println(printTime);
  180. Serial.print(F("stdio millis: "));
  181. Serial.println(stdioTime);
  182. Serial.print(F("ratio: "));
  183. Serial.println((float)printTime/(float)stdioTime);
  184. Serial.println();
  185. printFile.close();
  186. stdioFile.fclose();
  187. }
  188. Serial.println(F("Done"));
  189. }
  190. void loop() {}