first
Dependencies: SDFileSystemDMA mbed
Refer to:
https://developer.mbed.org/users/mimi3/code/SDFileSystemDMA
Caution
If your board has SRAM less than or equal to 8KB, the 'buffer' size must be set to 512 Bytes.
NUCLEO-F411RE
About 2.5MBytes/sec
NUCLEO-L152RE
About 1MBytes/sec
Diff: main.cpp
- Revision:
- 12:dfa39c797789
- Parent:
- 11:d5fc11ac948a
- Child:
- 18:5fb42182d85d
--- a/main.cpp Sun Feb 21 21:25:55 2016 +0900 +++ b/main.cpp Tue Feb 23 21:25:22 2016 +0900 @@ -27,20 +27,26 @@ #define SPI_CLOCK_HZ ( 12 * 1000000 ) Timer timer; - +//Serial pc(PA_9,PA_10); Serial pc(USBTX,USBRX); SDFileSystem sd( MOSI, MISO, SCLK, CS, "sd", SPI_CLOCK_HZ); -char buffer[512] __attribute__ ((aligned (4))) ; +//char buffer[512*1] __attribute__ ((aligned (4))) ; /* 512 byte */ +//char buffer[512*2] __attribute__ ((aligned (4))) ; /* 1024 byte */ +char buffer[512*4] __attribute__ ((aligned (4))) ; /* 2028 byte */ +//char buffer[512*8] __attribute__ ((aligned (4))) ; /* 4096 byte */ +//char buffer[512*16] __attribute__ ((aligned (4))) ; /* 8192 byte */ +//char buffer[512*32] __attribute__ ((aligned (4))) ; /* 16384 byte */ + #define X_MEGA_BYTE ((1)*1024*1024) /* 1Mbyte */ #define FILE_NAME "GPATH" void wait_key_press(){ #if UART_KEY_PRESS - pc.printf("\n-- Select 'r' or 'w' --\n"); - fflush(stdout); - while(!pc.readable()); - volatile int res = pc.getc(); + pc.printf("\n-- Select 'r' or 'w' --\n"); + fflush(stdout); + while(!pc.readable()); + volatile int res = pc.getc(); #else #endif @@ -48,72 +54,115 @@ void writeTest() { - //Test write performance by creating a 1MB file - pc.printf("[Write]: Testing %d byte buffer: write performance...", sizeof(buffer)); - fflush(stdout); - FileHandle* file = sd.open(FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC); - if (file != NULL) { - timer.start(); - for (uint32_t i = 0; i < (X_MEGA_BYTE / sizeof(buffer)); i++) { - if (file->write(buffer, sizeof(buffer)) != sizeof(buffer)) { - timer.stop(); - pc.printf("write error!\n"); - timer.reset(); - return; - } - } - timer.stop(); - if (file->close()) - pc.printf("failed to close file!\n"); - else{ - pc.printf("done!\n\tResult: %d KB/s\n", ( 1024 * 1000000 ) / timer.read_us() ); - } - timer.reset(); - } else { - pc.printf("failed to create file!\n"); - } + //Test write performance by creating a 1MB file + pc.printf("[Write]: Testing %d byte buffer: write performance...", sizeof(buffer)); + fflush(stdout); + for(uint32_t k = 0; k < sizeof(buffer); k++){ + buffer[k] = k & 0xff; + } + + FileHandle* file = sd.open(FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC); + if (file != NULL) { + timer.start(); + for (uint32_t i = 0; i < (X_MEGA_BYTE / sizeof(buffer)); i++) { + if (file->write(buffer, sizeof(buffer)) != sizeof(buffer)) { + timer.stop(); + pc.printf("write error!\n"); + timer.reset(); + return; + } + } + timer.stop(); + if (file->close()) + pc.printf("failed to close file!\n"); + else{ + pc.printf("done!\n\tResult: %d KB/s\n", ( 1024 * 1000000 ) / timer.read_us() ); + } + timer.reset(); + } else { + pc.printf("failed to create file!\n"); + } } - void readTest() { - //Test read performance by reading the 1MB file created by writeTest() - pc.printf("[Read]: Testing %d byte buffer: read performance...", sizeof(buffer)); - fflush(stdout); - FileHandle* file = sd.open(FILE_NAME, O_RDONLY); - if (file != NULL) { - timer.start(); - int iterations = 0; - while (file->read(buffer, sizeof(buffer)) == sizeof(buffer)) - iterations++; - timer.stop(); - if (iterations != (X_MEGA_BYTE / sizeof(buffer))){ - pc.printf("read error!\n"); - } - else if (file->close()){ - pc.printf("failed to close file!\n"); - } - // else if (sd.remove(FILE_NAME)) - // pc.printf("failed to delete file!\n"); - else{ - pc.printf("done!\n\tResult: %d KB/s\n", ( 1024 * 1000000 ) / timer.read_us()); - } - timer.reset(); - } else { - pc.printf("failed to open file!\n"); - } + //Test read performance by reading the 1MB file created by writeTest() + pc.printf("[Read]: Testing %d byte buffer: read performance...", sizeof(buffer)); + fflush(stdout); + FileHandle* file = sd.open(FILE_NAME, O_RDONLY); + if (file != NULL) { + timer.start(); + int iterations = 0; + while (file->read(buffer, sizeof(buffer)) == sizeof(buffer)){ + iterations++; + } + timer.stop(); + if (iterations != (X_MEGA_BYTE / sizeof(buffer))){ + pc.printf("read error!\n"); + } + else if (file->close()){ + pc.printf("failed to close file!\n"); + } + // else if (sd.remove(FILE_NAME)) + // pc.printf("failed to delete file!\n"); + else{ + pc.printf("done!\n\tResult: %d KB/s\n", ( 1024 * 1000000 ) / timer.read_us()); + } + timer.reset(); + } else { + pc.printf("failed to open file!\n"); + } +} + +void verifyTest() +{ + int errorCount = 0; + //Test read performance by reading the 1MB file created by writeTest() + pc.printf("[Read]: Verifying %d byte buffer ...", sizeof(buffer)); + fflush(stdout); + FileHandle* file = sd.open(FILE_NAME, O_RDONLY); + if (file != NULL) { + timer.start(); + int iterations = 0; + while (file->read(buffer, sizeof(buffer)) == sizeof(buffer)){ + iterations++; + for(uint32_t k = 0; k < sizeof(buffer); k++){ + if ( buffer[k] != (k & 0xff) ){ + errorCount++; + } + } + } + timer.stop(); + if (iterations != (X_MEGA_BYTE / sizeof(buffer))){ + pc.printf("read error!\n"); + } + else if (file->close()){ + pc.printf("failed to close file!\n"); + } + // else if (sd.remove(FILE_NAME)) + // pc.printf("failed to delete file!\n"); + else{ + // pc.printf("done!\n\tResult: %d KB/s\n", ( 1024 * 1000000 ) / timer.read_us()); + + } + timer.reset(); + } else { + pc.printf("failed to open file!\n"); + } + pc.printf("\n Error Count : %d", errorCount); } int main(){ - /* UART Baudrate is 9600bps*/ - while(1){ + /* UART Baudrate is 9600bps*/ + while(1){ pc.printf("\n---------------------------------------"); pc.printf("\nSPI(%d), SysClock= %d Hz",SPI_DEV, SystemCoreClock); pc.printf(" mbed rev.%d", MBED_LIBRARY_VERSION); - pc.printf("\nStart SD card accsess test!"); + pc.printf("\nStart SD card accsess test!"); pc.printf("\n[r]: Start Read Test. At least execute [w] onece"); pc.printf("\n[w]: Start Write and Read Test"); - pc.printf("\nWriting is very slow, wait tens of seconds."); + pc.printf("\n[v]: Start Read Verify Test. At least execute [w] onece"); + pc.printf("\nWriting is very slow, wait tens of seconds."); pc.printf("\n-- Select [r] or [w] --\n"); fflush(stdout); while(!pc.readable()); @@ -121,9 +170,11 @@ if( ch =='r' ){ readTest(); } else if( ch =='w' ){ - writeTest(); - readTest(); + writeTest(); + readTest(); + } else if( ch =='v' ){ + verifyTest(); } - } + } }