Slow write speeds to EMMC

honrig
Posts: 2
Joined: Fri Dec 20, 2024 4:16 pm

Slow write speeds to EMMC

Postby honrig » Fri Dec 20, 2024 4:33 pm

Hello,

I`m interfacing an ESP32S3 with an EMMC (Kingston EMMC16G-MW28-01E10), and I`m getting pretty low write speeds. I`m using the arduino framework and SD_MMC/FS libraries. The relevant snippets of the code are summarized below (the whole thing is a bit long).

I`m getting a maximum write speed of 330kbps, and that is irrespective of block size. I expected to see the larger 2^n sized writes to be significantly faster than the others, but that does not seem to matter.

Because of that, I`m assuming this has to do with how the data is being stored by the FS library (partial pages being written).

Any inputs on how to speed this up are welcome.
Cheers

Code: Select all

void benchmark(){
  if(dataFile)
    dataFile->close();
  else
    dataFile = std::make_shared<File>();
  String dataPath = "/test.dat";
  
  if(dataFile)
      lockAndSendMsg("Created file object");

  lockAndSendMsg("Starting test");

  while(true){
    // uint32_t blockSize = 1;
    for(uint32_t blocksize = 1; blocksize <= 128; blocksize++){
      uint8_t buffer[blocksize * 1024];
      *dataFile = sdObj->open(dataPath.c_str(), FILE_WRITE, true);
      if(!(*dataFile)){
        lockAndSendMsg("Failed to open video file");
      return;
      }
      // lockAndSendMsg("File Opened successfully");

      uint64_t tStart = lockAndTimerRead();
      dataFile->write(buffer, blocksize * 1024);
      dataFile->flush();
      dataFile->close();
      uint64_t time = lockAndTimerRead() - tStart;
      lockAndSendMsg(String(blocksize) + "k: " + String(time) + "\tRate:" + String((float(blocksize) * 1000000/ (1024.0 * float(time)))) + " Mb/s");
      sdObj->remove(dataPath.c_str());
      vTaskDelay(1 / portTICK_PERIOD_MS);
    }
  }
}

bool startSDCard(){
  SD_MMC.setPins(SD_CLK, SD_CMD, SD_D0);
  if(!SD_MMC.begin("/sdcard", true, true, SDMMC_FREQ_HIGHSPEED, 10)){
    lockAndSendMsg("SD Card Mount Failed");
    return false;
  }else{
    lockAndSendMsg("SD Card OK");
    sdObj = &SD_MMC;
  }
  return true;
}

void benchTask(void* param){
  benchmark();      
}

void setup() {
  sleep(10); // Without this it is very difficult to debug the boot sequence
  serialInit();
  lockAndSendMsg("Start");
  sdOK = startSDCard();
  initTimer();
  BaseType_t taskCreated = xTaskCreatePinnedToCore(
        benchTask, /* Function to implement the task */
        "benchTask", /* Name of the task */
        256 * 1024,  /* Stack size in words */
        NULL,  /* Task input parameter */
        1,  /* Priority of the task */                                                                                         
        &benchTaskHdl,  /* Task handle. */
        0); /* Core where the task should run */
    lockAndSendMsg("Wifi card task creation status: " + String(taskCreated));
}



void loop(){
  vTaskDelete(NULL);
}
BlockSize: Time to write (us) Data Rate
1k: 12430 Rate:0.08 Mb/s
2k: 24123 Rate:0.08 Mb/s
3k: 18636 Rate:0.16 Mb/s
4k: 21046 Rate:0.19 Mb/s
5k: 24063 Rate:0.20 Mb/s
6k: 27242 Rate:0.22 Mb/s
7k: 29756 Rate:0.23 Mb/s
8k: 32551 Rate:0.24 Mb/s
9k: 35346 Rate:0.25 Mb/s
10k: 38597 Rate:0.25 Mb/s
11k: 49009 Rate:0.22 Mb/s
12k: 43494 Rate:0.27 Mb/s
13k: 46732 Rate:0.27 Mb/s
14k: 63880 Rate:0.21 Mb/s
15k: 52056 Rate:0.28 Mb/s
16k: 62310 Rate:0.25 Mb/s
17k: 57292 Rate:0.29 Mb/s
18k: 60130 Rate:0.29 Mb/s
19k: 62726 Rate:0.30 Mb/s
20k: 74093 Rate:0.26 Mb/s
21k: 69240 Rate:0.30 Mb/s
22k: 71706 Rate:0.30 Mb/s
23k: 83516 Rate:0.27 Mb/s
24k: 77167 Rate:0.30 Mb/s
25k: 98124 Rate:0.25 Mb/s
26k: 82512 Rate:0.31 Mb/s
27k: 85532 Rate:0.31 Mb/s
28k: 97058 Rate:0.28 Mb/s
29k: 91183 Rate:0.31 Mb/s
30k: 102909 Rate:0.28 Mb/s
31k: 96552 Rate:0.31 Mb/s
32k: 108437 Rate:0.29 Mb/s
33k: 101639 Rate:0.32 Mb/s
34k: 112858 Rate:0.29 Mb/s
35k: 106580 Rate:0.32 Mb/s
36k: 117544 Rate:0.30 Mb/s
37k: 121915 Rate:0.30 Mb/s
38k: 124616 Rate:0.30 Mb/s
39k: 128429 Rate:0.30 Mb/s
40k: 121443 Rate:0.32 Mb/s
41k: 133833 Rate:0.30 Mb/s
42k: 136382 Rate:0.30 Mb/s
43k: 130158 Rate:0.32 Mb/s
44k: 142010 Rate:0.30 Mb/s
45k: 153832 Rate:0.29 Mb/s
46k: 139013 Rate:0.32 Mb/s
47k: 149777 Rate:0.31 Mb/s
48k: 151167 Rate:0.31 Mb/s
49k: 154897 Rate:0.31 Mb/s
50k: 149423 Rate:0.33 Mb/s
51k: 161477 Rate:0.31 Mb/s
52k: 164388 Rate:0.31 Mb/s
53k: 175950 Rate:0.29 Mb/s
54k: 170065 Rate:0.31 Mb/s
55k: 172833 Rate:0.31 Mb/s
56k: 166450 Rate:0.33 Mb/s
57k: 177116 Rate:0.31 Mb/s
58k: 179136 Rate:0.32 Mb/s
59k: 182532 Rate:0.32 Mb/s
60k: 195463 Rate:0.30 Mb/s
61k: 188300 Rate:0.32 Mb/s
62k: 190910 Rate:0.32 Mb/s
63k: 194176 Rate:0.32 Mb/s
64k: 196394 Rate:0.32 Mb/s
65k: 207217 Rate:0.31 Mb/s
66k: 201806 Rate:0.32 Mb/s
67k: 205304 Rate:0.32 Mb/s
68k: 208765 Rate:0.32 Mb/s
69k: 212072 Rate:0.32 Mb/s
70k: 214541 Rate:0.32 Mb/s
71k: 226097 Rate:0.31 Mb/s
72k: 228190 Rate:0.31 Mb/s
73k: 220737 Rate:0.32 Mb/s
74k: 224819 Rate:0.32 Mb/s
75k: 228162 Rate:0.32 Mb/s
76k: 239160 Rate:0.31 Mb/s
77k: 234306 Rate:0.32 Mb/s
78k: 245723 Rate:0.31 Mb/s
79k: 238709 Rate:0.32 Mb/s
80k: 240096 Rate:0.33 Mb/s
81k: 252014 Rate:0.31 Mb/s
82k: 257237 Rate:0.31 Mb/s
83k: 250381 Rate:0.32 Mb/s
84k: 253129 Rate:0.32 Mb/s
85k: 273240 Rate:0.30 Mb/s
86k: 256026 Rate:0.33 Mb/s
87k: 259529 Rate:0.33 Mb/s
88k: 271968 Rate:0.32 Mb/s
89k: 265524 Rate:0.33 Mb/s
90k: 278377 Rate:0.32 Mb/s
91k: 280556 Rate:0.32 Mb/s
92k: 273976 Rate:0.33 Mb/s
93k: 287308 Rate:0.32 Mb/s
94k: 289300 Rate:0.32 Mb/s
95k: 293740 Rate:0.32 Mb/s
96k: 286774 Rate:0.33 Mb/s
97k: 296356 Rate:0.32 Mb/s
98k: 308330 Rate:0.31 Mb/s
99k: 304601 Rate:0.32 Mb/s
100k: 298035 Rate:0.33 Mb/s
101k: 309957 Rate:0.32 Mb/s
102k: 319191 Rate:0.31 Mb/s
103k: 305376 Rate:0.33 Mb/s
104k: 317910 Rate:0.32 Mb/s
105k: 321758 Rate:0.32 Mb/s
106k: 322060 Rate:0.32 Mb/s
107k: 322038 Rate:0.32 Mb/s
108k: 317501 Rate:0.33 Mb/s
109k: 340779 Rate:0.31 Mb/s
110k: 335379 Rate:0.32 Mb/s
111k: 336999 Rate:0.32 Mb/s
112k: 337732 Rate:0.32 Mb/s
113k: 342819 Rate:0.32 Mb/s
114k: 346055 Rate:0.32 Mb/s
115k: 349375 Rate:0.32 Mb/s
116k: 349877 Rate:0.32 Mb/s
117k: 344753 Rate:0.33 Mb/s
118k: 356996 Rate:0.32 Mb/s
119k: 369714 Rate:0.31 Mb/s
120k: 361989 Rate:0.32 Mb/s
121k: 379209 Rate:0.31 Mb/s
122k: 377331 Rate:0.32 Mb/s
123k: 369125 Rate:0.33 Mb/s
124k: 371126 Rate:0.33 Mb/s
125k: 382044 Rate:0.32 Mb/s
126k: 379954 Rate:0.32 Mb/s
127k: 379535 Rate:0.33 Mb/s
128k: 389750 Rate:0.32 Mb/s

lbernstone
Posts: 1132
Joined: Mon Jul 22, 2019 3:20 pm

Re: Slow write speeds to EMMC

Postby lbernstone » Fri Dec 27, 2024 2:05 am

There is a per-file setting for a file buffer, which will improve your file access speeds. File::setBufferSize(). The default is only 128 bytes. 4096 seems to be the standard for full-sized systems, but you can play and see what works best for you.

honrig
Posts: 2
Joined: Fri Dec 20, 2024 4:16 pm

Re: Slow write speeds to EMMC

Postby honrig » Fri Dec 27, 2024 9:33 am

Thank you @Ibernstone for the insight.

I tinkered a bit with the configuration of the EMMC, and I made some progress.

I initialize the EMMC with the "format_if_mount_failed" set as true. The first time the ESP boots, the EMMC is formatted with the default block size of 512 bytes.

By formatting the EMMC explicitly with the f_mkfs function and a block size of 4096, plus changing the buffer of the fs::File to the same size, I`m getting much better write speeds.

