diff --git a/app/benchmark/timing/CMakeLists.txt b/app/benchmark/timing/CMakeLists.txt index 8d290d10fd785743cfb80ac4027c22932d8b2ff6..18780337ef52117728044e62098989c443f00335 100644 --- a/app/benchmark/timing/CMakeLists.txt +++ b/app/benchmark/timing/CMakeLists.txt @@ -48,3 +48,10 @@ DOSEK_BINARY( LIBS libtest timing SOURCES alarm.cc ) + +DOSEK_BINARY( + NAME bench-timing-copter + SYSTEM_DESC copter.oil + LIBS libtest timing + SOURCES copter.cc +) diff --git a/app/benchmark/timing/copter.cc b/app/benchmark/timing/copter.cc new file mode 100644 index 0000000000000000000000000000000000000000..e9ed02909b018084dc98fbceab75547db83af25a --- /dev/null +++ b/app/benchmark/timing/copter.cc @@ -0,0 +1,150 @@ +#include "os.h" +#include "test/test.h" +#include "timing.h" +#include "machine.h" + +//extern "C" volatile uint32_t random_source =0 ; +DeclareTask(SignalGatherInitiateTask); +DeclareTask(SignalGatherFinishedTask); +DeclareTask(SignalGatherTimeoutTask); +DeclareTask(SignalProcessingActuateTask); +DeclareTask(SignalProcessingAttitudeTask); +DeclareTask(ActuateTask); +DeclareTask(FlightControlAttitudeTask); +DeclareTask(FlightControlActuateTask); +DeclareTask(MavlinkSendTask); +DeclareTask(CopterControlTask); +DeclareTask(MavlinkRecvHandler); + +DeclareResource(SPIBus); + +DeclareAlarm(CopterControlWatchdogAlarm); + +TEST_MAKE_OS_MAIN( StartOS(0) ) + +GENERATE_TIME_CONSUMER(calculation, 100) +GENERATE_TIME_CONSUMER(calculation_short, 10) + + +int round; + +TASK(SignalGatherInitiateTask) { + if (round == 9) { + calculation(); + timing_dump(); + ShutdownMachine(); + } + calculation(); + + GetResource(SPIBus); + calculation(); + if ((round % 2) == 0) { + ActivateTask(SignalGatherTimeoutTask); + calculation(); + } else { + ActivateTask(SignalGatherFinishedTask); + calculation(); + } + round ++; + calculation(); + ReleaseResource(SPIBus); + calculation(); + TerminateTask(); +} + +TASK(SignalGatherFinishedTask) { + timing_start(0); + calculation(); + ActivateTask(SignalProcessingAttitudeTask); + calculation(); + ActivateTask(SignalProcessingActuateTask); + calculation(); + timing_end(0); + TerminateTask(); +} + +TASK(SignalGatherTimeoutTask) { + calculation(); + GetResource(SPIBus); + calculation(); + ReleaseResource(SPIBus); + calculation(); + ChainTask(SignalGatherFinishedTask); +} + +volatile int calculate; + +TASK(SignalProcessingActuateTask) { + calculation(); + TerminateTask(); +} + +TASK(SignalProcessingAttitudeTask) { + calculation(); + TerminateTask(); +} + +TASK(FlightControlTask) { + calculation(); + ActivateTask(FlightControlAttitudeTask); + calculation(); + ActivateTask(FlightControlActuateTask); + calculation(); + ActivateTask(MavlinkSendTask); + calculation(); + TerminateTask(); +} + +TASK(FlightControlAttitudeTask) { + calculation(); + TerminateTask(); +} + +TASK(FlightControlActuateTask) { + calculation(); + TerminateTask(); +} + +TASK(MavlinkSendTask) { + calculation(); + GetResource(SPIBus); + calculation(); + Machine::trigger_interrupt_from_user(37); + ReleaseResource(SPIBus); + calculation(); + TerminateTask(); +} + +TASK(CopterControlTask) { + calculation(); + SuspendAllInterrupts(); + calculation(); + ResumeAllInterrupts(); + calculation(); + timing_end(1); + if (round < 5) { + CancelAlarm(CopterControlWatchdogAlarm); + calculation(); + SetRelAlarm(CopterControlWatchdogAlarm, 100, 100); + } + calculation(); + + TerminateTask(); +} + +ISR2(MavlinkRecvHandler) { + timing_start(1); + calculation_short(); + ActivateTask(CopterControlTask); + calculation_short(); +} + +TASK(CopterControlWatchdogTask) { + calculation(); + TerminateTask(); +} + + +void PreIdleHook() { + kout << "I" << round << endl; +} diff --git a/app/benchmark/timing/copter.oil b/app/benchmark/timing/copter.oil new file mode 100644 index 0000000000000000000000000000000000000000..f3e528d893bccea635980bf4bef24650aeafcac2 --- /dev/null +++ b/app/benchmark/timing/copter.oil @@ -0,0 +1,168 @@ +CPU CopterMock { + + OS Coptermock { + STATUS = STANDARD; + ERRORHOOK = FALSE; + STARTUPHOOK = FALSE; + SHUTDOWNHOOK = FALSE; + PRETASKHOOK = FALSE; + POSTTASKHOOK = FALSE; + }; + + TASKGROUP SignalGatherGroup { + PROMISE = SERIALIZED; + }; + + TASK SignalGatherInitiateTask { + SCHEDULE = FULL; + PRIORITY = 24; + ACTIVATION = 1; + AUTOSTART = FALSE; + RESOURCE = SPIBus; + TASKGROUP = SignalGatherGroup; + }; + + TASK SignalGatherFinishedTask { + SCHEDULE = FULL; + PRIORITY = 25; + ACTIVATION = 1; + AUTOSTART = FALSE; + RESOURCE = SPIBus; + TASKGROUP = SignalGatherGroup; + }; + + TASK SignalGatherTimeoutTask { + SCHEDULE = FULL; + PRIORITY = 23; + ACTIVATION = 1; + AUTOSTART = FALSE; + RESOURCE = SPIBus; + TASKGROUP = SignalGatherGroup; + }; + + TASK SignalProcessingActuateTask { + SCHEDULE = FULL; + PRIORITY = 22; + ACTIVATION = 1; + AUTOSTART = FALSE; + TASKGROUP = SignalGatherGroup; + }; + + TASK SignalProcessingAttitudeTask { + SCHEDULE = FULL; + PRIORITY = 21; + ACTIVATION = 1; + AUTOSTART = FALSE; + TASKGROUP = SignalGatherGroup; + }; + + /* Actuate Tasks */ + TASKGROUP FlightControlGroup { + PROMISE = SERIALIZED; + }; + + TASK FlightControlTask { + SCHEDULE = NON; + PRIORITY = 11; + ACTIVATION = 1; + AUTOSTART = FALSE; + TASKGROUP = FlightControlGroup; + }; + + TASK FlightControlAttitudeTask { + SCHEDULE = FULL; + PRIORITY = 12; + ACTIVATION = 1; + AUTOSTART = FALSE; + TASKGROUP = FlightControlGroup; + }; + + TASK FlightControlActuateTask { + SCHEDULE = FULL; + PRIORITY = 13; + ACTIVATION = 1; + AUTOSTART = FALSE; + TASKGROUP = FlightControlGroup; + }; + + TASK MavlinkSendTask { + SCHEDULE = FULL; + PRIORITY = 10; + ACTIVATION = 1; + AUTOSTART = FALSE; + TASKGROUP = FlightControlGroup; + }; + + /* Watchdog Task */ + TASKGROUP WatchdogGroup { + PROMISE = SERIALIZED; + }; + TASK CopterControlWatchdogTask { + SCHEDULE = NON; + PRIORITY = 1; + ACTIVATION = 1; + AUTOSTART = FALSE; + TASKGROUP = WatchdogGroup; + }; + + /* Remote Control Task */ + TASKGROUP MavlinkReceiveGroup { + PROMISE = SERIALIZED; + }; + + TASK CopterControlTask { + SCHEDULE = FULL; + PRIORITY = 5; + ACTIVATION = 1; + AUTOSTART = FALSE; + TASKGROUP = MavlinkReceiveGroup; + }; + ISR MavlinkRecvHandler { + CATEGORY = 2; + PRIORITY = 100; + DEVICE = 37; + TASKGROUP = MavlinkReceiveGroup; + MINIAT = 200000; + }; + + RESOURCE SPIBus { + RESOURCEPROPERTY = STANDARD; + }; + + ALARM SignalGatherAlarm { + COUNTER = C1; + ACTION = ACTIVATETASK { + TASK = SignalGatherInitiateTask; + }; + AUTOSTART = TRUE { + ALARMTIME = 10; + CYCLETIME = 30; + }; + }; + + ALARM FlightControlAlarm { + COUNTER = C1; + ACTION = ACTIVATETASK { + TASK = FlightControlTask; + }; + AUTOSTART = TRUE { + ALARMTIME = 10; + CYCLETIME = 90; + }; + }; + + ALARM CopterControlWatchdogAlarm { + COUNTER = C1; + ACTION = ACTIVATETASK { + TASK = CopterControlWatchdogTask; + }; + }; + + COUNTER C1 { + MAXALLOWEDVALUE = 50000; + TICKSPERBASE = 1; + MINCYCLE = 1; + }; + +}; +