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.
09_Files_SD/SD_Speed_Test.cpp
- Committer:
- epremeaux
- Date:
- 2019-07-09
- Revision:
- 2:17a5c34b3a79
File content as of revision 2:17a5c34b3a79:
/* 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
Emery Premeaux