Code: Select all

 BlockSize: Time to write (us)              Data Rate
1k: 11184       Rate:0.09 Mb/s
2k: 11656       Rate:0.17 Mb/s
3k: 12295       Rate:0.24 Mb/s
4k: 11900       Rate:0.33 Mb/s
5k: 13587       Rate:0.36 Mb/s
6k: 14604       Rate:0.40 Mb/s
7k: 14133       Rate:0.48 Mb/s
8k: 14936       Rate:0.52 Mb/s
9k: 16601       Rate:0.53 Mb/s
10k: 16934      Rate:0.58 Mb/s
11k: 17143      Rate:0.63 Mb/s
12k: 17218      Rate:0.68 Mb/s
13k: 18788      Rate:0.68 Mb/s
14k: 19277      Rate:0.71 Mb/s
15k: 19643      Rate:0.75 Mb/s
16k: 19661      Rate:0.79 Mb/s
17k: 21087      Rate:0.79 Mb/s
18k: 21636      Rate:0.81 Mb/s
19k: 21880      Rate:0.85 Mb/s
20k: 21975      Rate:0.89 Mb/s
21k: 23463      Rate:0.87 Mb/s
22k: 23902      Rate:0.90 Mb/s
23k: 23889      Rate:0.94 Mb/s
24k: 24383      Rate:0.96 Mb/s
25k: 25751      Rate:0.95 Mb/s
26k: 26227      Rate:0.97 Mb/s
27k: 26402      Rate:1.00 Mb/s
28k: 26732      Rate:1.02 Mb/s
29k: 28254      Rate:1.00 Mb/s
30k: 37429      Rate:0.78 Mb/s
31k: 28778      Rate:1.05 Mb/s
32k: 28854      Rate:1.08 Mb/s
33k: 30455      Rate:1.06 Mb/s
34k: 30718      Rate:1.08 Mb/s
35k: 31035      Rate:1.10 Mb/s
36k: 31125      Rate:1.13 Mb/s
37k: 32929      Rate:1.10 Mb/s
38k: 33086      Rate:1.12 Mb/s
39k: 33582      Rate:1.13 Mb/s
40k: 33758      Rate:1.16 Mb/s
41k: 35109      Rate:1.14 Mb/s
42k: 35610      Rate:1.15 Mb/s
43k: 45056      Rate:0.93 Mb/s
44k: 35977      Rate:1.19 Mb/s
45k: 37576      Rate:1.17 Mb/s
46k: 37754      Rate:1.19 Mb/s
47k: 38217      Rate:1.20 Mb/s
48k: 46401      Rate:1.01 Mb/s
49k: 39975      Rate:1.20 Mb/s
50k: 40326      Rate:1.21 Mb/s
51k: 40604      Rate:1.23 Mb/s
52k: 40831      Rate:1.24 Mb/s
53k: 47899      Rate:1.08 Mb/s
54k: 42069      Rate:1.25 Mb/s
55k: 42294      Rate:1.27 Mb/s
56k: 42392      Rate:1.29 Mb/s
57k: 44101      Rate:1.26 Mb/s
58k: 44299      Rate:1.28 Mb/s
59k: 44608      Rate:1.29 Mb/s
60k: 44796      Rate:1.31 Mb/s
61k: 46499      Rate:1.28 Mb/s
62k: 54747      Rate:1.11 Mb/s
63k: 47116      Rate:1.31 Mb/s
64k: 47231      Rate:1.32 Mb/s
65k: 48711      Rate:1.30 Mb/s
66k: 49120      Rate:1.31 Mb/s
67k: 49487      Rate:1.32 Mb/s
68k: 49591      Rate:1.34 Mb/s
69k: 50968      Rate:1.32 Mb/s
70k: 60143      Rate:1.14 Mb/s
71k: 51997      Rate:1.33 Mb/s
72k: 52470      Rate:1.34 Mb/s
73k: 53822      Rate:1.32 Mb/s
74k: 54312      Rate:1.33 Mb/s
75k: 54685      Rate:1.34 Mb/s
76k: 54810      Rate:1.35 Mb/s
77k: 65349      Rate:1.15 Mb/s
78k: 56404      Rate:1.35 Mb/s
79k: 56727      Rate:1.36 Mb/s
80k: 56905      Rate:1.37 Mb/s
81k: 58645      Rate:1.35 Mb/s
82k: 58826      Rate:1.36 Mb/s
83k: 68465      Rate:1.18 Mb/s
84k: 68004      Rate:1.21 Mb/s
85k: 69835      Rate:1.19 Mb/s
86k: 61419      Rate:1.37 Mb/s
87k: 61856      Rate:1.37 Mb/s
88k: 61821      Rate:1.39 Mb/s
89k: 72892      Rate:1.19 Mb/s
90k: 63575      Rate:1.38 Mb/s
91k: 64031      Rate:1.39 Mb/s
92k: 64272      Rate:1.40 Mb/s
93k: 65580      Rate:1.38 Mb/s
94k: 75689      Rate:1.21 Mb/s
95k: 66259      Rate:1.40 Mb/s
96k: 66476      Rate:1.41 Mb/s
97k: 68213      Rate:1.39 Mb/s
98k: 68575      Rate:1.40 Mb/s
99k: 77667      Rate:1.24 Mb/s
100k: 68972     Rate:1.42 Mb/s
101k: 70369     Rate:1.40 Mb/s
102k: 70659     Rate:1.41 Mb/s
103k: 70915     Rate:1.42 Mb/s
104k: 79177     Rate:1.28 Mb/s
105k: 72170     Rate:1.42 Mb/s
106k: 72376     Rate:1.43 Mb/s
107k: 72622     Rate:1.44 Mb/s
108k: 72854     Rate:1.45 Mb/s
109k: 82611     Rate:1.29 Mb/s
110k: 75084     Rate:1.43 Mb/s
111k: 91304     Rate:1.19 Mb/s
112k: 75398     Rate:1.45 Mb/s
113k: 86264     Rate:1.28 Mb/s
114k: 85827     Rate:1.30 Mb/s
115k: 78036     Rate:1.44 Mb/s
116k: 78104     Rate:1.45 Mb/s
117k: 79835     Rate:1.43 Mb/s
118k: 88931     Rate:1.30 Mb/s
119k: 80171     Rate:1.45 Mb/s
120k: 80550     Rate:1.45 Mb/s
121k: 81897     Rate:1.44 Mb/s
122k: 91623     Rate:1.30 Mb/s
123k: 82235     Rate:1.46 Mb/s
124k: 82661     Rate:1.46 Mb/s
125k: 84291     Rate:1.45 Mb/s
126k: 94012     Rate:1.31 Mb/s
127k: 84875     Rate:1.46 Mb/s
128k: 84884     Rate:1.47 Mb/s

Who is online

Users browsing this forum: Applebot, Qwantbot and 2 guests