J Daniel Martinez C
/
Practica5B-Escitura-SDUSB
Escritura SD USB
Fork of FileSys-MultiFileSystem by
main.cpp@3:a72f30142261, 2016-03-13 (annotated)
- Committer:
- WiredHome
- Date:
- Sun Mar 13 00:00:10 2016 +0000
- Revision:
- 3:a72f30142261
- Parent:
- 2:c887cf1c3ed9
- Child:
- 4:be096a44f789
Changed to support simultaneous SD and USB FileSystem
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
chris | 2:c887cf1c3ed9 | 1 | #include "mbed.h" |
chris | 2:c887cf1c3ed9 | 2 | #include "MSCFileSystem.h" |
WiredHome | 3:a72f30142261 | 3 | #include "SDFileSystem.h" |
WiredHome | 3:a72f30142261 | 4 | |
chris | 2:c887cf1c3ed9 | 5 | |
chris | 2:c887cf1c3ed9 | 6 | MSCFileSystem fs("fs"); |
WiredHome | 3:a72f30142261 | 7 | SDFileSystem sd(p5, p6, p7, p8, "sd", p11, SDFileSystem::SWITCH_NEG_NO, 15000000); |
WiredHome | 3:a72f30142261 | 8 | |
chris | 2:c887cf1c3ed9 | 9 | DigitalOut led(LED1); |
chris | 2:c887cf1c3ed9 | 10 | AnalogIn pot1(p19); |
WiredHome | 3:a72f30142261 | 11 | Timer timer; |
WiredHome | 3:a72f30142261 | 12 | |
WiredHome | 3:a72f30142261 | 13 | char buffer[4096]; |
WiredHome | 3:a72f30142261 | 14 | #define TESTSIZE 1048576 |
WiredHome | 3:a72f30142261 | 15 | //#define TESTSIZE 100 |
WiredHome | 3:a72f30142261 | 16 | |
WiredHome | 3:a72f30142261 | 17 | void sdwriteTest(const char * fname) |
WiredHome | 3:a72f30142261 | 18 | { |
WiredHome | 3:a72f30142261 | 19 | //Test write performance by creating a 1MB file |
WiredHome | 3:a72f30142261 | 20 | printf("\r\nsdwriteTest %iB write performance on %s...\r\n", sizeof(buffer), fname); |
WiredHome | 3:a72f30142261 | 21 | FileHandle* file = sd.open(fname, O_WRONLY | O_CREAT | O_TRUNC); |
WiredHome | 3:a72f30142261 | 22 | if (file != NULL) { |
WiredHome | 3:a72f30142261 | 23 | timer.start(); |
WiredHome | 3:a72f30142261 | 24 | for (int i = 0; i < (TESTSIZE / sizeof(buffer)); i++) { |
WiredHome | 3:a72f30142261 | 25 | if (file->write(buffer, sizeof(buffer)) != sizeof(buffer)) { |
WiredHome | 3:a72f30142261 | 26 | timer.stop(); |
WiredHome | 3:a72f30142261 | 27 | printf(" write error!\r\n"); |
WiredHome | 3:a72f30142261 | 28 | timer.reset(); |
WiredHome | 3:a72f30142261 | 29 | return; |
WiredHome | 3:a72f30142261 | 30 | } |
WiredHome | 3:a72f30142261 | 31 | } |
WiredHome | 3:a72f30142261 | 32 | timer.stop(); |
WiredHome | 3:a72f30142261 | 33 | if (file->close()) |
WiredHome | 3:a72f30142261 | 34 | printf(" failed to close file!\r\n"); |
WiredHome | 3:a72f30142261 | 35 | else |
WiredHome | 3:a72f30142261 | 36 | printf(" done!\r\n Result: %.2fKB/s\r\n", 1024 / (timer.read_us() / 1000000.0)); |
WiredHome | 3:a72f30142261 | 37 | timer.reset(); |
WiredHome | 3:a72f30142261 | 38 | } else { |
WiredHome | 3:a72f30142261 | 39 | printf(" failed to create file!\r\n"); |
WiredHome | 3:a72f30142261 | 40 | } |
WiredHome | 3:a72f30142261 | 41 | } |
WiredHome | 3:a72f30142261 | 42 | |
WiredHome | 3:a72f30142261 | 43 | void sdreadTest(const char * fname) |
WiredHome | 3:a72f30142261 | 44 | { |
WiredHome | 3:a72f30142261 | 45 | //Test read performance by reading the 1MB file created by writeTest() |
WiredHome | 3:a72f30142261 | 46 | printf("\r\nsdreadTest %iB read performance...\r\n", sizeof(buffer)); |
WiredHome | 3:a72f30142261 | 47 | FileHandle* file = sd.open(fname, O_RDONLY); |
WiredHome | 3:a72f30142261 | 48 | if (file != NULL) { |
WiredHome | 3:a72f30142261 | 49 | timer.start(); |
WiredHome | 3:a72f30142261 | 50 | int iterations = 0; |
WiredHome | 3:a72f30142261 | 51 | while (file->read(buffer, sizeof(buffer)) == sizeof(buffer)) |
WiredHome | 3:a72f30142261 | 52 | iterations++; |
WiredHome | 3:a72f30142261 | 53 | timer.stop(); |
WiredHome | 3:a72f30142261 | 54 | printf(" fname: %s\r\n", fname); |
WiredHome | 3:a72f30142261 | 55 | if (iterations != (TESTSIZE / sizeof(buffer))) |
WiredHome | 3:a72f30142261 | 56 | printf(" read error!\r\n"); |
WiredHome | 3:a72f30142261 | 57 | else if (file->close()) |
WiredHome | 3:a72f30142261 | 58 | printf(" failed to close file!\r\n"); |
WiredHome | 3:a72f30142261 | 59 | else if (sd.remove(fname)) |
WiredHome | 3:a72f30142261 | 60 | printf(" failed to delete file!\r\n"); |
WiredHome | 3:a72f30142261 | 61 | else |
WiredHome | 3:a72f30142261 | 62 | printf(" done!\r\n Result: %.2fKB/s\r\n", 1024 / (timer.read_us() / 1000000.0)); |
WiredHome | 3:a72f30142261 | 63 | timer.reset(); |
WiredHome | 3:a72f30142261 | 64 | } else { |
WiredHome | 3:a72f30142261 | 65 | printf(" failed to open file!\n"); |
WiredHome | 3:a72f30142261 | 66 | } |
WiredHome | 3:a72f30142261 | 67 | } |
WiredHome | 3:a72f30142261 | 68 | |
WiredHome | 3:a72f30142261 | 69 | // ==================================================== |
WiredHome | 3:a72f30142261 | 70 | |
WiredHome | 3:a72f30142261 | 71 | void writeTest2(const char * fqfname) |
WiredHome | 3:a72f30142261 | 72 | { |
WiredHome | 3:a72f30142261 | 73 | //Test write performance by creating a 1MB file |
WiredHome | 3:a72f30142261 | 74 | printf("\r\nwriteTest2 %iB write performance on %s...\r\n", sizeof(buffer), fqfname); |
WiredHome | 3:a72f30142261 | 75 | FILE * file = fopen(fqfname, "w"); |
WiredHome | 3:a72f30142261 | 76 | if (file != NULL) { |
WiredHome | 3:a72f30142261 | 77 | timer.start(); |
WiredHome | 3:a72f30142261 | 78 | for (int i = 0; i < (TESTSIZE / sizeof(buffer)); i++) { |
WiredHome | 3:a72f30142261 | 79 | if (fwrite(buffer, 1, sizeof(buffer), file) != sizeof(buffer)) { |
WiredHome | 3:a72f30142261 | 80 | timer.stop(); |
WiredHome | 3:a72f30142261 | 81 | printf(" write error!\r\n"); |
WiredHome | 3:a72f30142261 | 82 | timer.reset(); |
WiredHome | 3:a72f30142261 | 83 | return; |
WiredHome | 3:a72f30142261 | 84 | } |
WiredHome | 3:a72f30142261 | 85 | } |
WiredHome | 3:a72f30142261 | 86 | timer.stop(); |
WiredHome | 3:a72f30142261 | 87 | if (fclose(file)) |
WiredHome | 3:a72f30142261 | 88 | printf(" failed to close file!\r\n"); |
WiredHome | 3:a72f30142261 | 89 | else |
WiredHome | 3:a72f30142261 | 90 | printf(" done!\r\n Result: %.2fKB/s\r\n", 1024 / (timer.read_us() / 1000000.0)); |
WiredHome | 3:a72f30142261 | 91 | timer.reset(); |
WiredHome | 3:a72f30142261 | 92 | } else { |
WiredHome | 3:a72f30142261 | 93 | printf(" failed to create file!\r\n"); |
WiredHome | 3:a72f30142261 | 94 | } |
WiredHome | 3:a72f30142261 | 95 | } |
WiredHome | 3:a72f30142261 | 96 | |
WiredHome | 3:a72f30142261 | 97 | void readTest2(const char * fqfname) |
WiredHome | 3:a72f30142261 | 98 | { |
WiredHome | 3:a72f30142261 | 99 | //Test read performance by reading the 1MB file created by writeTest() |
WiredHome | 3:a72f30142261 | 100 | printf("\r\nreadTest2 %i B read performance on %s...\r\n", sizeof(buffer), fqfname); |
WiredHome | 3:a72f30142261 | 101 | FILE * fh = fopen(fqfname, "r"); |
WiredHome | 3:a72f30142261 | 102 | if (fh) { |
WiredHome | 3:a72f30142261 | 103 | timer.start(); |
WiredHome | 3:a72f30142261 | 104 | int iterations = 0; |
WiredHome | 3:a72f30142261 | 105 | while (fread(buffer, 1, sizeof(buffer), fh) == sizeof(buffer)) |
WiredHome | 3:a72f30142261 | 106 | iterations++; |
WiredHome | 3:a72f30142261 | 107 | timer.stop(); |
WiredHome | 3:a72f30142261 | 108 | if (iterations != (TESTSIZE / sizeof(buffer))) |
WiredHome | 3:a72f30142261 | 109 | printf(" read error! on iteration %d\r\n", iterations); |
WiredHome | 3:a72f30142261 | 110 | else if (fclose(fh)) |
WiredHome | 3:a72f30142261 | 111 | printf(" failed to close file!\r\n"); |
WiredHome | 3:a72f30142261 | 112 | else if (remove(fqfname)) |
WiredHome | 3:a72f30142261 | 113 | printf(" failed to delete file!\r\n"); |
WiredHome | 3:a72f30142261 | 114 | else |
WiredHome | 3:a72f30142261 | 115 | printf(" done!\r\n Result: %.2fKB/s\r\n", 1024 / (timer.read_us() / 1000000.0)); |
WiredHome | 3:a72f30142261 | 116 | timer.reset(); |
WiredHome | 3:a72f30142261 | 117 | } else { |
WiredHome | 3:a72f30142261 | 118 | printf(" failed to open file!\r\n"); |
WiredHome | 3:a72f30142261 | 119 | } |
WiredHome | 3:a72f30142261 | 120 | } |
WiredHome | 3:a72f30142261 | 121 | |
WiredHome | 3:a72f30142261 | 122 | |
WiredHome | 3:a72f30142261 | 123 | // ==================================================== |
WiredHome | 3:a72f30142261 | 124 | |
chris | 2:c887cf1c3ed9 | 125 | |
chris | 2:c887cf1c3ed9 | 126 | int main() |
chris | 2:c887cf1c3ed9 | 127 | { |
WiredHome | 3:a72f30142261 | 128 | printf("\r\n\r\n\r\n\r\n"); |
WiredHome | 3:a72f30142261 | 129 | printf("FileSys-Multi Test. Build " __DATE__ " " __TIME__ "\r\n"); |
WiredHome | 3:a72f30142261 | 130 | |
WiredHome | 3:a72f30142261 | 131 | //Configure CRC, large frames, and write validation |
WiredHome | 3:a72f30142261 | 132 | sd.crc(true); |
WiredHome | 3:a72f30142261 | 133 | sd.large_frames(true); |
WiredHome | 3:a72f30142261 | 134 | sd.write_validation(true); |
WiredHome | 3:a72f30142261 | 135 | |
WiredHome | 3:a72f30142261 | 136 | //Fill the buffer with random data for the write test |
WiredHome | 3:a72f30142261 | 137 | srand(time(NULL)); |
WiredHome | 3:a72f30142261 | 138 | for (int i = 0; i < sizeof(buffer); i++) |
WiredHome | 3:a72f30142261 | 139 | buffer[i] = rand(); |
WiredHome | 3:a72f30142261 | 140 | |
WiredHome | 3:a72f30142261 | 141 | bool success = false; |
WiredHome | 3:a72f30142261 | 142 | do { |
WiredHome | 3:a72f30142261 | 143 | wait(0.5); |
WiredHome | 3:a72f30142261 | 144 | |
WiredHome | 3:a72f30142261 | 145 | if (!sd.card_present()) { |
WiredHome | 3:a72f30142261 | 146 | printf("\r\nNo SD card present!\r\n"); |
WiredHome | 3:a72f30142261 | 147 | continue; |
WiredHome | 3:a72f30142261 | 148 | } |
chris | 2:c887cf1c3ed9 | 149 | |
WiredHome | 3:a72f30142261 | 150 | printf("\r\nMounting SD card...\r\n"); |
WiredHome | 3:a72f30142261 | 151 | if (sd.mount() != 0) { |
WiredHome | 3:a72f30142261 | 152 | printf("failed to mount SD!\r\n"); |
WiredHome | 3:a72f30142261 | 153 | continue; |
WiredHome | 3:a72f30142261 | 154 | } |
WiredHome | 3:a72f30142261 | 155 | printf("success!\r\n"); |
WiredHome | 3:a72f30142261 | 156 | printf("\tCard type: "); |
WiredHome | 3:a72f30142261 | 157 | SDFileSystem::CardType cardType = sd.card_type(); |
WiredHome | 3:a72f30142261 | 158 | if (cardType == SDFileSystem::CARD_NONE) |
WiredHome | 3:a72f30142261 | 159 | printf("None\r\n"); |
WiredHome | 3:a72f30142261 | 160 | else if (cardType == SDFileSystem::CARD_MMC) |
WiredHome | 3:a72f30142261 | 161 | printf("MMC\r\n"); |
WiredHome | 3:a72f30142261 | 162 | else if (cardType == SDFileSystem::CARD_SD) |
WiredHome | 3:a72f30142261 | 163 | printf("SD\r\n"); |
WiredHome | 3:a72f30142261 | 164 | else if (cardType == SDFileSystem::CARD_SDHC) |
WiredHome | 3:a72f30142261 | 165 | printf("SDHC\r\n"); |
WiredHome | 3:a72f30142261 | 166 | else |
WiredHome | 3:a72f30142261 | 167 | printf("Unknown\r\n"); |
WiredHome | 3:a72f30142261 | 168 | |
WiredHome | 3:a72f30142261 | 169 | printf("\r\nMounting FS card...\r\n"); |
WiredHome | 3:a72f30142261 | 170 | if (fs.mount() != 0) { |
WiredHome | 3:a72f30142261 | 171 | printf("failed to mount FS!\r\n"); |
WiredHome | 3:a72f30142261 | 172 | continue; |
WiredHome | 3:a72f30142261 | 173 | } |
WiredHome | 3:a72f30142261 | 174 | printf("success!\r\n"); |
chris | 2:c887cf1c3ed9 | 175 | |
WiredHome | 3:a72f30142261 | 176 | //Display the card capacity |
WiredHome | 3:a72f30142261 | 177 | printf("\tSectors: %u\r\n", sd.disk_sectors()); |
WiredHome | 3:a72f30142261 | 178 | printf("\tCapacity: %.1fMB\r\n", sd.disk_sectors() / 2048.0); |
WiredHome | 3:a72f30142261 | 179 | |
WiredHome | 3:a72f30142261 | 180 | writeTest2("/fs/fsfile1.bin"); |
WiredHome | 3:a72f30142261 | 181 | readTest2("/fs/fsfile1.bin"); |
WiredHome | 3:a72f30142261 | 182 | |
WiredHome | 3:a72f30142261 | 183 | writeTest2("/sd/sdfile1.bin"); |
WiredHome | 3:a72f30142261 | 184 | readTest2("/sd/sdfile1.bin"); |
WiredHome | 3:a72f30142261 | 185 | |
WiredHome | 3:a72f30142261 | 186 | sdwriteTest("sdfile2.bin"); |
WiredHome | 3:a72f30142261 | 187 | sdreadTest("sdfile2.bin"); |
WiredHome | 3:a72f30142261 | 188 | |
WiredHome | 3:a72f30142261 | 189 | writeTest2("/fs/fsfile2.bin"); |
WiredHome | 3:a72f30142261 | 190 | readTest2("/fs/fsfile2.bin"); |
WiredHome | 3:a72f30142261 | 191 | |
WiredHome | 3:a72f30142261 | 192 | writeTest2("/fs/fsfinal.txt"); |
WiredHome | 3:a72f30142261 | 193 | writeTest2("/sd/sdfinal.txt"); |
WiredHome | 3:a72f30142261 | 194 | |
WiredHome | 3:a72f30142261 | 195 | //Unmount the SD card |
WiredHome | 3:a72f30142261 | 196 | printf("unmounting now...\r\n"); |
WiredHome | 3:a72f30142261 | 197 | sd.unmount(); |
WiredHome | 3:a72f30142261 | 198 | fs.unmount(); |
WiredHome | 3:a72f30142261 | 199 | success = true; |
WiredHome | 3:a72f30142261 | 200 | |
WiredHome | 3:a72f30142261 | 201 | } while (!success); |
chris | 2:c887cf1c3ed9 | 202 | } |