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);
}
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
Code: Select all