Benchmark Sute based on Arduino speed benchmark, adapted and modified for ARM Cortex-M7 ST Nucleo-144 STM32F767 and STM32F746 MCU's by Jovan Ivković 2017. https://hackaday.io/JovanE (Work based on Original Arduino Speed Test Benchmark Program by Dan Watson modified by Chester Lowrey)
Dependencies: STM32F4_RNG mbed
main.cpp
- Committer:
- JovanEps
- Date:
- 2017-02-22
- Revision:
- 1:646b34df5819
- Parent:
- 0:82d68abdb697
File content as of revision 1:646b34df5819:
//************************************************************
//** Benchmark Sute based on Arduino bench. ******
//** adapted and mod. for ARM Cortex-M7 ST Nucleo-144 ******
//** Stm32F767 and STM32F746 MCU's by ******
//** Jovan Ivkovic 2016. ******
//** JovanEps (jovan.eps@gmail.com). ******
//************************************************************
#include "mbed.h"
#include "STM32F4_RNG.h"
//DigitalOut myled(LED1);
PwmOut PD13(PA_5); //PWM Out to simulate Arduino Analog.Write
//AnalogIn analog_value(A0);
AnalogIn analog_value(PA_3);
AnalogOut DACout(PA_4); //Full DAC - analog out (write)
Serial pc(USBTX, USBRX);
DigitalOut PD7(PF_13); //introduce D7 pin-out *-Clear port it ping faster :)
DigitalIn PD8(PF_12);
DigitalInOut PD5(PE_11);
Timer timer; //Timer
#include <math.h>
#define delay wait_ms
#define delayMicroseconds wait_us
#define millis() timer.read_ms()
#define digitalWrite DigitalOut
#define HIGH 1
#define LOW 0
// Arduino Speed Test Benchmarking Program
// Original Program Credit: Arduino.cc
// Modified By: Dan Watson
// synchannel.blogspot.com
// 1-29-2015
// Modified By: Chester Lowrey
// easybotics.com hilo90mhz.com
// 2016-12-1
// This sketch is the speed test portion of the Arduino Show Info program
// http://playground.arduino.cc/Main/ShowInfo
// Certain tests may not compile/run for all boards. Comment them out as necessary:
// * analogReference()
// * dtostrf()
// * bitSet()
// * y |= (1<<x)
// For the Arduino Zero, "Serial." needs to be "SerialUSB.". A find and replace is the easiest way
// to fix this. The program may also run in forked IDEs (such as Mpide for the chipKIT boards).
// All configuration options listed below for reference
// PIN_1 is used for digitalRead
// PIN_2 is used for digitalWrite / pinMode / analogWrite (PWM)
// Analog read is hardcoded to 0/1
#define noTitle // define to remove titles - easier to paste results into comparison spreadsheet
//#define noAnalog // define to remove analog read/write for ICs without this function
#define noAnalogRef // define to remove analogRef test that some cores do not support
//#define noDtostrfTest // define to remove the dtostrf test that some cores do not support
//#define noBvTest // define to remove bv test that some cores do not support
//#define USBserialWait // define to force the main sketch to wait for USB to Serial connection - needed on some native serial boards
//#define noLtoaTest // define to remove Itoa test that some cores do not support
// Uncomment only one of the below configurations for your specifc board, or make a new one
/*
// Arduino ATMEGA328
#define PIN_1 3
#define PIN_2 4
*/
/*
// Arduino Leonardo
#define PIN_1 2
#define PIN_2 3
#define noBvTest
#define USBserialWait
*/
// Nucleo STM32F103RB - not tested yet /WE DO NOT USE THOSE SETINGS
#define PIN_1 12
#define PIN_2 13
#define noAnalog
#define noBvTest
#define noLtoaTest
/*
// Arduino Due
#define PIN_1 2
#define PIN_2 3
#define noDtostrfTest
#define noBvTest
#define USBserialWait
*/
/*
// Arduino Zero Pins
#define PIN_1 2
#define PIN_2 3
#define noBvTest
#define noDtostrfTest
#define USBserialWait
*/
/*
// ESP8266 Pins
#define PIN_1 4
#define PIN_2 5
#define PIN_3 12
*/
/*
// ESP32 Pins
#define PIN_1 25
#define PIN_2 26
#define PIN_3 27
#define noAnalog
*/
/*
// NRF52/51 Pins
#define PIN_1 17
#define PIN_2 18
#define PIN_3 19
#define noDtostrfTest
#define noBvTest
*/
void setup()
{
//Serial.begin(9600);
pc.baud(9600);
/*
#ifdef USBserialWait
while (!Serial) {
; // wait for serial port to connect. Needed for native USB
}
#endif
pinMode(PIN_1, OUTPUT);
pinMode(PIN_2, INPUT);
pc.printfln("Speed Test will begin momentarily.");
pc.printfln("");
wait_ms(1000);
speedTest();
*/
}
void speedTest(void)
{
register int i,j;
volatile unsigned char c1,c2;
volatile int v;
volatile long l1,l2;
volatile float f1,f2;
int p,q;
long int r;
unsigned long m,n;
float d, overhead;
char buffer[30];
int digitalRead;
float meas; //Analog readings
#define F_CPU 216000000
#define DEC 10
//#ifndef noTitle
pc.printf("\n\r");
pc.printf("Speed test \n\r");
pc.printf("---------- \n\r");
pc.printf("F_CPU = ");
//#endif
pc.printf("%d",F_CPU/1000000);
pc.printf(" MHz \n\r");
//#ifndef noTitle
pc.printf("1/F_CPU = ");
//#endif
pc.printf("%.4f",(1000000.0/(float)F_CPU));
pc.printf("us \n\r");
wait(0.5); // Allow the Serial text to be transmitted
//#ifndef noTitle
pc.printf("\n\r Start benchmarks");
pc.printf("\n\r ------------------------------");
wait_ms(70); // Allow the Serial text to be transmitted
pc.printf("\n\r\n\r NOP : ");
//#endif
//*************************
// Start timer
//*************************
timer.start();
//*************************
// wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<100; i++) {
for (j=0; j<10000; j++) {
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0; // in micro seconds
// Calculate overhead with 'nop' instruction per loop in microseconds
overhead = d - (20.0 * (1000000.0/(float)F_CPU));
d -= overhead;
d /= 20.0; // per instruction
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r------------------------");
//#ifndef noTitle
pc.printf("\n\r digitalRead : ");
//#endif
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<2; i++) {
for (j=0; j<10000; j++) {
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
digitalRead = PD8;
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noTitle
pc.printf("\n\r digitalWrite : ");
//#endif
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<2; i++) {
for (j=0; j<10000; j++) {
PD7 = HIGH;
PD7 = LOW;
PD7 = HIGH;
PD7 = LOW;
PD7 = HIGH;
PD7 = LOW;
PD7 = HIGH;
PD7 = LOW;
PD7 = HIGH;
PD7 = LOW;
PD7 = HIGH;
PD7 = LOW;
PD7 = HIGH;
PD7 = LOW;
PD7 = HIGH;
PD7 = LOW;
PD7 = HIGH;
PD7 = LOW;
PD7 = HIGH;
PD7 = LOW;
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noTitle
pc.printf("\n\r pinMode : ");
//#endif
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<2; i++) {
for (j=0; j<10000; j++) {
digitalRead = PD5.read();
PD5.write(digitalRead);
digitalRead = PD5.read();
PD5.write(digitalRead);
digitalRead = PD5.read();
PD5.write(digitalRead);
digitalRead = PD5.read();
PD5.write(digitalRead);
digitalRead = PD5.read();
PD5.write(digitalRead);
digitalRead = PD5.read();
PD5.write(digitalRead);
digitalRead = PD5.read();
PD5.write(digitalRead);
digitalRead = PD5.read();
PD5.write(digitalRead);
digitalRead = PD5.read();
PD5.write(digitalRead);
digitalRead = PD5.read();
PD5.write(digitalRead);
digitalRead = PD5.read();
PD5.write(digitalRead);
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noTitle
pc.printf("\n\r multiply byte : ");
//#endif
c1 = 2;
c2 = 3;
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<20; i++) {
for (j=0; j<10000; j++) {
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noTitle
pc.printf("\n\r divide byte : ");
//#endif
c1 = 253;
c2 = 3;
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<2; i++) {
for (j=0; j<10000; j++) {
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noTitle
pc.printf("\n\r add byte : ");
//#endif
c1 = 1;
c2 = 2;
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<20; i++) {
for (j=0; j<10000; j++) {
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noTitle
pc.printf("\n\r multiply integer : ");
//#endif
volatile int x,y;
x = 2;
y = 3;
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<10; i++) {
for (j=0; j<10000; j++) {
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noTitle
pc.printf("\n\r divide integer : ");
//#endif
x = 31415;
y = 3;
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<1; i++) {
for (j=0; j<10000; j++) {
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noTitle
pc.printf("\n\r add integer : ");
//#endif
x = 1;
y = 3;
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<10; i++) {
for (j=0; j<10000; j++) {
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noTitle
pc.printf("\n\r multiply long : ");
//#endif
l1 = 2;
l2 = 3;
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<2; i++) {
for (j=0; j<10000; j++) {
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noTitle
pc.printf("\n\r divide long : ");
//#endif
l1 = 2000000000L;
l2 = 3;
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<1; i++) {
for (j=0; j<2000; j++) {
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noTitle
pc.printf("\n\r add long : ");
//#endif
l1 = 500000000L;
l2 = 123;
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<4; i++) {
for (j=0; j<10000; j++) {
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noTitle
pc.printf("\n\r multiply float : ");
//#endif
f1 = 3.24;
f2 = 1.25;
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<2; i++) {
for (j=0; j<10000; j++) {
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noTitle
pc.printf("\n\r divide float : ");
//#endif
f1 = 312645.24;
f2 = 1.21;
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<1; i++) {
for (j=0; j<2000; j++) {
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noTitle
pc.printf("\n\r add float : ");
//#endif
f1 = 9876.54;
f2 = 1.23;
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<1; i++) {
for (j=0; j<10000; j++) {
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
/*
//#ifndef noTitle
pc.printf(" itoa() : ");
//#endif
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<1; i++) {
for (j=0; j<10000; j++) {
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f",d);
pc.printf(" us");
*/
/*
#ifndef noLtoaTest
long int l = 314159L;
//#ifndef noTitle
pc.printf(" ltoa() : ");
//#endif
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<1; i++) {
for (j=0; j<500; j++) {
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f",d);
pc.printf(" us");
//#endif
*/
/*
#ifndef noDtostrfTest
//#ifndef noTitle
pc.printf(" dtostrf() : ");
//#endif
float d3;
d3 = 3.14159265;
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<2; i++) {
for (j=0; j<1000; j++) {
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f",d);
pc.printf(" us");
#endif
*/
//**************************
//**** Randomize
//**************************
STM32F4_RNG rnd;
unsigned long num;
//#ifndef noTitle
pc.printf("\n\r random() : ");
//#endif
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<2; i++) {
for (j=0; j<1000; j++) {
//r=random(-2147483647,2147483647);
num = rnd.Get();
num = rnd.Get();
num = rnd.Get();
num = rnd.Get();
num = rnd.Get();
num = rnd.Get();
num = rnd.Get();
num = rnd.Get();
num = rnd.Get();
num = rnd.Get();
num = rnd.Get();
num = rnd.Get();
num = rnd.Get();
num = rnd.Get();
num = rnd.Get();
num = rnd.Get();
num = rnd.Get();
num = rnd.Get();
num = rnd.Get();
num = rnd.Get();
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noBvTest
//#ifndef noTitle
pc.printf("\n\r y |= (1<<x) : ");
//#endif
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<20; i++) {
for (j=0; j<10000; j++) {
//v |= _BV(12);
v |= (1 << 12);
v |= (1 << 12);
v |= (1 << 12);
v |= (1 << 12);
v |= (1 << 12);
v |= (1 << 12);
v |= (1 << 12);
v |= (1 << 12);
v |= (1 << 12);
v |= (1 << 12);
v |= (1 << 12);
v |= (1 << 12);
v |= (1 << 12);
v |= (1 << 12);
v |= (1 << 12);
v |= (1 << 12);
v |= (1 << 12);
v |= (1 << 12);
v |= (1 << 12);
v |= (1 << 12);
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#endif
/*
//#ifndef noTitle
pc.printf(" bitSet() : ");
//#endif
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<20; i++) {
for (j=0; j<10000; j++) {
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f",d);
pc.printf(" us");
*/
/*
//#ifndef noAnalogRef
//#ifndef noTitle
pc.printf(" analogReference() : ");
//#endif
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<20; i++) {
for (j=0; j<10000; j++) {
analogReference (EXTERNAL);
analogReference (DEFAULT);
analogReference (EXTERNAL);
analogReference (DEFAULT);
analogReference (EXTERNAL);
analogReference (DEFAULT);
analogReference (EXTERNAL);
analogReference (DEFAULT);
analogReference (EXTERNAL);
analogReference (DEFAULT);
analogReference (EXTERNAL);
analogReference (DEFAULT);
analogReference (EXTERNAL);
analogReference (DEFAULT);
analogReference (EXTERNAL);
analogReference (DEFAULT);
analogReference (EXTERNAL);
analogReference (DEFAULT);
analogReference (EXTERNAL);
analogReference (DEFAULT);
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f",d);
pc.printf(" us");
//#endif
*/
//#ifndef noAnalog
//#ifndef noTitle
pc.printf("\n\r analogRead() : ");
//#endif
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<1; i++) {
for (j=0; j<1000; j++) {
meas = analog_value.read();
meas = analog_value.read();
meas = analog_value.read();
meas = analog_value.read();
meas = analog_value.read();
meas = analog_value.read();
meas = analog_value.read();
meas = analog_value.read();
meas = analog_value.read();
meas = analog_value.read();
meas = analog_value.read();
meas = analog_value.read();
meas = analog_value.read();
meas = analog_value.read();
meas = analog_value.read();
meas = analog_value.read();
meas = analog_value.read();
meas = analog_value.read();
meas = analog_value.read();
meas = analog_value.read();
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noTitle
pc.printf("\n\r PWM analogWrite() : ");
//#endif
// Using pin 13 (system led) for output.
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<1; i++) {
for (j=0; j<10000; j++) {
PD13 = 0.5;
PD13 = 0.995;
PD13 = 0.005;
PD13 = 0.35;
PD13 = 0.85;
PD13 = 0.5;
PD13 = 0.995;
PD13 = 0.005;
PD13 = 0.35;
PD13 = 0.85;
PD13 = 0.5;
PD13 = 0.995;
PD13 = 0.005;
PD13 = 0.35;
PD13 = 0.85;
PD13 = 0.5;
PD13 = 0.995;
PD13 = 0.005;
PD13 = 0.35;
PD13 = 0.85;
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#endif
//#ifndef noTitle
pc.printf("\n\r DAC analogWrite() : ");
//#endif
// Using pin 13 (system led) for output.
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<1; i++) {
for (j=0; j<10000; j++) {
DACout = 0.5;
DACout = 0.995;
DACout = 0.005;
DACout = 0.35;
DACout = 0.85;
DACout = 0.5;
DACout = 0.995;
DACout = 0.005;
DACout = 0.35;
DACout = 0.85;
DACout = 0.5;
DACout = 0.995;
DACout = 0.005;
DACout = 0.35;
DACout = 0.85;
DACout = 0.5;
DACout = 0.995;
DACout = 0.005;
DACout = 0.35;
DACout = 0.85;
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#endif
//#ifndef noTitle
pc.printf("\n\r wait_ms(1) : ");
//#endif
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<1; i++) {
for (j=0; j<100; j++) {
wait_ms(1);
wait_ms(1);
wait_ms(1);
wait_ms(1);
wait_ms(1);
wait_ms(1);
wait_ms(1);
wait_ms(1);
wait_ms(1);
wait_ms(1);
wait_ms(1);
wait_ms(1);
wait_ms(1);
wait_ms(1);
wait_ms(1);
wait_ms(1);
wait_ms(1);
wait_ms(1);
wait_ms(1);
wait_ms(1);
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noTitle
pc.printf("\n\r wait_ms(100) : ");
//#endif
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<1; i++) {
for (j=0; j<2; j++) {
wait_ms(100);
wait_ms(100);
wait_ms(100);
wait_ms(100);
wait_ms(100);
wait_ms(100);
wait_ms(100);
wait_ms(100);
wait_ms(100);
wait_ms(100);
wait_ms(100);
wait_ms(100);
wait_ms(100);
wait_ms(100);
wait_ms(100);
wait_ms(100);
wait_ms(100);
wait_ms(100);
wait_ms(100);
wait_ms(100);
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noTitle
pc.printf("\n\r wait_us(2) : ");
//#endif
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<30; i++) {
for (j=0; j<1000; j++) {
wait_us(2);
wait_us(2);
wait_us(2);
wait_us(2);
wait_us(2);
wait_us(2);
wait_us(2);
wait_us(2);
wait_us(2);
wait_us(2);
wait_us(2);
wait_us(2);
wait_us(2);
wait_us(2);
wait_us(2);
wait_us(2);
wait_us(2);
wait_us(2);
wait_us(2);
wait_us(2);
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noTitle
pc.printf("\n\r wait_us(5) : ");
//#endif
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<5; i++) {
for (j=0; j<1000; j++) {
//pc.printfln ("Working");
wait_us(5);
wait_us(5);
wait_us(5);
wait_us(5);
wait_us(5);
wait_us(5);
wait_us(5);
wait_us(5);
wait_us(5);
wait_us(5);
wait_us(5);
wait_us(5);
wait_us(5);
wait_us(5);
wait_us(5);
wait_us(5);
wait_us(5);
wait_us(5);
wait_us(5);
wait_us(5);
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//#ifndef noTitle
pc.printf("\n\r wait_us(100) : ");
//#endif
wait_ms(70); // Allow the Serial text to be transmitted
m = timer.read_ms();
for (i=0; i<1; i++) {
for (j=0; j<1000; j++) {
wait_us(100);
wait_us(100);
wait_us(100);
wait_us(100);
wait_us(100);
wait_us(100);
wait_us(100);
wait_us(100);
wait_us(100);
wait_us(100);
wait_us(100);
wait_us(100);
wait_us(100);
wait_us(100);
wait_us(100);
wait_us(100);
wait_us(100);
wait_us(100);
wait_us(100);
wait_us(100);
}
}
n = timer.read_ms();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
pc.printf("%.3f us \n\r",d);
pc.printf("\n\r");
//*************************
//** Stop timer ***
//*************************
timer.stop();
//*************************
pc.printf("----- END --------");
pc.printf("-------------------");
wait(0.3);
}
//*********************************
//** MAIN block **
//*********************************
int main()
{
setup();
do {
pc.printf("\n\r Speed Test will begin momentarily \n\r");
pc.printf("\n\r");
wait(0.3);
speedTest();
wait(3);
} while (true);
}