A collection of examples organized from basics to advanced.
Dependencies: mbed SDFileSystem
Mbed online compiler has no facility to easily manage a lot of programs or organized them in to related folders. This makes creating an examples and sample pack difficult.
This repository contains a single main.cpp file (which does very little), and a BuildOptions.h file. Simply uncomment the example you would like to compile from the build options. Each example is wrapped in a compiler directive.
If the directive does not include a description comment, it likely does not exist yet. If you would like to contribute to the Examples project, please contact me or fork and issue a pull request.
Diff: 09_Files_SD/SD_Speed_Test.cpp
- Revision:
- 2:17a5c34b3a79
diff -r 9a043ee174de -r 17a5c34b3a79 09_Files_SD/SD_Speed_Test.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/09_Files_SD/SD_Speed_Test.cpp Tue Jul 09 02:23:18 2019 +0000 @@ -0,0 +1,146 @@ +/* https://os.mbed.com/users/neilt6/code/SDFileSystem/ + * + * Mounts an SD card, creates a buffer of random data, then writes and reads + * back that data. Finishes with a report of the size of the buffer file + * and read / write speeds. + * + * SDFileSystem library requires MBED Release 165, dated Feb 20, 2019. Updates will break it. + * If having difficulty, import the link above as independant program. + */ + +#ifdef COMPILE_SD_Speed_Test + +#include "SDFileSystem.h" + +Timer timer; +DigitalIn button(D7, PullUp); +// MOSI, MISO, CLK, CS, "name", detect +SDFileSystem sd(PB_5, PB_4, PB_3, PA_11, "sd", PA_8, SDFileSystem::SWITCH_NEG_NC, 25000000); +char buffer[4096]; + +void writeTest() +{ + //Test write performance by creating a 1MB file + printf("Testing %iB write performance...", sizeof(buffer)); + FileHandle* file = sd.open("Test File.bin", O_WRONLY | O_CREAT | O_TRUNC); + if (file != NULL) { + timer.start(); + for (int i = 0; i < (1048576 / sizeof(buffer)); i++) { + if (file->write(buffer, sizeof(buffer)) != sizeof(buffer)) { + timer.stop(); + printf("write error!\n"); + timer.reset(); + return; + } + } + timer.stop(); + if (file->close()) + printf("failed to close file!\n"); + else + printf("done!\n\tResult: %.2fKB/s\n", 1024 / (timer.read_us() / 1000000.0)); + timer.reset(); + } else { + printf("failed to create file!\n"); + } +} + +void readTest() +{ + //Test read performance by reading the 1MB file created by writeTest() + printf("Testing %iB read performance...", sizeof(buffer)); + FileHandle* file = sd.open("Test File.bin", O_RDONLY); + if (file != NULL) { + timer.start(); + int iterations = 0; + while (file->read(buffer, sizeof(buffer)) == sizeof(buffer)) + iterations++; + timer.stop(); + if (iterations != (1048576 / sizeof(buffer))) + printf("read error!\n"); + else if (file->close()) + printf("failed to close file!\n"); + else if (sd.remove("Test File.bin")) + printf("failed to delete file!\n"); + else + printf("done!\n\tResult: %.2fKB/s\n", 1024 / (timer.read_us() / 1000000.0)); + timer.reset(); + } else { + printf("failed to open file!\n"); + } +} + +int main() +{ + printf("SD Card Tester...\n"); + //Configure CRC, large frames, and write validation + sd.crc(true); + sd.large_frames(true); + sd.write_validation(true); + + printf("Filling buffer with random data for write test...\n"); + //Fill the buffer with random data for the write test + srand(time(NULL)); + for (int i = 0; i < sizeof(buffer); i++) + buffer[i] = rand(); + printf("Done. Press button to test\n"); + + while(1) { + //Simple button debouncing + wait(0.5); + + //Print the start message + printf("\nStarting Tests: "); + + //Wait for the button to be pressed + while(button); + + //Make sure a card is present + if (!sd.card_present()) { + printf("\nNo card present!\n"); + continue; + } + + //Try to mount the SD card + printf("\nMounting SD card..."); + if (sd.mount() != 0) { + printf("failed!\n"); + continue; + } + printf("success!\n"); + + //Display the card type + printf("\tCard type: "); + SDFileSystem::CardType cardType = sd.card_type(); + if (cardType == SDFileSystem::CARD_NONE) + printf("None\n"); + else if (cardType == SDFileSystem::CARD_MMC) + printf("MMC\n"); + else if (cardType == SDFileSystem::CARD_SD) + printf("SD\n"); + else if (cardType == SDFileSystem::CARD_SDHC) + printf("SDHC\n"); + else + printf("Unknown\n"); + + //Display the card capacity + printf("\tSectors: %u\n", sd.disk_sectors()); + printf("\tCapacity: %.1fMB\n", sd.disk_sectors() / 2048.0); + + /*//Format the card + printf("Formatting SD card..."); + if (sd.format() != 0) { + printf("failed!\n"); + continue; + } + printf("success!\n");*/ + + //Perform a read/write test + writeTest(); + readTest(); + + //Unmount the SD card + sd.unmount(); + } +} + +#endif \ No newline at end of file