diff --git a/app/benchmark/timing/CMakeLists.txt b/app/benchmark/timing/CMakeLists.txt index 4b3c5485ece5d9a3d81c99af046bc8fd11493d10..aee9bb4713366d10cf93f2e7aca110439197fee5 100644 --- a/app/benchmark/timing/CMakeLists.txt +++ b/app/benchmark/timing/CMakeLists.txt @@ -1,3 +1,20 @@ +# 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( NAME bench-timing-activate_task SYSTEM_DESC activate-task.oil @@ -35,12 +52,6 @@ DOSEK_BINARY( SOURCES computation-irq.cc ) -DOSEK_BINARY( - NAME bench-timing-tmr - SYSTEM_DESC tmr.oil - LIBS libtest timing - SOURCES tmr.cc - ) DOSEK_BINARY( NAME bench-timing-aborted_computation @@ -56,6 +67,7 @@ DOSEK_BINARY( SOURCES alarm.cc ) + DOSEK_BINARY( NAME bench-timing-copter SYSTEM_DESC copter.oil diff --git a/app/benchmark/timing/computation-alarm.cc b/app/benchmark/timing/computation-alarm.cc new file mode 100644 index 0000000000000000000000000000000000000000..22374ba0fa2c57cbf88fff0f86493f42a24b0630 --- /dev/null +++ b/app/benchmark/timing/computation-alarm.cc @@ -0,0 +1,49 @@ +/** + * @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(); +} diff --git a/app/benchmark/timing/computation-alarm.oil b/app/benchmark/timing/computation-alarm.oil new file mode 100644 index 0000000000000000000000000000000000000000..f5a28f3d5dfe248f98bc08c6afe229307af4a2ab --- /dev/null +++ b/app/benchmark/timing/computation-alarm.oil @@ -0,0 +1,43 @@ +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; + }; +}; + diff --git a/app/benchmark/timing/copter.cc b/app/benchmark/timing/copter.cc index 6d5f7cd9aa46fdad944b64535ac4107a5aaa93be..f49a027ccdfa4c264ac5c5fb928f9266caed6e6e 100644 --- a/app/benchmark/timing/copter.cc +++ b/app/benchmark/timing/copter.cc @@ -20,25 +20,16 @@ DeclareResource(SPIBus); DeclareAlarm(CopterControlWatchdogAlarm); -TEST_MAKE_OS_MAIN( StartOS(0) ) - -GENERATE_TIME_CONSUMER(calculation, 100) -GENERATE_TIME_CONSUMER(calculation_short, 10) -#define calculcation() do {} while(0) +TIMING_MAKE_OS_MAIN( StartOS(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; TASK(SignalGatherInitiateTask) { - /* - if (round == 9) { - calculation(); - timing_dump(); - ShutdownMachine(); - } - calculation(); - */ - GetResource(SPIBus); calculation(); if ((round % 2) == 0) { @@ -86,14 +77,13 @@ TASK(SignalProcessingAttitudeTask) { } TASK(FlightControlTask) { - calculation(); - ActivateTask(FlightControlAttitudeTask); - calculation(); - ActivateTask(FlightControlActuateTask); - calculation(); - ActivateTask(MavlinkSendTask); - calculation(); - TerminateTask(); + timing_start(1); + calculation(); + ActivateTask(FlightControlAttitudeTask); + ActivateTask(FlightControlActuateTask); + ActivateTask(MavlinkSendTask); + calculation(); + TerminateTask(); } TASK(FlightControlAttitudeTask) { @@ -107,36 +97,35 @@ TASK(FlightControlActuateTask) { } TASK(MavlinkSendTask) { - calculation(); - GetResource(SPIBus); - calculation(); - Machine::trigger_interrupt_from_user(37); - ReleaseResource(SPIBus); - calculation(); - TerminateTask(); + calculation(); + GetResource(SPIBus); + calculation_short(); + Machine::trigger_interrupt_from_user(37); + ReleaseResource(SPIBus); + calculation(); + timing_end(1); + TerminateTask(); } TASK(CopterControlTask) { - timing_end(1); + timing_end(TIMING_POINT_NO_INTERRUPTS_IN_BLOCK | 2); calculation(); SuspendAllInterrupts(); - calculation(); + calculation_short(); ResumeAllInterrupts(); calculation(); if (round < 5) { CancelAlarm(CopterControlWatchdogAlarm); - calculation(); SetRelAlarm(CopterControlWatchdogAlarm, 100, 100); } - calculation(); - - TerminateTask(); + calculation(); + TerminateTask(); } ISR2(MavlinkRecvHandler) { - timing_start(1); + timing_start(2); calculation_short(); ActivateTask(CopterControlTask); calculation_short(); @@ -149,5 +138,15 @@ TASK(CopterControlWatchdogTask) { 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(); + } } diff --git a/app/benchmark/timing/tmr.cc b/app/benchmark/timing/tmr.cc index 1a31dc76cde6ddeb95a24715f9df7228a2c081f5..fa5a5f6493027b4124789ba0f1fad615b4643fc3 100644 --- a/app/benchmark/timing/tmr.cc +++ b/app/benchmark/timing/tmr.cc @@ -12,13 +12,15 @@ GENERATE_TIME_CONSUMER(calculation, 50) /* We put the timing circuit into an extra non inlinable function, in * order to make tradtional analysis simpler. */ -noinline void timing_entry() { - timing_start(0); - - timing_loop_bound(2, 3) for (unsigned i = 0; i < 3; i++) { - ActivateTask(Calculation); +extern "C" { + noinline void timing_entry() { + timing_start(0); + + timing_loop_bound(2, 3) for (unsigned i = 0; i < 3; i++) { + ActivateTask(Calculation); + } + timing_end(0); } - timing_end(0); } TASK(Control) { diff --git a/os/timing.cc b/os/timing.cc index 5a87381853335e0a6ae9be09a0088e6e1d73f588..560e5d13a49d95fbdc19f17c7132b2f664ed2569 100644 --- a/os/timing.cc +++ b/os/timing.cc @@ -21,12 +21,16 @@ noinline uint64_t timing_end(int circuit) { return delta; } -noinline void timing_print() { +noinline int timing_print() { + unsigned found = 0; for (unsigned i = 0; i < CIRCUIT_MAX; ++i) { if (circuits[i]) { kout << "timing-" << i << " " << circuits_duration[i] << endl; + circuits[i] = 0; + found ++; } } + return found; } } diff --git a/os/timing.h b/os/timing.h index fccb5e0c45d4dbf095bfe670897d418a65bb9afa..2c31ec79e1406688425be16c7d55bd77394275bd 100644 --- a/os/timing.h +++ b/os/timing.h @@ -7,7 +7,7 @@ extern "C" { extern void timing_start(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_loop_bound(low, high) _Pragma(STRINGIFY(loopbound min low max high))