example FatFS, LittleFileSystem, BlockDevice

Committer:
romanstrizhev
Date:
Sat Jan 22 18:01:37 2022 +0000
Revision:
0:08256a8320ed
FatFS example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
romanstrizhev 0:08256a8320ed 1 /* Licensed under the Apache License, Version 2.0 (the "License");
romanstrizhev 0:08256a8320ed 2 * you may not use this file except in compliance with the License.
romanstrizhev 0:08256a8320ed 3 * You may obtain a copy of the License at
romanstrizhev 0:08256a8320ed 4 *
romanstrizhev 0:08256a8320ed 5 * http://www.apache.org/licenses/LICENSE-2.0
romanstrizhev 0:08256a8320ed 6 *
romanstrizhev 0:08256a8320ed 7 * Unless required by applicable law or agreed to in writing, software
romanstrizhev 0:08256a8320ed 8 * distributed under the License is distributed on an "AS IS" BASIS,
romanstrizhev 0:08256a8320ed 9 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
romanstrizhev 0:08256a8320ed 10 * See the License for the specific language governing permissions and
romanstrizhev 0:08256a8320ed 11 * limitations under the License.
romanstrizhev 0:08256a8320ed 12 */
romanstrizhev 0:08256a8320ed 13 // https://github.com/ARMmbed/mbed-os-example-filesystem/blob/master/main.cpp
romanstrizhev 0:08256a8320ed 14 // LittleFileSystem OK!
romanstrizhev 0:08256a8320ed 15 // FATFileSystem OK!
romanstrizhev 0:08256a8320ed 16
romanstrizhev 0:08256a8320ed 17 #include "mbed.h"
romanstrizhev 0:08256a8320ed 18 #include <stdio.h>
romanstrizhev 0:08256a8320ed 19 #include <errno.h>
romanstrizhev 0:08256a8320ed 20 #include <functional>
romanstrizhev 0:08256a8320ed 21 #include "BlockDevice.h"
romanstrizhev 0:08256a8320ed 22
romanstrizhev 0:08256a8320ed 23 // Maximum number of elements in buffer
romanstrizhev 0:08256a8320ed 24 #define BUFFER_MAX_LEN 10
romanstrizhev 0:08256a8320ed 25 #define FORCE_REFORMAT true
romanstrizhev 0:08256a8320ed 26 // This will take the system's default block device
romanstrizhev 0:08256a8320ed 27 BlockDevice *bd = BlockDevice::get_default_instance();// OK
romanstrizhev 0:08256a8320ed 28
romanstrizhev 0:08256a8320ed 29 // Можно создать файловую систему в ОЗУ(куча, heap)
romanstrizhev 0:08256a8320ed 30 // Instead of the default block device, you can define your own block device.
romanstrizhev 0:08256a8320ed 31 // For example: HeapBlockDevice with size of 2048 bytes, read size 1, write size 1 and erase size 512.
romanstrizhev 0:08256a8320ed 32 //#include "HeapBlockDevice.h"
romanstrizhev 0:08256a8320ed 33 //BlockDevice *bd = new HeapBlockDevice(2048, 1, 1, 512);//OK! создает, но 2048 будет мало для эксперимента
romanstrizhev 0:08256a8320ed 34 //BlockDevice *bd = new HeapBlockDevice(1024*72, 1, 1, 512);//32kByte хватает для создания небольшой ФС в ОЗУ! (LittleFS, для FATFS - мало, 72kB - OK )
romanstrizhev 0:08256a8320ed 35
romanstrizhev 0:08256a8320ed 36 // This example uses LittleFileSystem as the default file system
romanstrizhev 0:08256a8320ed 37 //#include "LittleFileSystem.h"
romanstrizhev 0:08256a8320ed 38 //LittleFileSystem fs("fs");// OK!!
romanstrizhev 0:08256a8320ed 39
romanstrizhev 0:08256a8320ed 40 // Uncomment the following two lines and comment the previous two to use FAT file system.
romanstrizhev 0:08256a8320ed 41 #include "FATFileSystem.h"
romanstrizhev 0:08256a8320ed 42 FATFileSystem fs("fs");
romanstrizhev 0:08256a8320ed 43
romanstrizhev 0:08256a8320ed 44 // Set up the button to trigger an erase
romanstrizhev 0:08256a8320ed 45 InterruptIn irq(BUTTON1);//OK повесим прерывание на пользовательскую кнопку
romanstrizhev 0:08256a8320ed 46 void erase() {
romanstrizhev 0:08256a8320ed 47 printf("Initializing the block device... ");
romanstrizhev 0:08256a8320ed 48 fflush(stdout);
romanstrizhev 0:08256a8320ed 49 int err = bd->init();
romanstrizhev 0:08256a8320ed 50 printf("%s\n", (err ? "Fail :(" : "OK"));
romanstrizhev 0:08256a8320ed 51 if (err) {
romanstrizhev 0:08256a8320ed 52 error("error: %s (%d)\n", strerror(-err), err);
romanstrizhev 0:08256a8320ed 53 }
romanstrizhev 0:08256a8320ed 54
romanstrizhev 0:08256a8320ed 55 printf("Erasing the block device... ");
romanstrizhev 0:08256a8320ed 56 fflush(stdout);
romanstrizhev 0:08256a8320ed 57 err = bd->erase(0, bd->size());
romanstrizhev 0:08256a8320ed 58 printf("%s\n", (err ? "Fail :(" : "OK"));
romanstrizhev 0:08256a8320ed 59 if (err) {
romanstrizhev 0:08256a8320ed 60 error("error: %s (%d)\n", strerror(-err), err);
romanstrizhev 0:08256a8320ed 61 }
romanstrizhev 0:08256a8320ed 62
romanstrizhev 0:08256a8320ed 63 printf("Deinitializing the block device... ");
romanstrizhev 0:08256a8320ed 64 fflush(stdout);
romanstrizhev 0:08256a8320ed 65 err = bd->deinit();
romanstrizhev 0:08256a8320ed 66 printf("%s\n", (err ? "Fail :(" : "OK"));
romanstrizhev 0:08256a8320ed 67 if (err) {
romanstrizhev 0:08256a8320ed 68 error("error: %s (%d)\n", strerror(-err), err);
romanstrizhev 0:08256a8320ed 69 }
romanstrizhev 0:08256a8320ed 70 }
romanstrizhev 0:08256a8320ed 71
romanstrizhev 0:08256a8320ed 72 static auto erase_event = mbed_event_queue()->make_user_allocated_event(erase);//OK
romanstrizhev 0:08256a8320ed 73
romanstrizhev 0:08256a8320ed 74
romanstrizhev 0:08256a8320ed 75 DigitalOut led(LED1);
romanstrizhev 0:08256a8320ed 76
romanstrizhev 0:08256a8320ed 77 #define WAIT_MS 1000
romanstrizhev 0:08256a8320ed 78 void wait(int ms){
romanstrizhev 0:08256a8320ed 79 wait_us(ms*WAIT_MS);
romanstrizhev 0:08256a8320ed 80 }
romanstrizhev 0:08256a8320ed 81
romanstrizhev 0:08256a8320ed 82 int main()
romanstrizhev 0:08256a8320ed 83 {
romanstrizhev 0:08256a8320ed 84 printf("START_default_1\n");
romanstrizhev 0:08256a8320ed 85 //========================================================================================//
romanstrizhev 0:08256a8320ed 86 printf("--- Mbed OS filesystem example ---\n");
romanstrizhev 0:08256a8320ed 87
romanstrizhev 0:08256a8320ed 88 // Setup the erase event on button press, use the event queue
romanstrizhev 0:08256a8320ed 89 // to avoid running in interrupt context
romanstrizhev 0:08256a8320ed 90 irq.fall(std::ref(erase_event));
romanstrizhev 0:08256a8320ed 91
romanstrizhev 0:08256a8320ed 92 // Try to mount the filesystem
romanstrizhev 0:08256a8320ed 93 printf("Mounting the filesystem... ");
romanstrizhev 0:08256a8320ed 94 fflush(stdout);
romanstrizhev 0:08256a8320ed 95 int err = fs.mount(bd);
romanstrizhev 0:08256a8320ed 96 printf("%s\n", (err ? "Fail :(" : "OK"));
romanstrizhev 0:08256a8320ed 97 if (err || FORCE_REFORMAT) {
romanstrizhev 0:08256a8320ed 98 // Reformat if we can't mount the filesystem
romanstrizhev 0:08256a8320ed 99 printf("No filesystem found, formatting... ");
romanstrizhev 0:08256a8320ed 100 fflush(stdout);
romanstrizhev 0:08256a8320ed 101 err = fs.reformat(bd);
romanstrizhev 0:08256a8320ed 102 printf("%s\n", (err ? "Fail :(" : "OK"));
romanstrizhev 0:08256a8320ed 103 if (err) {
romanstrizhev 0:08256a8320ed 104 error("error: %s (%d)\n", strerror(-err), err);
romanstrizhev 0:08256a8320ed 105 }
romanstrizhev 0:08256a8320ed 106 }
romanstrizhev 0:08256a8320ed 107
romanstrizhev 0:08256a8320ed 108 // Open the numbers file
romanstrizhev 0:08256a8320ed 109 printf("Opening \"/fs/numbers.txt\"... ");
romanstrizhev 0:08256a8320ed 110 fflush(stdout);
romanstrizhev 0:08256a8320ed 111 FILE *f = fopen("/fs/numbers.txt", "r+");
romanstrizhev 0:08256a8320ed 112 printf("%s\n", (!f ? "Fail :(" : "OK"));
romanstrizhev 0:08256a8320ed 113 if (!f) {
romanstrizhev 0:08256a8320ed 114 // Create the numbers file if it doesn't exist
romanstrizhev 0:08256a8320ed 115 printf("No file found, creating a new file... ");
romanstrizhev 0:08256a8320ed 116 fflush(stdout);
romanstrizhev 0:08256a8320ed 117 f = fopen("/fs/numbers.txt", "w+");
romanstrizhev 0:08256a8320ed 118 printf("%s\n", (!f ? "Fail :(" : "OK"));
romanstrizhev 0:08256a8320ed 119 if (!f) {
romanstrizhev 0:08256a8320ed 120 error("error: %s (%d)\n", strerror(errno), -errno);
romanstrizhev 0:08256a8320ed 121 }
romanstrizhev 0:08256a8320ed 122
romanstrizhev 0:08256a8320ed 123 for (int i = 0; i < 10; i++) {
romanstrizhev 0:08256a8320ed 124 printf("\rWriting numbers (%d/%d)... ", i, 10);
romanstrizhev 0:08256a8320ed 125 fflush(stdout);
romanstrizhev 0:08256a8320ed 126 err = fprintf(f, " %d\n", i);
romanstrizhev 0:08256a8320ed 127 if (err < 0) {
romanstrizhev 0:08256a8320ed 128 printf("Fail :(\n");
romanstrizhev 0:08256a8320ed 129 error("error: %s (%d)\n", strerror(errno), -errno);
romanstrizhev 0:08256a8320ed 130 }
romanstrizhev 0:08256a8320ed 131 }
romanstrizhev 0:08256a8320ed 132 printf("\rWriting numbers (%d/%d)... OK\n", 10, 10);
romanstrizhev 0:08256a8320ed 133
romanstrizhev 0:08256a8320ed 134 printf("Seeking file... ");
romanstrizhev 0:08256a8320ed 135 fflush(stdout);
romanstrizhev 0:08256a8320ed 136 err = fseek(f, 0, SEEK_SET);
romanstrizhev 0:08256a8320ed 137 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
romanstrizhev 0:08256a8320ed 138 if (err < 0) {
romanstrizhev 0:08256a8320ed 139 error("error: %s (%d)\n", strerror(errno), -errno);
romanstrizhev 0:08256a8320ed 140 }
romanstrizhev 0:08256a8320ed 141 }
romanstrizhev 0:08256a8320ed 142
romanstrizhev 0:08256a8320ed 143 // Go through and increment the numbers
romanstrizhev 0:08256a8320ed 144 for (int i = 0; i < 10; i++) {
romanstrizhev 0:08256a8320ed 145 printf("\rIncrementing numbers (%d/%d)... ", i, 10);
romanstrizhev 0:08256a8320ed 146 fflush(stdout);
romanstrizhev 0:08256a8320ed 147
romanstrizhev 0:08256a8320ed 148 // Get current stream position
romanstrizhev 0:08256a8320ed 149 long pos = ftell(f);
romanstrizhev 0:08256a8320ed 150
romanstrizhev 0:08256a8320ed 151 // Parse out the number and increment
romanstrizhev 0:08256a8320ed 152 char buf[BUFFER_MAX_LEN];
romanstrizhev 0:08256a8320ed 153 if (!fgets(buf, BUFFER_MAX_LEN, f)) {
romanstrizhev 0:08256a8320ed 154 error("error: %s (%d)\n", strerror(errno), -errno);
romanstrizhev 0:08256a8320ed 155 }
romanstrizhev 0:08256a8320ed 156 char *endptr;
romanstrizhev 0:08256a8320ed 157 int32_t number = strtol(buf, &endptr, 10);
romanstrizhev 0:08256a8320ed 158 if (
romanstrizhev 0:08256a8320ed 159 (errno == ERANGE) || // The number is too small/large
romanstrizhev 0:08256a8320ed 160 (endptr == buf) || // No character was read
romanstrizhev 0:08256a8320ed 161 (*endptr && *endptr != '\n') // The whole input was not converted
romanstrizhev 0:08256a8320ed 162 ) {
romanstrizhev 0:08256a8320ed 163 continue;
romanstrizhev 0:08256a8320ed 164 }
romanstrizhev 0:08256a8320ed 165 number += 1;
romanstrizhev 0:08256a8320ed 166
romanstrizhev 0:08256a8320ed 167 // Seek to beginning of number
romanstrizhev 0:08256a8320ed 168 fseek(f, pos, SEEK_SET);
romanstrizhev 0:08256a8320ed 169
romanstrizhev 0:08256a8320ed 170 // Store number
romanstrizhev 0:08256a8320ed 171 fprintf(f, " %d\n", number);
romanstrizhev 0:08256a8320ed 172
romanstrizhev 0:08256a8320ed 173 // Flush between write and read on same file
romanstrizhev 0:08256a8320ed 174 fflush(f);
romanstrizhev 0:08256a8320ed 175 }
romanstrizhev 0:08256a8320ed 176 printf("\rIncrementing numbers (%d/%d)... OK\n", 10, 10);
romanstrizhev 0:08256a8320ed 177
romanstrizhev 0:08256a8320ed 178 // Close the file which also flushes any cached writes
romanstrizhev 0:08256a8320ed 179 printf("Closing \"/fs/numbers.txt\"... ");
romanstrizhev 0:08256a8320ed 180 fflush(stdout);
romanstrizhev 0:08256a8320ed 181 err = fclose(f);
romanstrizhev 0:08256a8320ed 182 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
romanstrizhev 0:08256a8320ed 183 if (err < 0) {
romanstrizhev 0:08256a8320ed 184 error("error: %s (%d)\n", strerror(errno), -errno);
romanstrizhev 0:08256a8320ed 185 }
romanstrizhev 0:08256a8320ed 186
romanstrizhev 0:08256a8320ed 187 // Display the root directory
romanstrizhev 0:08256a8320ed 188 printf("Opening the root directory... ");
romanstrizhev 0:08256a8320ed 189 fflush(stdout);
romanstrizhev 0:08256a8320ed 190 DIR *d = opendir("/fs/");
romanstrizhev 0:08256a8320ed 191 printf("%s\n", (!d ? "Fail :(" : "OK"));
romanstrizhev 0:08256a8320ed 192 if (!d) {
romanstrizhev 0:08256a8320ed 193 error("error: %s (%d)\n", strerror(errno), -errno);
romanstrizhev 0:08256a8320ed 194 }
romanstrizhev 0:08256a8320ed 195
romanstrizhev 0:08256a8320ed 196 printf("root directory:\n");
romanstrizhev 0:08256a8320ed 197 while (true) {
romanstrizhev 0:08256a8320ed 198 struct dirent *e = readdir(d);
romanstrizhev 0:08256a8320ed 199 if (!e) {
romanstrizhev 0:08256a8320ed 200 break;
romanstrizhev 0:08256a8320ed 201 }
romanstrizhev 0:08256a8320ed 202
romanstrizhev 0:08256a8320ed 203 printf(" %s\n", e->d_name);
romanstrizhev 0:08256a8320ed 204 }
romanstrizhev 0:08256a8320ed 205
romanstrizhev 0:08256a8320ed 206 printf("Closing the root directory... ");
romanstrizhev 0:08256a8320ed 207 fflush(stdout);
romanstrizhev 0:08256a8320ed 208 err = closedir(d);
romanstrizhev 0:08256a8320ed 209 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
romanstrizhev 0:08256a8320ed 210 if (err < 0) {
romanstrizhev 0:08256a8320ed 211 error("error: %s (%d)\n", strerror(errno), -errno);
romanstrizhev 0:08256a8320ed 212 }
romanstrizhev 0:08256a8320ed 213
romanstrizhev 0:08256a8320ed 214 // Display the numbers file
romanstrizhev 0:08256a8320ed 215 printf("Opening \"/fs/numbers.txt\"... ");
romanstrizhev 0:08256a8320ed 216 fflush(stdout);
romanstrizhev 0:08256a8320ed 217 f = fopen("/fs/numbers.txt", "r");
romanstrizhev 0:08256a8320ed 218 printf("%s\n", (!f ? "Fail :(" : "OK"));
romanstrizhev 0:08256a8320ed 219 if (!f) {
romanstrizhev 0:08256a8320ed 220 error("error: %s (%d)\n", strerror(errno), -errno);
romanstrizhev 0:08256a8320ed 221 }
romanstrizhev 0:08256a8320ed 222
romanstrizhev 0:08256a8320ed 223 printf("numbers:\n");
romanstrizhev 0:08256a8320ed 224 while (!feof(f)) {
romanstrizhev 0:08256a8320ed 225 int c = fgetc(f);
romanstrizhev 0:08256a8320ed 226 printf("%c", c);
romanstrizhev 0:08256a8320ed 227 }
romanstrizhev 0:08256a8320ed 228
romanstrizhev 0:08256a8320ed 229 printf("\rClosing \"/fs/numbers.txt\"... ");
romanstrizhev 0:08256a8320ed 230 fflush(stdout);
romanstrizhev 0:08256a8320ed 231 err = fclose(f);
romanstrizhev 0:08256a8320ed 232 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
romanstrizhev 0:08256a8320ed 233 if (err < 0) {
romanstrizhev 0:08256a8320ed 234 error("error: %s (%d)\n", strerror(errno), -errno);
romanstrizhev 0:08256a8320ed 235 }
romanstrizhev 0:08256a8320ed 236
romanstrizhev 0:08256a8320ed 237 // Tidy up
romanstrizhev 0:08256a8320ed 238 printf("Unmounting... ");
romanstrizhev 0:08256a8320ed 239 fflush(stdout);
romanstrizhev 0:08256a8320ed 240 err = fs.unmount();
romanstrizhev 0:08256a8320ed 241 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
romanstrizhev 0:08256a8320ed 242 if (err < 0) {
romanstrizhev 0:08256a8320ed 243 error("error: %s (%d)\n", strerror(-err), err);
romanstrizhev 0:08256a8320ed 244 }
romanstrizhev 0:08256a8320ed 245
romanstrizhev 0:08256a8320ed 246 printf("Mbed OS filesystem example done!\n");
romanstrizhev 0:08256a8320ed 247
romanstrizhev 0:08256a8320ed 248 //========================================================================================//
romanstrizhev 0:08256a8320ed 249 while(1) {
romanstrizhev 0:08256a8320ed 250 // моргаем встроенным светодиодом
romanstrizhev 0:08256a8320ed 251 led = !led;
romanstrizhev 0:08256a8320ed 252 wait(100);
romanstrizhev 0:08256a8320ed 253 }
romanstrizhev 0:08256a8320ed 254 }
romanstrizhev 0:08256a8320ed 255