|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- /*
- * This program is a simple binary write/read benchmark
- * for the standard Arduino SD.h library.
- */
- #include <SPI.h>
- #include <SD.h>
-
- // SD chip select pin
- const uint8_t chipSelect = SS;
-
- #define FILE_SIZE_MB 5
- #define FILE_SIZE (1000000UL*FILE_SIZE_MB)
- #define BUF_SIZE 100
-
- uint8_t buf[BUF_SIZE];
-
- // test file
- File file;
-
- //------------------------------------------------------------------------------
- void error(const char* s) {
- Serial.println(s);
- while (1) {
- yield();
- }
- }
- //------------------------------------------------------------------------------
- void setup() {
- Serial.begin(9600);
-
- // Wait for USB Serial
- while (!Serial) {
- yield();
- }
- }
- //------------------------------------------------------------------------------
- void loop() {
- uint32_t maxLatency;
- uint32_t minLatency;
- uint32_t totalLatency;
-
- // Discard any input.
- do {
- delay(10);
- } while (Serial.available() && Serial.read() >= 0);
-
- // F() stores strings in flash to save RAM
- Serial.println(F("Type any character to start"));
-
- while (!Serial.available()) {
- yield();
- }
- if (!SD.begin(chipSelect)) {
- error("begin");
- }
-
- // open or create file - truncate existing file.
- file = SD.open("Bench.dat", O_RDWR | O_TRUNC | O_CREAT);
- if (!file) {
- error("open failed");
- }
-
- // fill buf with known data
- for (uint16_t i = 0; i < (BUF_SIZE-2); i++) {
- buf[i] = 'A' + (i % 26);
- }
- buf[BUF_SIZE-2] = '\r';
- buf[BUF_SIZE-1] = '\n';
-
- Serial.print(F("File size "));
- Serial.print(FILE_SIZE_MB);
- Serial.println(F("MB"));
- Serial.print(F("Buffer size "));
- Serial.print(BUF_SIZE);
- Serial.println(F(" bytes"));
- Serial.println(F("Starting write test. Please wait up to a minute"));
-
- // do write test
- uint32_t n = FILE_SIZE/sizeof(buf);
- maxLatency = 0;
- minLatency = 999999;
- totalLatency = 0;
- uint32_t t = millis();
- for (uint32_t i = 0; i < n; i++) {
- uint32_t m = micros();
- if (file.write(buf, sizeof(buf)) != sizeof(buf)) {
- error("write failed");
- }
- m = micros() - m;
- if (maxLatency < m) {
- maxLatency = m;
- }
- if (minLatency > m) {
- minLatency = m;
- }
- totalLatency += m;
- }
- file.flush();
- t = millis() - t;
- double s = file.size();
- Serial.print(F("Write "));
- Serial.print(s/t);
- Serial.print(F(" KB/sec\n"));
- Serial.print(F("Maximum latency: "));
- Serial.print(maxLatency);
- Serial.print(F(" usec, Minimum Latency: "));
- Serial.print(minLatency);
- Serial.print(F(" usec, Avg Latency: "));
- Serial.print(totalLatency/n);
- Serial.print(F(" usec\n\n"));
- Serial.println(F("Starting read test. Please wait up to a minute"));
- // do read test
- file.seek(0);
- maxLatency = 0;
- minLatency = 99999;
- totalLatency = 0;
- t = millis();
- for (uint32_t i = 0; i < n; i++) {
- buf[BUF_SIZE-1] = 0;
- uint32_t m = micros();
- if (file.read(buf, sizeof(buf)) != sizeof(buf)) {
- error("read failed");
- }
- m = micros() - m;
- if (maxLatency < m) {
- maxLatency = m;
- }
- if (minLatency > m) {
- minLatency = m;
- }
- totalLatency += m;
- if (buf[BUF_SIZE-1] != '\n') {
- error("data check");
- }
- }
- t = millis() - t;
- Serial.print(F("Read "));
- Serial.print(s/t);
- Serial.print(F(" KB/sec\n"));
- Serial.print(F("Maximum latency: "));
- Serial.print(maxLatency);
- Serial.print(F(" usec, Minimum Latency: "));
- Serial.print(minLatency);
- Serial.print(F(" usec, Avg Latency: "));
- Serial.print(totalLatency/n);
- Serial.print(F(" usec\n\n"));
- Serial.print(F("Done\n\n"));
- file.close();
- }
|