Skip to content
Snippets Groups Projects
Commit 986cb251 authored by Christian Dietrich's avatar Christian Dietrich
Browse files

timing: computation-alarm benchmark

parent 81dfb29c
No related branches found
No related tags found
No related merge requests found
# Evalutation Scenario #1
DOSEK_BINARY(
NAME bench-timing-tmr
SYSTEM_DESC tmr.oil
LIBS libtest timing
SOURCES tmr.cc
)
# Evaluation Scenario #2
DOSEK_BINARY(
NAME bench-timing-computation_alarm
SYSTEM_DESC computation-alarm.oil
LIBS libtest timing
SOURCES computation-alarm.cc
)
DOSEK_BINARY( DOSEK_BINARY(
NAME bench-timing-activate_task NAME bench-timing-activate_task
SYSTEM_DESC activate-task.oil SYSTEM_DESC activate-task.oil
...@@ -35,12 +52,6 @@ DOSEK_BINARY( ...@@ -35,12 +52,6 @@ DOSEK_BINARY(
SOURCES computation-irq.cc SOURCES computation-irq.cc
) )
DOSEK_BINARY(
NAME bench-timing-tmr
SYSTEM_DESC tmr.oil
LIBS libtest timing
SOURCES tmr.cc
)
DOSEK_BINARY( DOSEK_BINARY(
NAME bench-timing-aborted_computation NAME bench-timing-aborted_computation
...@@ -56,6 +67,7 @@ DOSEK_BINARY( ...@@ -56,6 +67,7 @@ DOSEK_BINARY(
SOURCES alarm.cc SOURCES alarm.cc
) )
DOSEK_BINARY( DOSEK_BINARY(
NAME bench-timing-copter NAME bench-timing-copter
SYSTEM_DESC copter.oil SYSTEM_DESC copter.oil
......
/**
* @file
* @ingroup unit_tests
* @test Test repeated alarn task activation while performing syscalls
*/
#include "test/test.h"
#include "os/os.h"
#include "timing.h"
DeclareTask(Task1);
DeclareTask(Task4);
DeclareCounter(C1);
TIMING_MAKE_OS_MAIN( StartOS(0) )
GENERATE_TIME_CONSUMER(computation_0, 2300)
GENERATE_TIME_CONSUMER(computation_1, 50)
extern "C" {
noinline void timing_entry(void) {
timing_loop_bound(30, 30) for (unsigned i = 0; i < 30; i++) {
computation_0();
}
}
}
TASK(Task3) {
timing_start(0);
timing_entry();
timing_end(0);
/* ABB Split Point */
DisableAllInterrupts();
EnableAllInterrupts();
/* Dump Timing and shutdown machine. */
timing_dump();
TerminateTask();
}
TASK(Task4) {
computation_1();
TerminateTask();
}
CPU TestSystem {
OS TestSystem {
STATUS = STANDARD;
ERRORHOOK = FALSE;
STARTUPHOOK = FALSE;
SHUTDOWNHOOK = FALSE;
PRETASKHOOK = FALSE;
POSTTASKHOOK = FALSE;
};
TASK Task3 {
SCHEDULE = FULL;
PRIORITY = 1;
ACTIVATION = 1;
AUTOSTART = TRUE;
};
TASK Task4 {
SCHEDULE = FULL;
PRIORITY = 4;
ACTIVATION = 1;
AUTOSTART = FALSE;
};
ALARM A1 {
COUNTER = C1;
ACTION = ACTIVATETASK {
TASK = Task4;
};
AUTOSTART = TRUE {
ALARMTIME = 1;
CYCLETIME = 3;
};
};
COUNTER C1 {
MAXALLOWEDVALUE = 50000;
TICKSPERBASE = 1;
MINCYCLE = 1;
};
};
...@@ -20,25 +20,16 @@ DeclareResource(SPIBus); ...@@ -20,25 +20,16 @@ DeclareResource(SPIBus);
DeclareAlarm(CopterControlWatchdogAlarm); DeclareAlarm(CopterControlWatchdogAlarm);
TEST_MAKE_OS_MAIN( StartOS(0) ) TIMING_MAKE_OS_MAIN( StartOS(0) )
GENERATE_TIME_CONSUMER(calculation, 100)
GENERATE_TIME_CONSUMER(calculation_short, 10)
#define calculcation() do {} while(0)
//GENERATE_TIME_CONSUMER(calculation, 100)
//GENERATE_TIME_CONSUMER(calculation_short, 10)
#define calculation() do {} while(0)
#define calculation_short() do {} while(0)
int round; int round;
TASK(SignalGatherInitiateTask) { TASK(SignalGatherInitiateTask) {
/*
if (round == 9) {
calculation();
timing_dump();
ShutdownMachine();
}
calculation();
*/
GetResource(SPIBus); GetResource(SPIBus);
calculation(); calculation();
if ((round % 2) == 0) { if ((round % 2) == 0) {
...@@ -86,11 +77,10 @@ TASK(SignalProcessingAttitudeTask) { ...@@ -86,11 +77,10 @@ TASK(SignalProcessingAttitudeTask) {
} }
TASK(FlightControlTask) { TASK(FlightControlTask) {
timing_start(1);
calculation(); calculation();
ActivateTask(FlightControlAttitudeTask); ActivateTask(FlightControlAttitudeTask);
calculation();
ActivateTask(FlightControlActuateTask); ActivateTask(FlightControlActuateTask);
calculation();
ActivateTask(MavlinkSendTask); ActivateTask(MavlinkSendTask);
calculation(); calculation();
TerminateTask(); TerminateTask();
...@@ -109,34 +99,33 @@ TASK(FlightControlActuateTask) { ...@@ -109,34 +99,33 @@ TASK(FlightControlActuateTask) {
TASK(MavlinkSendTask) { TASK(MavlinkSendTask) {
calculation(); calculation();
GetResource(SPIBus); GetResource(SPIBus);
calculation(); calculation_short();
Machine::trigger_interrupt_from_user(37); Machine::trigger_interrupt_from_user(37);
ReleaseResource(SPIBus); ReleaseResource(SPIBus);
calculation(); calculation();
timing_end(1);
TerminateTask(); TerminateTask();
} }
TASK(CopterControlTask) { TASK(CopterControlTask) {
timing_end(1); timing_end(TIMING_POINT_NO_INTERRUPTS_IN_BLOCK | 2);
calculation(); calculation();
SuspendAllInterrupts(); SuspendAllInterrupts();
calculation(); calculation_short();
ResumeAllInterrupts(); ResumeAllInterrupts();
calculation(); calculation();
if (round < 5) { if (round < 5) {
CancelAlarm(CopterControlWatchdogAlarm); CancelAlarm(CopterControlWatchdogAlarm);
calculation();
SetRelAlarm(CopterControlWatchdogAlarm, 100, 100); SetRelAlarm(CopterControlWatchdogAlarm, 100, 100);
} }
calculation(); calculation();
TerminateTask(); TerminateTask();
} }
ISR2(MavlinkRecvHandler) { ISR2(MavlinkRecvHandler) {
timing_start(1); timing_start(2);
calculation_short(); calculation_short();
ActivateTask(CopterControlTask); ActivateTask(CopterControlTask);
calculation_short(); calculation_short();
...@@ -149,5 +138,15 @@ TASK(CopterControlWatchdogTask) { ...@@ -149,5 +138,15 @@ TASK(CopterControlWatchdogTask) {
void PreIdleHook() { void PreIdleHook() {
kout << "I" << round << endl; static int count = 0;
kout << "---\n";
if (++count > 5) {
if (timing_print() > 0) {
ShutdownMachine();
}
}
if (count == 50) {
timing_dump();
}
} }
...@@ -12,6 +12,7 @@ GENERATE_TIME_CONSUMER(calculation, 50) ...@@ -12,6 +12,7 @@ GENERATE_TIME_CONSUMER(calculation, 50)
/* We put the timing circuit into an extra non inlinable function, in /* We put the timing circuit into an extra non inlinable function, in
* order to make tradtional analysis simpler. * order to make tradtional analysis simpler.
*/ */
extern "C" {
noinline void timing_entry() { noinline void timing_entry() {
timing_start(0); timing_start(0);
...@@ -20,6 +21,7 @@ noinline void timing_entry() { ...@@ -20,6 +21,7 @@ noinline void timing_entry() {
} }
timing_end(0); timing_end(0);
} }
}
TASK(Control) { TASK(Control) {
......
...@@ -21,12 +21,16 @@ noinline uint64_t timing_end(int circuit) { ...@@ -21,12 +21,16 @@ noinline uint64_t timing_end(int circuit) {
return delta; return delta;
} }
noinline void timing_print() { noinline int timing_print() {
unsigned found = 0;
for (unsigned i = 0; i < CIRCUIT_MAX; ++i) { for (unsigned i = 0; i < CIRCUIT_MAX; ++i) {
if (circuits[i]) { if (circuits[i]) {
kout << "timing-" << i << " " << circuits_duration[i] << endl; kout << "timing-" << i << " " << circuits_duration[i] << endl;
circuits[i] = 0;
found ++;
} }
} }
return found;
} }
} }
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
extern "C" { extern "C" {
extern void timing_start(int circuit); extern void timing_start(int circuit);
extern uint64_t timing_end(int circuit); extern uint64_t timing_end(int circuit);
extern void timing_print(); extern int timing_print();
} }
#define timing_dump() asm volatile("trap 2") #define timing_dump() asm volatile("trap 2")
#define timing_loop_bound(low, high) _Pragma(STRINGIFY(loopbound min low max high)) #define timing_loop_bound(low, high) _Pragma(STRINGIFY(loopbound min low max high))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment