Program to benchmark the speed of the different file system options versus placing data directly into arrays.

Dependencies:   DMBasicGUI DMSupport

This program is used to measure the performance of the different file system options on the LPC4088 Display Module.

The performance wiki page and more specifically the software part describes this program and the output.

As the program doesn't use the display at all it can be used on both the 4.3" and 5" display modules.

Committer:
alindvall
Date:
Wed Mar 11 15:33:03 2015 +0000
Revision:
0:b77503796c51
Child:
1:b000ac168e46
First version (missing image files)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alindvall 0:b77503796c51 1 /*
alindvall 0:b77503796c51 2 * Copyright 2015 Embedded Artists AB
alindvall 0:b77503796c51 3 *
alindvall 0:b77503796c51 4 * Licensed under the Apache License, Version 2.0 (the "License");
alindvall 0:b77503796c51 5 * you may not use this file except in compliance with the License.
alindvall 0:b77503796c51 6 * You may obtain a copy of the License at
alindvall 0:b77503796c51 7 *
alindvall 0:b77503796c51 8 * http://www.apache.org/licenses/LICENSE-2.0
alindvall 0:b77503796c51 9 *
alindvall 0:b77503796c51 10 * Unless required by applicable law or agreed to in writing, software
alindvall 0:b77503796c51 11 * distributed under the License is distributed on an "AS IS" BASIS,
alindvall 0:b77503796c51 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
alindvall 0:b77503796c51 13 * See the License for the specific language governing permissions and
alindvall 0:b77503796c51 14 * limitations under the License.
alindvall 0:b77503796c51 15 */
alindvall 0:b77503796c51 16
alindvall 0:b77503796c51 17 #include "mbed.h"
alindvall 0:b77503796c51 18 #include "DMBoard.h"
alindvall 0:b77503796c51 19 #include "MCIFileSystem.h"
alindvall 0:b77503796c51 20 #include "QSPIFileSystem.h"
alindvall 0:b77503796c51 21 #include "USBHostMSD.h"
alindvall 0:b77503796c51 22 #include "image_data.h"
alindvall 0:b77503796c51 23 #include "image_data_qspi.h"
alindvall 0:b77503796c51 24
alindvall 0:b77503796c51 25 /******************************************************************************
alindvall 0:b77503796c51 26 * Defines and typedefs
alindvall 0:b77503796c51 27 *****************************************************************************/
alindvall 0:b77503796c51 28
alindvall 0:b77503796c51 29 typedef struct {
alindvall 0:b77503796c51 30 uint32_t size;
alindvall 0:b77503796c51 31 const char* fname;
alindvall 0:b77503796c51 32 const uint8_t* iflash_direct;
alindvall 0:b77503796c51 33 const uint8_t* qspi_direct;
alindvall 0:b77503796c51 34 } bench_input_t;
alindvall 0:b77503796c51 35
alindvall 0:b77503796c51 36 #define NUM_BENCHMARKS (sizeof(BENCHMARK_INPUT)/sizeof(BENCHMARK_INPUT[0]))
alindvall 0:b77503796c51 37
alindvall 0:b77503796c51 38 #define COPYBUF_SIZE (10*1024*1024)
alindvall 0:b77503796c51 39
alindvall 0:b77503796c51 40 #define USBH_CONNECTION_EVENT (1)
alindvall 0:b77503796c51 41
alindvall 0:b77503796c51 42 #define QSPIFS_SIZE_MB (8)
alindvall 0:b77503796c51 43 #define QSPIFS_SIZE (QSPIFS_SIZE_MB * 1024*1024)
alindvall 0:b77503796c51 44
alindvall 0:b77503796c51 45 /******************************************************************************
alindvall 0:b77503796c51 46 * Local variables
alindvall 0:b77503796c51 47 *****************************************************************************/
alindvall 0:b77503796c51 48
alindvall 0:b77503796c51 49 static bench_input_t BENCHMARK_INPUT[] = {
alindvall 0:b77503796c51 50 {
alindvall 0:b77503796c51 51 .size = img_size_bench_600,
alindvall 0:b77503796c51 52 .fname = "bench_600.bmp",
alindvall 0:b77503796c51 53 .iflash_direct = img_bench_600,
alindvall 0:b77503796c51 54 .qspi_direct = qimg_bench_600,
alindvall 0:b77503796c51 55 },
alindvall 0:b77503796c51 56 {
alindvall 0:b77503796c51 57 .size = img_size_bench_10k,
alindvall 0:b77503796c51 58 .fname = "bench_10k.bmp",
alindvall 0:b77503796c51 59 .iflash_direct = img_bench_10k,
alindvall 0:b77503796c51 60 .qspi_direct = qimg_bench_10k,
alindvall 0:b77503796c51 61 },
alindvall 0:b77503796c51 62 {
alindvall 0:b77503796c51 63 .size = img_size_bench_100k,
alindvall 0:b77503796c51 64 .fname = "bench_100k.bmp",
alindvall 0:b77503796c51 65 .iflash_direct = img_bench_100k,
alindvall 0:b77503796c51 66 .qspi_direct = qimg_bench_100k,
alindvall 0:b77503796c51 67 },
alindvall 0:b77503796c51 68 {
alindvall 0:b77503796c51 69 .size = qimg_size_bench_350k,
alindvall 0:b77503796c51 70 .fname = "bench_350k.bmp",
alindvall 0:b77503796c51 71 .iflash_direct = NULL,
alindvall 0:b77503796c51 72 .qspi_direct = qimg_bench_350k,
alindvall 0:b77503796c51 73 },
alindvall 0:b77503796c51 74 {
alindvall 0:b77503796c51 75 .size = qimg_size_bench_1m,
alindvall 0:b77503796c51 76 .fname = "bench_1m.bmp",
alindvall 0:b77503796c51 77 .iflash_direct = NULL,
alindvall 0:b77503796c51 78 .qspi_direct = qimg_bench_1m,
alindvall 0:b77503796c51 79 },
alindvall 0:b77503796c51 80 {
alindvall 0:b77503796c51 81 .size = qimg_size_bench_4m,
alindvall 0:b77503796c51 82 .fname = "bench_4m.bmp",
alindvall 0:b77503796c51 83 .iflash_direct = NULL,
alindvall 0:b77503796c51 84 .qspi_direct = qimg_bench_4m,
alindvall 0:b77503796c51 85 },
alindvall 0:b77503796c51 86 };
alindvall 0:b77503796c51 87
alindvall 0:b77503796c51 88 static MCIFileSystem* mcifs;
alindvall 0:b77503796c51 89 static QSPIFileSystem* qspifs;
alindvall 0:b77503796c51 90 static USBHostMSD* usbmsd;
alindvall 0:b77503796c51 91
alindvall 0:b77503796c51 92 /******************************************************************************
alindvall 0:b77503796c51 93 * Private Functions
alindvall 0:b77503796c51 94 *****************************************************************************/
alindvall 0:b77503796c51 95
alindvall 0:b77503796c51 96
alindvall 0:b77503796c51 97 static bool fileExists(const char* fname) {
alindvall 0:b77503796c51 98 FILE* f = fopen(fname, "r");
alindvall 0:b77503796c51 99 if (f != NULL) {
alindvall 0:b77503796c51 100 fclose(f);
alindvall 0:b77503796c51 101 return true;
alindvall 0:b77503796c51 102 }
alindvall 0:b77503796c51 103 return false;
alindvall 0:b77503796c51 104 }
alindvall 0:b77503796c51 105
alindvall 0:b77503796c51 106 static bool haveAllFiles(const char* prefix) {
alindvall 0:b77503796c51 107 char buff[512] = {0};
alindvall 0:b77503796c51 108 strcpy(buff, prefix);
alindvall 0:b77503796c51 109 int len = strlen(buff);
alindvall 0:b77503796c51 110
alindvall 0:b77503796c51 111 for (int i = 0; i < NUM_BENCHMARKS; i++) {
alindvall 0:b77503796c51 112 strcpy(buff+len, BENCHMARK_INPUT[i].fname);
alindvall 0:b77503796c51 113 if (!fileExists(buff)) {
alindvall 0:b77503796c51 114 DMBoard::instance().logger()->printf("File %s is missing\n", buff);
alindvall 0:b77503796c51 115 return false;
alindvall 0:b77503796c51 116 }
alindvall 0:b77503796c51 117 }
alindvall 0:b77503796c51 118 return true;
alindvall 0:b77503796c51 119 }
alindvall 0:b77503796c51 120
alindvall 0:b77503796c51 121 static bool createFiles(const char* prefix) {
alindvall 0:b77503796c51 122 RtosLog* log = DMBoard::instance().logger();
alindvall 0:b77503796c51 123 char buff[512] = {0};
alindvall 0:b77503796c51 124 strcpy(buff, prefix);
alindvall 0:b77503796c51 125 int len = strlen(buff);
alindvall 0:b77503796c51 126
alindvall 0:b77503796c51 127 for (int i = 0; i < NUM_BENCHMARKS; i++) {
alindvall 0:b77503796c51 128 strcpy(buff+len, BENCHMARK_INPUT[i].fname);
alindvall 0:b77503796c51 129 log->printf(" writing %u bytes to %s\n", BENCHMARK_INPUT[i].size, buff);
alindvall 0:b77503796c51 130 FILE* f = fopen(buff, "w");
alindvall 0:b77503796c51 131 if (f == NULL) {
alindvall 0:b77503796c51 132 log->printf("Failed to create file %s - ABORTING\n", buff);
alindvall 0:b77503796c51 133 return false;
alindvall 0:b77503796c51 134 }
alindvall 0:b77503796c51 135 uint32_t written;
alindvall 0:b77503796c51 136 if (BENCHMARK_INPUT[i].iflash_direct == NULL) {
alindvall 0:b77503796c51 137 // Need to copy from QSPI to SDRAM before attempting to write to the
alindvall 0:b77503796c51 138 // file as it will fail otherwise.
alindvall 0:b77503796c51 139 uint8_t* dest = (uint8_t*)malloc(COPYBUF_SIZE);
alindvall 0:b77503796c51 140 memcpy(dest, BENCHMARK_INPUT[i].qspi_direct, BENCHMARK_INPUT[i].size);
alindvall 0:b77503796c51 141 written = fwrite(dest, 1, BENCHMARK_INPUT[i].size, f);
alindvall 0:b77503796c51 142 free(dest);
alindvall 0:b77503796c51 143 //written = fwrite(BENCHMARK_INPUT[i].qspi_direct, 1, BENCHMARK_INPUT[i].size, f);
alindvall 0:b77503796c51 144 } else {
alindvall 0:b77503796c51 145 written = fwrite(BENCHMARK_INPUT[i].iflash_direct, 1, BENCHMARK_INPUT[i].size, f);
alindvall 0:b77503796c51 146 }
alindvall 0:b77503796c51 147 if (written != BENCHMARK_INPUT[i].size) {
alindvall 0:b77503796c51 148 log->printf("Failed to write %u (only wrote %u) bytes to %s - ABORTING\n", BENCHMARK_INPUT[i].size, written, buff);
alindvall 0:b77503796c51 149 return false;
alindvall 0:b77503796c51 150 }
alindvall 0:b77503796c51 151 fclose(f);
alindvall 0:b77503796c51 152 }
alindvall 0:b77503796c51 153 return true;
alindvall 0:b77503796c51 154 }
alindvall 0:b77503796c51 155
alindvall 0:b77503796c51 156 static bool prepareMCI() {
alindvall 0:b77503796c51 157 RtosLog* log = DMBoard::instance().logger();
alindvall 0:b77503796c51 158 bool ok = false;
alindvall 0:b77503796c51 159
alindvall 0:b77503796c51 160 mcifs = new MCIFileSystem("mci", P4_16);
alindvall 0:b77503796c51 161
alindvall 0:b77503796c51 162 if (mcifs->cardInserted()) {
alindvall 0:b77503796c51 163 log->printf("uSD card detected\n");
alindvall 0:b77503796c51 164
alindvall 0:b77503796c51 165 if (haveAllFiles("/mci/")) {
alindvall 0:b77503796c51 166 log->printf("uSD file system prepared!\n");
alindvall 0:b77503796c51 167 ok = true;
alindvall 0:b77503796c51 168 } else {
alindvall 0:b77503796c51 169 log->printf("One or more files missing, need to (re-)prepare the uSD file system\n");
alindvall 0:b77503796c51 170
alindvall 0:b77503796c51 171 log->printf("Preparing uSD file system...\n");
alindvall 0:b77503796c51 172 if (createFiles("/mci/")) {
alindvall 0:b77503796c51 173 log->printf("uSD file system prepared!\n");
alindvall 0:b77503796c51 174 ok = true;
alindvall 0:b77503796c51 175 } else {
alindvall 0:b77503796c51 176 log->printf("Failed to prepare uSD file system!\n");
alindvall 0:b77503796c51 177 }
alindvall 0:b77503796c51 178 }
alindvall 0:b77503796c51 179 } else {
alindvall 0:b77503796c51 180 log->printf("No uSD card detected. Insert one and reset\n");
alindvall 0:b77503796c51 181 }
alindvall 0:b77503796c51 182
alindvall 0:b77503796c51 183 return ok;
alindvall 0:b77503796c51 184 }
alindvall 0:b77503796c51 185
alindvall 0:b77503796c51 186 static bool prepareUSB() {
alindvall 0:b77503796c51 187 RtosLog* log = DMBoard::instance().logger();
alindvall 0:b77503796c51 188 bool ok = false;
alindvall 0:b77503796c51 189
alindvall 0:b77503796c51 190 usbmsd = new USBHostMSD("usb");
alindvall 0:b77503796c51 191 USBHost* host = USBHost::getHostInst();
alindvall 0:b77503796c51 192 host->signalOnConnections(Thread::gettid(), USBH_CONNECTION_EVENT);
alindvall 0:b77503796c51 193
alindvall 0:b77503796c51 194 log->printf("waiting for connect/disconnect message from USBHost...\n");
alindvall 0:b77503796c51 195 Thread::signal_wait(USBH_CONNECTION_EVENT);
alindvall 0:b77503796c51 196
alindvall 0:b77503796c51 197 if (usbmsd->connect()) {
alindvall 0:b77503796c51 198 log->printf("USB MemoryStick detected\n");
alindvall 0:b77503796c51 199
alindvall 0:b77503796c51 200 if (haveAllFiles("/usb/")) {
alindvall 0:b77503796c51 201 log->printf("USB MemoryStick file system prepared!\n");
alindvall 0:b77503796c51 202 ok = true;
alindvall 0:b77503796c51 203 } else {
alindvall 0:b77503796c51 204 log->printf("One or more files missing, need to (re-)prepare the USB MemoryStick\n");
alindvall 0:b77503796c51 205
alindvall 0:b77503796c51 206 log->printf("Preparing USB MemoryStick file system...\n");
alindvall 0:b77503796c51 207 if (createFiles("/usb/")) {
alindvall 0:b77503796c51 208 log->printf("USB MemoryStick file system prepared!\n");
alindvall 0:b77503796c51 209 ok = true;
alindvall 0:b77503796c51 210 } else {
alindvall 0:b77503796c51 211 log->printf("Failed to prepare USB MemoryStick file system!\n");
alindvall 0:b77503796c51 212 }
alindvall 0:b77503796c51 213 }
alindvall 0:b77503796c51 214 } else {
alindvall 0:b77503796c51 215 log->printf("No USB MemoryStick detected. Insert one and reset\n");
alindvall 0:b77503796c51 216 }
alindvall 0:b77503796c51 217
alindvall 0:b77503796c51 218 return ok;
alindvall 0:b77503796c51 219 }
alindvall 0:b77503796c51 220
alindvall 0:b77503796c51 221 static bool prepareQSPIFS() {
alindvall 0:b77503796c51 222 RtosLog* log = DMBoard::instance().logger();
alindvall 0:b77503796c51 223 bool ok = false;
alindvall 0:b77503796c51 224 bool format = false;
alindvall 0:b77503796c51 225
alindvall 0:b77503796c51 226 qspifs = new QSPIFileSystem("qspi");
alindvall 0:b77503796c51 227
alindvall 0:b77503796c51 228 do {
alindvall 0:b77503796c51 229 if (qspifs->isformatted()) {
alindvall 0:b77503796c51 230 uint32_t start, end;
alindvall 0:b77503796c51 231 qspifs->getMemoryBoundaries(&start, &end);
alindvall 0:b77503796c51 232 if ((end-start) >= QSPIFS_SIZE) {
alindvall 0:b77503796c51 233 log->printf("QSPI file system detected\n");
alindvall 0:b77503796c51 234
alindvall 0:b77503796c51 235 if (haveAllFiles("/qspi/")) {
alindvall 0:b77503796c51 236 log->printf("QSPI file system prepared!\n");
alindvall 0:b77503796c51 237 ok = true;
alindvall 0:b77503796c51 238 break;
alindvall 0:b77503796c51 239 } else {
alindvall 0:b77503796c51 240 log->printf("One or more files missing, need to (re-)prepare the QSPI file system\n");
alindvall 0:b77503796c51 241 }
alindvall 0:b77503796c51 242 } else {
alindvall 0:b77503796c51 243 log->printf("Found too small file system (only %dMB). Formatting...\n", (end-start)/(1024*1024));
alindvall 0:b77503796c51 244 format = true;
alindvall 0:b77503796c51 245 }
alindvall 0:b77503796c51 246 } else {
alindvall 0:b77503796c51 247 log->printf("No QSPI file system detected. Formatting...\n");
alindvall 0:b77503796c51 248 format = true;
alindvall 0:b77503796c51 249 }
alindvall 0:b77503796c51 250
alindvall 0:b77503796c51 251 if (format) {
alindvall 0:b77503796c51 252 if (qspifs->format(QSPIFS_SIZE_MB) == 0) {
alindvall 0:b77503796c51 253 log->printf("Formatting successful\n");
alindvall 0:b77503796c51 254 } else {
alindvall 0:b77503796c51 255 log->printf("Failed to format QSPI file system!\n");
alindvall 0:b77503796c51 256 break;
alindvall 0:b77503796c51 257 }
alindvall 0:b77503796c51 258 }
alindvall 0:b77503796c51 259
alindvall 0:b77503796c51 260 log->printf("Preparing QSPI file system...\n");
alindvall 0:b77503796c51 261 if (createFiles("/qspi/")) {
alindvall 0:b77503796c51 262 log->printf("QSPI file system prepared!\n");
alindvall 0:b77503796c51 263 ok = true;
alindvall 0:b77503796c51 264 } else {
alindvall 0:b77503796c51 265 log->printf("Failed to prepare QSPI file system!\n");
alindvall 0:b77503796c51 266 }
alindvall 0:b77503796c51 267 } while(false);
alindvall 0:b77503796c51 268
alindvall 0:b77503796c51 269 return ok;
alindvall 0:b77503796c51 270 }
alindvall 0:b77503796c51 271
alindvall 0:b77503796c51 272 static bool prepare() {
alindvall 0:b77503796c51 273 return prepareMCI() && prepareUSB() && prepareQSPIFS();
alindvall 0:b77503796c51 274 }
alindvall 0:b77503796c51 275
alindvall 0:b77503796c51 276 static void readFile(const char* fname, uint8_t* dest) {
alindvall 0:b77503796c51 277 FILE* f = fopen(fname, "r");
alindvall 0:b77503796c51 278 if (f != NULL) {
alindvall 0:b77503796c51 279 int num = fread(dest, 1, 1024, f);
alindvall 0:b77503796c51 280 while (num > 0) {
alindvall 0:b77503796c51 281 dest+=num;
alindvall 0:b77503796c51 282 num = fread(dest, 1, 1024, f);
alindvall 0:b77503796c51 283 }
alindvall 0:b77503796c51 284 fclose(f);
alindvall 0:b77503796c51 285 }
alindvall 0:b77503796c51 286 }
alindvall 0:b77503796c51 287
alindvall 0:b77503796c51 288 static void runBenchmarks() {
alindvall 0:b77503796c51 289 RtosLog* log = DMBoard::instance().logger();
alindvall 0:b77503796c51 290 uint32_t times[NUM_BENCHMARKS][5] = {0};
alindvall 0:b77503796c51 291 uint32_t tmp;
alindvall 0:b77503796c51 292 char buff[512];
alindvall 0:b77503796c51 293 Timer t;
alindvall 0:b77503796c51 294 uint8_t* dest = (uint8_t*)malloc(COPYBUF_SIZE);
alindvall 0:b77503796c51 295 if (dest == NULL) {
alindvall 0:b77503796c51 296 log->printf("Failed to allocate 10MBytes as buffer\n");
alindvall 0:b77503796c51 297 return;
alindvall 0:b77503796c51 298 }
alindvall 0:b77503796c51 299
alindvall 0:b77503796c51 300 t.start();
alindvall 0:b77503796c51 301
alindvall 0:b77503796c51 302 for (int i = 0; i < NUM_BENCHMARKS; i++) {
alindvall 0:b77503796c51 303 // MCI
alindvall 0:b77503796c51 304 sprintf(buff, "/mci/%s", BENCHMARK_INPUT[i].fname);
alindvall 0:b77503796c51 305 memset(dest, 0, COPYBUF_SIZE);
alindvall 0:b77503796c51 306 tmp = t.read_us();
alindvall 0:b77503796c51 307 readFile(buff, dest);
alindvall 0:b77503796c51 308 times[i][0] = t.read_us() - tmp;
alindvall 0:b77503796c51 309 log->printf("Benchmarking %-25s took %8uus\n", buff, times[i][0]);
alindvall 0:b77503796c51 310
alindvall 0:b77503796c51 311 //USB
alindvall 0:b77503796c51 312 sprintf(buff, "/usb/%s", BENCHMARK_INPUT[i].fname);
alindvall 0:b77503796c51 313 memset(dest, 0, COPYBUF_SIZE);
alindvall 0:b77503796c51 314 tmp = t.read_us();
alindvall 0:b77503796c51 315 readFile(buff, dest);
alindvall 0:b77503796c51 316 times[i][1] = t.read_us() - tmp;
alindvall 0:b77503796c51 317 log->printf("Benchmarking %-25s took %8uus\n", buff, times[i][1]);
alindvall 0:b77503796c51 318
alindvall 0:b77503796c51 319 //QSPIFS
alindvall 0:b77503796c51 320 sprintf(buff, "/qspi/%s", BENCHMARK_INPUT[i].fname);
alindvall 0:b77503796c51 321 memset(dest, 0, COPYBUF_SIZE);
alindvall 0:b77503796c51 322 tmp = t.read_us();
alindvall 0:b77503796c51 323 readFile(buff, dest);
alindvall 0:b77503796c51 324 times[i][2] = t.read_us() - tmp;
alindvall 0:b77503796c51 325 log->printf("Benchmarking %-25s took %8uus\n", buff, times[i][2]);
alindvall 0:b77503796c51 326
alindvall 0:b77503796c51 327 //IFLASH
alindvall 0:b77503796c51 328 sprintf(buff, "IFLASH /%s", BENCHMARK_INPUT[i].fname);
alindvall 0:b77503796c51 329 if (BENCHMARK_INPUT[i].iflash_direct != NULL) {
alindvall 0:b77503796c51 330 memset(dest, 0, COPYBUF_SIZE);
alindvall 0:b77503796c51 331 tmp = t.read_us();
alindvall 0:b77503796c51 332 memcpy(dest, BENCHMARK_INPUT[i].iflash_direct, BENCHMARK_INPUT[i].size);
alindvall 0:b77503796c51 333 times[i][3] = t.read_us() - tmp;
alindvall 0:b77503796c51 334 log->printf("Benchmarking %-25s took %8uus\n", buff, times[i][3]);
alindvall 0:b77503796c51 335 } else {
alindvall 0:b77503796c51 336 log->printf("Benchmarking %-25s skipped\n", buff);
alindvall 0:b77503796c51 337 }
alindvall 0:b77503796c51 338
alindvall 0:b77503796c51 339 //QSPI
alindvall 0:b77503796c51 340 sprintf(buff, "QSPI /%s", BENCHMARK_INPUT[i].fname);
alindvall 0:b77503796c51 341 if (BENCHMARK_INPUT[i].qspi_direct != NULL) {
alindvall 0:b77503796c51 342 memset(dest, 0, COPYBUF_SIZE);
alindvall 0:b77503796c51 343 tmp = t.read_us();
alindvall 0:b77503796c51 344 memcpy(dest, BENCHMARK_INPUT[i].qspi_direct, BENCHMARK_INPUT[i].size);
alindvall 0:b77503796c51 345 times[i][4] = t.read_us() - tmp;
alindvall 0:b77503796c51 346 log->printf("Benchmarking %-25s took %8uus\n", buff, times[i][4]);
alindvall 0:b77503796c51 347 } else {
alindvall 0:b77503796c51 348 log->printf("Benchmarking %-25s skipped\n", buff);
alindvall 0:b77503796c51 349 }
alindvall 0:b77503796c51 350 }
alindvall 0:b77503796c51 351
alindvall 0:b77503796c51 352 log->printf("\n\n----\nSummary:\n");
alindvall 0:b77503796c51 353
alindvall 0:b77503796c51 354 log->printf("\n File Information\n");
alindvall 0:b77503796c51 355 log->printf("%18s %10s\n", "Filename", "Size");
alindvall 0:b77503796c51 356 log->printf("%18s %10s\n", "--------", "----");
alindvall 0:b77503796c51 357 for (int i = 0; i < NUM_BENCHMARKS; i++) {
alindvall 0:b77503796c51 358 log->printf("%18s %10d bytes\n", BENCHMARK_INPUT[i].fname, BENCHMARK_INPUT[i].size);
alindvall 0:b77503796c51 359 }
alindvall 0:b77503796c51 360
alindvall 0:b77503796c51 361 log->printf("\n Read times (in us)\n");
alindvall 0:b77503796c51 362 log->printf("%18s %10s %10s %10s %10s %10s\n", "Filename", "uSD Card", "USB", "QSPI FS", "IFLASH[]", "QSPI[]");
alindvall 0:b77503796c51 363 log->printf("%18s %10s %10s %10s %10s %10s\n", "--------", "--------", "---", "-------", "--------", "------");
alindvall 0:b77503796c51 364 for (int i = 0; i < NUM_BENCHMARKS; i++) {
alindvall 0:b77503796c51 365 char* p = (char*)dest;
alindvall 0:b77503796c51 366 for (int x = 0; x < 5; x++) {
alindvall 0:b77503796c51 367 if (times[i][x] == 0) {
alindvall 0:b77503796c51 368 p += sprintf(p, "%10s ", "N/A");
alindvall 0:b77503796c51 369 } else {
alindvall 0:b77503796c51 370 p += sprintf(p, "%10d ", times[i][x]);
alindvall 0:b77503796c51 371 }
alindvall 0:b77503796c51 372 }
alindvall 0:b77503796c51 373 log->printf("%18s %s\n", BENCHMARK_INPUT[i].fname, dest);
alindvall 0:b77503796c51 374 }
alindvall 0:b77503796c51 375
alindvall 0:b77503796c51 376 log->printf("\n Read speeds\n");
alindvall 0:b77503796c51 377 log->printf("%18s %-12s %-12s %-12s %-12s %-12s\n", "Filename", "uSD Card", "USB", "QSPI FS", "IFLASH[]", "QSPI[]");
alindvall 0:b77503796c51 378 log->printf("%18s %s %s %s %s %s\n", "--------", "------------", "------------", "------------", "------------", "------------");
alindvall 0:b77503796c51 379 for (int i = 0; i < NUM_BENCHMARKS; i++) {
alindvall 0:b77503796c51 380 char* p = (char*)dest;
alindvall 0:b77503796c51 381 for (int x = 0; x < 5; x++) {
alindvall 0:b77503796c51 382 if (times[i][x] == 0) {
alindvall 0:b77503796c51 383 p += sprintf(p, "%12s ", "N/A ");
alindvall 0:b77503796c51 384 } else {
alindvall 0:b77503796c51 385 double t = times[i][x];
alindvall 0:b77503796c51 386 double s = BENCHMARK_INPUT[i].size;
alindvall 0:b77503796c51 387 double v = (s*1000000)/t;
alindvall 0:b77503796c51 388 if (v < 10000) {
alindvall 0:b77503796c51 389 p += sprintf(p, "%#7.2F b/s ", v);
alindvall 0:b77503796c51 390 } else if (v < 10000000) {
alindvall 0:b77503796c51 391 p += sprintf(p, "%#7.2F Kb/s ", v/1024.0);
alindvall 0:b77503796c51 392 } else {
alindvall 0:b77503796c51 393 p += sprintf(p, "%#7.2F Mb/s ", v/(1024.0*1024.0));
alindvall 0:b77503796c51 394 }
alindvall 0:b77503796c51 395 }
alindvall 0:b77503796c51 396 }
alindvall 0:b77503796c51 397 log->printf("%18s %s \n", BENCHMARK_INPUT[i].fname, dest);
alindvall 0:b77503796c51 398 }
alindvall 0:b77503796c51 399
alindvall 0:b77503796c51 400 log->printf("\n\n---\n");
alindvall 0:b77503796c51 401 }
alindvall 0:b77503796c51 402
alindvall 0:b77503796c51 403 /******************************************************************************
alindvall 0:b77503796c51 404 * Main
alindvall 0:b77503796c51 405 *****************************************************************************/
alindvall 0:b77503796c51 406
alindvall 0:b77503796c51 407 int main()
alindvall 0:b77503796c51 408 {
alindvall 0:b77503796c51 409 DMBoard::BoardError err;
alindvall 0:b77503796c51 410 DMBoard* board = &DMBoard::instance();
alindvall 0:b77503796c51 411 RtosLog* log = board->logger();
alindvall 0:b77503796c51 412 Display* disp = board->display();
alindvall 0:b77503796c51 413
alindvall 0:b77503796c51 414 do {
alindvall 0:b77503796c51 415 err = board->init();
alindvall 0:b77503796c51 416 if (err != DMBoard::Ok) {
alindvall 0:b77503796c51 417 log->printf("Failed to initialize the board, got error %d\r\n", err);
alindvall 0:b77503796c51 418 break;
alindvall 0:b77503796c51 419 }
alindvall 0:b77503796c51 420
alindvall 0:b77503796c51 421 log->printf("\n\nBenchmarking. (Built "__DATE__" at "__TIME__")\n\n");
alindvall 0:b77503796c51 422
alindvall 0:b77503796c51 423 log->printf("Preparing file systems for benchmarking\n");
alindvall 0:b77503796c51 424 if (!prepare()) {
alindvall 0:b77503796c51 425 log->printf("Failed to prepare for benchmarking\r\n");
alindvall 0:b77503796c51 426 break;
alindvall 0:b77503796c51 427 }
alindvall 0:b77503796c51 428
alindvall 0:b77503796c51 429 runBenchmarks();
alindvall 0:b77503796c51 430
alindvall 0:b77503796c51 431 } while(false);
alindvall 0:b77503796c51 432
alindvall 0:b77503796c51 433 if (err != DMBoard::Ok) {
alindvall 0:b77503796c51 434 log->printf("\nTERMINATING\n");
alindvall 0:b77503796c51 435 }
alindvall 0:b77503796c51 436
alindvall 0:b77503796c51 437 while(true) {
alindvall 0:b77503796c51 438 Thread::wait(1000);
alindvall 0:b77503796c51 439 }
alindvall 0:b77503796c51 440 }
alindvall 0:b77503796c51 441