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