RAM Disk function using Mbed os5 standard library

Please refer following my Notebook page.
/users/kenjiArai/notebook/sd-card-control-new/#

Committer:
kenjiArai
Date:
Sat May 02 03:45:31 2020 +0000
Revision:
4:6650958e6eae
Parent:
3:c31e9e43554b
updated os5. changed starting process(wait key input)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:308d4fafaafb 1 /*
kenjiArai 0:308d4fafaafb 2 * Mbed Application program
kenjiArai 0:308d4fafaafb 3 * RAM Disck function with FatFs on Mbed-os5
kenjiArai 0:308d4fafaafb 4 *
kenjiArai 4:6650958e6eae 5 * Copyright (c) 2018,'19,'20 Kenji Arai / JH1PJL
kenjiArai 4:6650958e6eae 6 * http://www7b.biglobe.ne.jp/~kenjia/
kenjiArai 0:308d4fafaafb 7 * https://os.mbed.com/users/kenjiArai/
kenjiArai 0:308d4fafaafb 8 * Created: April 7th, 2018
kenjiArai 4:6650958e6eae 9 * Revised: May 2nd, 2020
kenjiArai 0:308d4fafaafb 10 */
kenjiArai 0:308d4fafaafb 11
kenjiArai 0:308d4fafaafb 12 // Include --------------------------------------------------------------------
kenjiArai 0:308d4fafaafb 13 #include "mbed.h"
kenjiArai 0:308d4fafaafb 14 #include "FATFileSystem.h"
kenjiArai 0:308d4fafaafb 15 #include "HeapBlockDevice.h"
kenjiArai 0:308d4fafaafb 16 #include "mon.h"
kenjiArai 0:308d4fafaafb 17 #include <stdlib.h>
kenjiArai 0:308d4fafaafb 18 #include <stdio.h>
kenjiArai 0:308d4fafaafb 19 #include <errno.h>
kenjiArai 0:308d4fafaafb 20
kenjiArai 0:308d4fafaafb 21 // Definition -----------------------------------------------------------------
kenjiArai 1:58fc0cbd9a41 22 #if defined(TARGET_DISCO_F769NI) || defined(TARGET_DISCO_F746NG)
kenjiArai 0:308d4fafaafb 23 #define USER_SW_ON 1
kenjiArai 0:308d4fafaafb 24 #else
kenjiArai 0:308d4fafaafb 25 #define USER_SW_ON 0
kenjiArai 0:308d4fafaafb 26 #endif
kenjiArai 0:308d4fafaafb 27
kenjiArai 1:58fc0cbd9a41 28 #define DISK_SIZE_LIMIT (5 * 512)
kenjiArai 1:58fc0cbd9a41 29 #define RAM_DISK_SIZE_4MB (8192 * 512)
kenjiArai 1:58fc0cbd9a41 30 #define RAM_DISK_SIZE_2MB (4096 * 512)
kenjiArai 1:58fc0cbd9a41 31 #define RAM_DISK_SIZE_1MB (2048 * 512)
kenjiArai 1:58fc0cbd9a41 32 #define RAM_DISK_SIZE_512KB (1024 * 512)
kenjiArai 1:58fc0cbd9a41 33 #define RAM_DISK_SIZE_128KB (256 * 512)
kenjiArai 1:58fc0cbd9a41 34 #define RAM_DISK_SIZE_64KB (128 * 512)
kenjiArai 1:58fc0cbd9a41 35
kenjiArai 1:58fc0cbd9a41 36 #if defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) ||\
kenjiArai 1:58fc0cbd9a41 37 defined(TARGET_NUCLEO_F446RE) || defined(TARGET_NUCLEO_L476RG) ||\
kenjiArai 1:58fc0cbd9a41 38 defined(TARGET_NUCLEO_L152RE)
kenjiArai 1:58fc0cbd9a41 39 #define RAM_DISK_SIZE RAM_DISK_SIZE_64KB
kenjiArai 1:58fc0cbd9a41 40 #elif defined(TARGET_K64F) || defined(TARGET_NRF52840_DK) ||\
kenjiArai 1:58fc0cbd9a41 41 defined(TARGET_DISCO_F746NG) || defined(TARGET_DISCO_F469NI)
kenjiArai 1:58fc0cbd9a41 42 #define RAM_DISK_SIZE RAM_DISK_SIZE_128KB
kenjiArai 1:58fc0cbd9a41 43 #elif defined(TARGET_GR_LYCHEE)
kenjiArai 1:58fc0cbd9a41 44 #define RAM_DISK_SIZE RAM_DISK_SIZE_512KB
kenjiArai 1:58fc0cbd9a41 45 #elif defined(TARGET_RZ_A1H)
kenjiArai 1:58fc0cbd9a41 46 #define RAM_DISK_SIZE RAM_DISK_SIZE_2MB
kenjiArai 1:58fc0cbd9a41 47 #else
kenjiArai 2:4c2328c61af7 48 #warning "make sure disk size for your board!"
kenjiArai 1:58fc0cbd9a41 49 #define RAM_DISK_SIZE RAM_DISK_SIZE_64KB
kenjiArai 1:58fc0cbd9a41 50 #endif
kenjiArai 1:58fc0cbd9a41 51
kenjiArai 1:58fc0cbd9a41 52 #define DEBUG 0
kenjiArai 1:58fc0cbd9a41 53 #if DEBUG
kenjiArai 1:58fc0cbd9a41 54 #define DBG(...) pc.printf(__VA_ARGS__)
kenjiArai 1:58fc0cbd9a41 55 #else
kenjiArai 1:58fc0cbd9a41 56 #define DBG(...) {;}
kenjiArai 1:58fc0cbd9a41 57 #endif
kenjiArai 0:308d4fafaafb 58
kenjiArai 0:308d4fafaafb 59 // Constructor ----------------------------------------------------------------
kenjiArai 0:308d4fafaafb 60 DigitalOut led(LED1);
kenjiArai 1:58fc0cbd9a41 61 DigitalIn user_sw(BUTTON1, PullUp);
kenjiArai 0:308d4fafaafb 62 Serial pc(USBTX, USBRX, 115200);
kenjiArai 1:58fc0cbd9a41 63 HeapBlockDevice bd(RAM_DISK_SIZE, 512);
kenjiArai 0:308d4fafaafb 64 FATFileSystem fs("fs");
kenjiArai 1:58fc0cbd9a41 65 Timer tmr;
kenjiArai 0:308d4fafaafb 66
kenjiArai 0:308d4fafaafb 67 // RAM ------------------------------------------------------------------------
kenjiArai 0:308d4fafaafb 68
kenjiArai 0:308d4fafaafb 69 // ROM / Constant data --------------------------------------------------------
kenjiArai 1:58fc0cbd9a41 70 const char *const opening_msg0 = "RAM Disk (use Heap area) test program";
kenjiArai 1:58fc0cbd9a41 71 const char *const opening_msg1 = " -> run on Mbed OS-5\r\n";
kenjiArai 4:6650958e6eae 72 const char *const opening_msg2 = "microSD Card is ready for use\r\n";
kenjiArai 4:6650958e6eae 73 const char *const opening_msg3 = "Please hit any key to start!\r\n";
kenjiArai 0:308d4fafaafb 74
kenjiArai 0:308d4fafaafb 75 // Function prototypes --------------------------------------------------------
kenjiArai 0:308d4fafaafb 76 void return_error (int ret_val);
kenjiArai 0:308d4fafaafb 77 void errno_error (void* ret_val);
kenjiArai 4:6650958e6eae 78 extern void print_revision(void);
kenjiArai 4:6650958e6eae 79 extern uint32_t get_disk_freespace(void);
kenjiArai 4:6650958e6eae 80 extern uint32_t get_data_file_size(const char *const file_name);
kenjiArai 0:308d4fafaafb 81
kenjiArai 0:308d4fafaafb 82 //------------------------------------------------------------------------------
kenjiArai 0:308d4fafaafb 83 // Control Program
kenjiArai 0:308d4fafaafb 84 //------------------------------------------------------------------------------
kenjiArai 0:308d4fafaafb 85 int main()
kenjiArai 0:308d4fafaafb 86 {
kenjiArai 0:308d4fafaafb 87 time_t seconds;
kenjiArai 0:308d4fafaafb 88 uint32_t data0 = 10000U;
kenjiArai 0:308d4fafaafb 89 uint32_t data1 = 20000U;
kenjiArai 0:308d4fafaafb 90 uint32_t data2 = 30000U;
kenjiArai 0:308d4fafaafb 91 uint32_t data3 = 40000U;
kenjiArai 0:308d4fafaafb 92 uint32_t data4 = 50000U;
kenjiArai 0:308d4fafaafb 93 uint32_t data5 = 60000U;
kenjiArai 0:308d4fafaafb 94
kenjiArai 4:6650958e6eae 95 pc.printf("\r\n\r\n");
kenjiArai 4:6650958e6eae 96 print_revision();
kenjiArai 1:58fc0cbd9a41 97 DBG("line:%d\r\n", __LINE__);
kenjiArai 0:308d4fafaafb 98 pc.printf("\r\nStart\r\n");
kenjiArai 0:308d4fafaafb 99 int error = 0;
kenjiArai 0:308d4fafaafb 100 pc.printf("Welcome to the filesystem example.\r\n");
kenjiArai 0:308d4fafaafb 101 pc.printf("Formatting a FAT, RAM-backed filesystem.\r\n");
kenjiArai 0:308d4fafaafb 102 error = FATFileSystem::format(&bd);
kenjiArai 0:308d4fafaafb 103 return_error(error);
kenjiArai 0:308d4fafaafb 104 pc.printf("Mounting the filesystem on \"/fs\". \r\n");
kenjiArai 0:308d4fafaafb 105 error = fs.mount(&bd);
kenjiArai 0:308d4fafaafb 106 return_error(error);
kenjiArai 0:308d4fafaafb 107
kenjiArai 0:308d4fafaafb 108 FILE* fp = fopen("/fs/mydata.txt", "a");
kenjiArai 0:308d4fafaafb 109 errno_error(fp);
kenjiArai 0:308d4fafaafb 110 if (fp != 0) {
kenjiArai 0:308d4fafaafb 111 pc.printf("%s%s", opening_msg0, opening_msg1);
kenjiArai 0:308d4fafaafb 112 fprintf(fp,"%s%s", opening_msg0, opening_msg1);
kenjiArai 4:6650958e6eae 113 pc.printf("%s", opening_msg2);
kenjiArai 3:c31e9e43554b 114 fclose(fp);
kenjiArai 0:308d4fafaafb 115 } else {
kenjiArai 0:308d4fafaafb 116 pc.printf("ERROR\r\n");
kenjiArai 0:308d4fafaafb 117 }
kenjiArai 4:6650958e6eae 118 pc.printf("%s", opening_msg3);
kenjiArai 4:6650958e6eae 119 while (pc.readable() == 0) { ;}
kenjiArai 4:6650958e6eae 120 char c = pc.getc(); // dummy read
kenjiArai 0:308d4fafaafb 121 while (true) {
kenjiArai 1:58fc0cbd9a41 122 DBG("line:%3d\r\n", __LINE__);
kenjiArai 1:58fc0cbd9a41 123 tmr.reset();
kenjiArai 1:58fc0cbd9a41 124 tmr.start();
kenjiArai 1:58fc0cbd9a41 125 uint32_t size_disk = get_disk_freespace();
kenjiArai 1:58fc0cbd9a41 126 uint32_t size_file = get_data_file_size("mydata.txt");
kenjiArai 1:58fc0cbd9a41 127 pc.printf("free disk:%8u, file:%8u ", size_disk, size_file);
kenjiArai 0:308d4fafaafb 128 fp = fopen("/fs/mydata.txt", "a");
kenjiArai 1:58fc0cbd9a41 129 if (size_disk <= DISK_SIZE_LIMIT) {
kenjiArai 0:308d4fafaafb 130 pc.printf("Reached RAM Disk size limitation!!\r\n");
kenjiArai 0:308d4fafaafb 131 break;
kenjiArai 0:308d4fafaafb 132 }
kenjiArai 1:58fc0cbd9a41 133 DBG("line:%3d\r\n", __LINE__);
kenjiArai 0:308d4fafaafb 134 if(fp != 0) {
kenjiArai 0:308d4fafaafb 135 char tmp[64];
kenjiArai 1:58fc0cbd9a41 136 DBG("line:%d\r\n", __LINE__);
kenjiArai 0:308d4fafaafb 137 seconds = time(NULL);
kenjiArai 0:308d4fafaafb 138 strftime(tmp, 64, "DATE %H:%M:%S,%Y/%m/%d,", localtime(&seconds));
kenjiArai 1:58fc0cbd9a41 139 pc.printf("%s", tmp);
kenjiArai 0:308d4fafaafb 140 fprintf(fp, "%s", tmp);
kenjiArai 0:308d4fafaafb 141 pc.printf("%08d;%08d;%08d;%08d;%08d;%08d\r\n",
kenjiArai 0:308d4fafaafb 142 ++data0, ++data1, ++data2, ++data3, ++data4, ++data5);
kenjiArai 0:308d4fafaafb 143 fprintf(fp, "%08d;%08d;%08d;%08d;%08d;%08d\r\n",
kenjiArai 0:308d4fafaafb 144 data0, data1, data2, data3, data4, data5);
kenjiArai 3:c31e9e43554b 145 fclose(fp);
kenjiArai 0:308d4fafaafb 146 } else {
kenjiArai 0:308d4fafaafb 147 pc.printf("ERROR\r\n");
kenjiArai 0:308d4fafaafb 148 }
kenjiArai 1:58fc0cbd9a41 149 uint32_t time_sd = tmr.read_ms();
kenjiArai 1:58fc0cbd9a41 150 pc.printf("time[ms]:%3d ,", time_sd);
kenjiArai 2:4c2328c61af7 151 ThisThread::sleep_for(20);
kenjiArai 0:308d4fafaafb 152 if (user_sw == USER_SW_ON) {
kenjiArai 0:308d4fafaafb 153 break;
kenjiArai 0:308d4fafaafb 154 }
kenjiArai 0:308d4fafaafb 155 if (pc.readable()) {
kenjiArai 0:308d4fafaafb 156 mon();
kenjiArai 0:308d4fafaafb 157 }
kenjiArai 0:308d4fafaafb 158 led = !led;
kenjiArai 0:308d4fafaafb 159 }
kenjiArai 0:308d4fafaafb 160 while(true) {
kenjiArai 0:308d4fafaafb 161 mon();
kenjiArai 2:4c2328c61af7 162 system_reset();
kenjiArai 0:308d4fafaafb 163 }
kenjiArai 0:308d4fafaafb 164 }
kenjiArai 0:308d4fafaafb 165
kenjiArai 0:308d4fafaafb 166 void return_error (int ret_val)
kenjiArai 0:308d4fafaafb 167 {
kenjiArai 0:308d4fafaafb 168 if (ret_val) {
kenjiArai 0:308d4fafaafb 169 pc.printf("retrun error/Failure. %d\r\n", ret_val);
kenjiArai 0:308d4fafaafb 170 }
kenjiArai 0:308d4fafaafb 171 }
kenjiArai 0:308d4fafaafb 172
kenjiArai 0:308d4fafaafb 173 void errno_error (void* ret_val)
kenjiArai 0:308d4fafaafb 174 {
kenjiArai 0:308d4fafaafb 175 if (ret_val == NULL) {
kenjiArai 0:308d4fafaafb 176 pc.printf("error #/Failure. %d \r\n", errno);
kenjiArai 0:308d4fafaafb 177 }
kenjiArai 0:308d4fafaafb 178 }