2014-04-22 17:43:32 -07:00
|
|
|
/**
|
|
|
|
* @file rdi_perftest.c
|
|
|
|
*
|
|
|
|
* @date Nov 30, 2012
|
|
|
|
* @author Andrey Belomutskiy, (c) 2012-2014
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "main.h"
|
|
|
|
#include "rfi_perftest.h"
|
|
|
|
#include "fuel_math.h"
|
|
|
|
|
|
|
|
//#include "rfirtc.h"
|
|
|
|
#include "eficonsole.h"
|
|
|
|
#include "time.h"
|
|
|
|
#include "engine_math.h"
|
|
|
|
#include "gpio_helper.h"
|
|
|
|
#include "efilib2.h"
|
|
|
|
|
|
|
|
//#define TEST_PORT GPIOB
|
|
|
|
//#define TEST_PIN 6
|
|
|
|
|
|
|
|
//static OutputPin testOutput;
|
|
|
|
|
|
|
|
Logging logger;
|
|
|
|
|
|
|
|
static void testSystemCalls(const int count) {
|
|
|
|
time_t start, time;
|
|
|
|
long result = 0;
|
|
|
|
|
|
|
|
start = currentTimeMillis();
|
|
|
|
for (int i = 0; i < count / 2; i++) {
|
|
|
|
// setPinValue(&testOutput, 0);
|
|
|
|
// setPinValue(&testOutput, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
time = currentTimeMillis() - start;
|
|
|
|
// Finished 100000 iterations of 'setPinValue()' in 120ms
|
|
|
|
// prin("Finished %d iterations of 'setPinValue()' in %dms\r\n", count, time);
|
|
|
|
|
|
|
|
start = currentTimeMillis();
|
|
|
|
for (int i = 0; i < count; i++)
|
|
|
|
result += chTimeNow();
|
|
|
|
time = currentTimeMillis() - start;
|
|
|
|
if (result != 0) {
|
|
|
|
// Finished 100000 iterations of 'chTimeNow()' in 33ms
|
|
|
|
scheduleMsg(&logger, "Finished %d iterations of 'chTimeNow()' in %dms", count, time);
|
|
|
|
}
|
|
|
|
|
|
|
|
start = currentTimeMillis();
|
|
|
|
for (int i = 0; i < count; i++) {
|
|
|
|
chSysLock()
|
|
|
|
;
|
|
|
|
result += chTimeNow();
|
|
|
|
chSysUnlock()
|
|
|
|
;
|
|
|
|
}
|
|
|
|
time = currentTimeMillis() - start;
|
|
|
|
if (result != 0) {
|
|
|
|
// Finished 100000 iterations of 'chTimeNow()' with chSysLock in 144ms
|
|
|
|
scheduleMsg(&logger, "Finished %d iterations of 'chTimeNow()' with chSysLock in %dms", count, time);
|
|
|
|
}
|
|
|
|
|
|
|
|
start = currentTimeMillis();
|
|
|
|
for (int i = 0; i < count; i++)
|
|
|
|
result += currentTimeMillis();
|
|
|
|
time = currentTimeMillis() - start;
|
|
|
|
if (result != 0)
|
|
|
|
scheduleMsg(&logger, "Finished %d iterations of 'currentTimeMillis' in %dms", count, time);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void testRusefiMethods(const int count) {
|
|
|
|
time_t start, time;
|
|
|
|
int tempi = 1;
|
|
|
|
|
|
|
|
start = currentTimeMillis();
|
|
|
|
|
|
|
|
for (int i = 0; i < count; i++)
|
|
|
|
tempi += getBaseFuel(4020, 2.21111);
|
|
|
|
time = currentTimeMillis() - start;
|
|
|
|
if (tempi != 0)
|
|
|
|
scheduleMsg(&logger, "Finished %d iterations of getBaseFuel in %dms", count, time);
|
|
|
|
|
|
|
|
start = currentTimeMillis();
|
|
|
|
|
|
|
|
// for (int i = 0; i < count; i++)
|
|
|
|
// tempi += getDefaultFuel(4020, 2.21111);
|
|
|
|
// time = currentTimeMillis() - start;
|
|
|
|
// if (tempi == 0)
|
|
|
|
// rint("Finished %d iterations of getDefaultFuel in %dms\r\n", count, time);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void testMath(const int count) {
|
|
|
|
time_t start, time;
|
|
|
|
|
|
|
|
int64_t temp64 = 0;
|
|
|
|
start = currentTimeMillis();
|
|
|
|
for (int64_t i = 0; i < count; i++)
|
|
|
|
temp64 += i;
|
|
|
|
time = currentTimeMillis() - start;
|
|
|
|
if (temp64 != 0)
|
|
|
|
scheduleMsg(&logger, "Finished %d iterations of int64_t summation in %dms", count, time);
|
|
|
|
|
|
|
|
temp64 = 1;
|
|
|
|
start = currentTimeMillis();
|
|
|
|
for (int64_t i = 0; i < count; i++)
|
|
|
|
temp64 *= i;
|
|
|
|
time = currentTimeMillis() - start;
|
|
|
|
if (temp64 == 0)
|
|
|
|
scheduleMsg(&logger, "Finished %d iterations of int64_t multiplication in %dms", count, time);
|
|
|
|
|
|
|
|
|
|
|
|
start = currentTimeMillis();
|
|
|
|
for (int i = 0; i < count; i++)
|
|
|
|
;
|
|
|
|
time = currentTimeMillis() - start;
|
|
|
|
scheduleMsg(&logger, "Finished %d iterations of empty loop in %dms", count, time);
|
|
|
|
|
|
|
|
int tempi = 1;
|
|
|
|
start = currentTimeMillis();
|
|
|
|
for (int i = 0; i < count; i++)
|
|
|
|
tempi += tempi;
|
|
|
|
time = currentTimeMillis() - start;
|
|
|
|
if (tempi == 0)
|
|
|
|
scheduleMsg(&logger, "Finished %d iterations of int summation in %dms", count, time);
|
|
|
|
|
|
|
|
start = currentTimeMillis();
|
|
|
|
tempi = 1;
|
|
|
|
for (int i = 0; i < count; i++)
|
|
|
|
tempi += (tempi + 100) / 130;
|
|
|
|
time = currentTimeMillis() - start;
|
|
|
|
if (tempi != 0)
|
|
|
|
scheduleMsg(&logger, "Finished %d iterations of int division in %dms", count, time);
|
|
|
|
|
|
|
|
start = currentTimeMillis();
|
|
|
|
long templ = 1;
|
|
|
|
for (int i = 0; i < count; i++)
|
|
|
|
templ += templ;
|
|
|
|
time = currentTimeMillis() - start;
|
|
|
|
if (templ == 0)
|
|
|
|
scheduleMsg(&logger, "Finished %d iterations of long summation in %dms", count, time);
|
|
|
|
|
|
|
|
start = currentTimeMillis();
|
|
|
|
templ = 1;
|
|
|
|
for (int i = 0; i < count; i++)
|
|
|
|
templ += (templ + 100) / 130;
|
|
|
|
time = currentTimeMillis() - start;
|
|
|
|
if (templ != 0) {
|
|
|
|
// Finished 100000 iterations of long division in 45ms
|
|
|
|
scheduleMsg(&logger, "Finished %d iterations of long division in %dms", count, time);
|
|
|
|
}
|
|
|
|
|
|
|
|
start = currentTimeMillis();
|
|
|
|
float tempf = 1;
|
|
|
|
for (int i = 0; i < count; i++)
|
|
|
|
tempf += tempf;
|
|
|
|
time = currentTimeMillis() - start;
|
|
|
|
if (tempf != 0)
|
|
|
|
scheduleMsg(&logger, "Finished %d iterations of float summation in %dms", count, time);
|
|
|
|
|
|
|
|
start = currentTimeMillis();
|
|
|
|
tempf = 1;
|
|
|
|
for (int i = 0; i < count; i++)
|
|
|
|
tempf += (tempf + 100) / 130.0;
|
|
|
|
time = currentTimeMillis() - start;
|
|
|
|
if (tempf != 0) {
|
|
|
|
// Finished 100000 iterations of float division in 65ms
|
|
|
|
scheduleMsg(&logger, "Finished %d iterations of float division in %dms", count, time);
|
|
|
|
}
|
|
|
|
|
|
|
|
start = currentTimeMillis();
|
|
|
|
double tempd = 1;
|
|
|
|
for (int i = 0; i < count; i++)
|
|
|
|
tempd += tempd / 2;
|
|
|
|
time = currentTimeMillis() - start;
|
|
|
|
if (tempd != 0)
|
|
|
|
scheduleMsg(&logger, "Finished %d iterations of double summation in %dms", count, time);
|
|
|
|
|
|
|
|
start = currentTimeMillis();
|
|
|
|
tempd = 1;
|
|
|
|
for (int i = 0; i < count; i++)
|
|
|
|
tempd += (tempd + 100) / 130.0;
|
|
|
|
time = currentTimeMillis() - start;
|
|
|
|
if (tempd != 0)
|
|
|
|
scheduleMsg(&logger, "Finished %d iterations of double division in %dms", count, time);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
static void runTests(const int count) {
|
|
|
|
testRusefiMethods(count / 10);
|
|
|
|
testSystemCalls(count);
|
|
|
|
testMath(count);
|
|
|
|
}
|
|
|
|
|
|
|
|
extern Overflow64Counter halTime;
|
|
|
|
|
|
|
|
int rtcStartTime;
|
|
|
|
|
|
|
|
#include "chrtclib.h"
|
|
|
|
|
|
|
|
static void timeInfo(void) {
|
2014-04-25 20:41:33 -07:00
|
|
|
scheduleMsg(&logger, "chTimeNow as seconds = %d", getTimeNowSeconds());
|
2014-04-22 17:43:32 -07:00
|
|
|
scheduleMsg(&logger, "hal seconds = %d", halTime.get() / 168000000LL);
|
|
|
|
|
|
|
|
int unix = rtcGetTimeUnixSec(&RTCD1) - rtcStartTime;
|
|
|
|
scheduleMsg(&logger, "unix seconds = %d", unix);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void initTimePerfActions() {
|
|
|
|
rtcStartTime = rtcGetTimeUnixSec(&RTCD1);
|
|
|
|
|
|
|
|
|
|
|
|
initLogging(&logger, "perftest");
|
|
|
|
// initOutputPin("test pad", &testOutput, TEST_PORT, TEST_PIN);
|
|
|
|
addConsoleActionI("perftest", runTests);
|
|
|
|
|
|
|
|
addConsoleAction("timeinfo", timeInfo);
|
|
|
|
}
|