Speedup write to SD card with various tricks
[rmslog.git] / rmslog / main.c
index 9f52d5f789ea5e4fe76fad5468140137ba0ab3d4..d4bb6a0a5641796d2cb6fb0e14278ac58d53dd64 100644 (file)
  * console messages.
  */
 
+#define FILE_NAME          "log.txt"
+#define FILE_OVERWRITE     1
+#define FILE_PREALLOC_SIZE 102400
+
+
 #include "hw/hw_led.h"
 
 #define LOG_LEVEL      3
@@ -150,9 +155,6 @@ static void init(void)
        timer_delay(1000);
        kfile_printf(&ser.fd, "Hello, world!\r\n");
 
-#ifdef BERTOS_FAT
-       ser_init(&spi, SER_SPI);
-#else
        DDRB |= BV(PORTB0) | BV(PORTB2) | BV(PORTB3) | BV(PORTB5);
        if (!sd_raw_init())
        {
@@ -168,35 +170,36 @@ int main(void)
 {
        init();
 
-#ifdef BERTOS_FAT
+       size_t size;
+       char buf[256];
+       bool sync_pending = false;
 
-       FRESULT fat_err;
-       if ((fat_err = f_mount(0, &fs)) != FR_OK)
+       /* create file */
+       if(!fat_create_file(dd, FILE_NAME, &dir_entry))
        {
-               LOG_ERR("Error mounting FAT volume: %d\n", fat_err);
+               #if FILE_OVERWRITE
+                       fat_delete_file(fs, &dir_entry);
+                       fat_create_file(dd, FILE_NAME, &dir_entry);
+               #endif
        }
 
-       fat_err = fatfile_open(&file, "foo.txt", FA_WRITE | FA_CREATE_ALWAYS);
-       ASSERT(fat_err == FR_OK);
-
-       size_t count = kfile_write(&file.fd, "Hello, world!", strlen("Hello, world!"));
-       ASSERT(count == strlen("Hello, world!"));
+       fd = open_file_in_dir(fs, dd, FILE_NAME);
 
-#else
-
-       fat_create_file(dd, "log.txt", &dir_entry);
-       fd = open_file_in_dir(fs, dd, "log.txt");
-       int32_t offset = 0;
-       fat_seek_file(fd, &offset, FAT_SEEK_END);
+       /* preallocate file */
+       #if FILE_PREALLOC_SIZE
+       {
+               LED_ON();
+               for (int i = 0; i < (int)(FILE_PREALLOC_SIZE / sizeof(buf)); ++i)
+                       fat_write_file(fd, (void *)buf, sizeof(buf));
 
-#endif
+               int32_t offset = 0;
+               fat_seek_file(fd, &offset, FAT_SEEK_SET);
+               LED_OFF();
+       }
+       #endif
 
        while (1)
        {
-               size_t size;
-               char buf[128];
-               bool sync_pending = false;
-
                if ((size = ser_read(&ser, buf, sizeof(buf))) != 0)
                {
                        LED_ON();