diff --git a/app/benchmark/timing/aborted-computation.cc b/app/benchmark/timing/aborted-computation.cc index 944523a6ee7e8763fe46afc99868d16dad5f4a41..964b1655d6614f9e2befffaadf99b1004f1a92b0 100644 --- a/app/benchmark/timing/aborted-computation.cc +++ b/app/benchmark/timing/aborted-computation.cc @@ -14,16 +14,16 @@ GENERATE_TIME_CONSUMER(computation, 5000) extern "C" { void timing_entry() { + timing_start(0); ActivateTask(Computation); WaitEvent(ComputationFinished | ComputationAborted); + timing_end(TIMING_POINT_NO_INTERRUPTS_IN_BLOCK | 0); } } TASK(Control) { - timing_start(0); timing_entry(); - timing_end(TIMING_POINT_NO_INTERRUPTS_IN_BLOCK | 0); /* ABB Split Point */ DisableAllInterrupts(); diff --git a/app/benchmark/timing/activate-task.cc b/app/benchmark/timing/activate-task.cc index e79bf776f269f73d31032d8b22d389a40c9754a3..916c044ed63d60799eb0e2d0df31246cc90159dd 100644 --- a/app/benchmark/timing/activate-task.cc +++ b/app/benchmark/timing/activate-task.cc @@ -12,38 +12,49 @@ TIMING_MAKE_OS_MAIN( StartOS(0) ) GENERATE_TIME_CONSUMER(timing_1, 100) GENERATE_TIME_CONSUMER(timing_2, 100) +extern "C" { + void timing_entry_0() { + /* Timing Circuit 0: + - ActivateTask will not dispatch to Handler 12 + */ + timing_start(0); + ActivateTask(Handler12); + timing_end(0); + } + + void timing_entry_1() { + /* The Timing Circuit 1 has the following properties: + - Activate Task will always Dispatch to upper Task + */ + timing_start(1); + ActivateTask(Handler13); + timing_end(1); + } + + void timing_entry_2() { + /* The Timing Circuit 2 has the following properties: + - Terminate and goto immediate task. + */ + timing_start(2); + TerminateTask(); + } -TASK(Handler11) { - /* Timing Circuit 0: - - ActivateTask will not dispatch to Handler 12 - */ - timing_start(0); - - ActivateTask(Handler12); - - timing_end(0); +} +TASK(Handler11) { + timing_entry_0(); /* ABB Split Point */ DisableAllInterrupts(); EnableAllInterrupts(); - /* The Timing Circuit 1 has the following properties: - - Activate Task will always Dispatch to upper Task - */ - timing_start(1); - - ActivateTask(Handler13); - - timing_end(1); + timing_entry_1(); /* ABB Split Point */ DisableAllInterrupts(); EnableAllInterrupts(); - timing_start(2); - - TerminateTask(); + timing_entry_2(); } TASK(Handler12) { diff --git a/app/benchmark/timing/all.sh b/app/benchmark/timing/all.sh index cb604f81bf790123dc961f494ebe9cca1a008661..cc159543626f7cf751a5df73eedac7e24825881b 100755 --- a/app/benchmark/timing/all.sh +++ b/app/benchmark/timing/all.sh @@ -19,5 +19,10 @@ export NO_HEADER=1 #./run bench-timing-simple_interrupt 1 #./run bench-timing-alarm 0 +TIMING=$(pwd) +# Manual Analysis +cd ../../../build; +${TIMING}/manual-syswcet.py --all -d bench-timing-manual.dref -vv + cd ${ALL_PWD} diff --git a/app/benchmark/timing/interrupt-reaction.cc b/app/benchmark/timing/interrupt-reaction.cc index dcd43ee931bf929dd65454e7b29c177685444aec..e2b0a547fc233b76f1d59f356d91f53fe570b194 100644 --- a/app/benchmark/timing/interrupt-reaction.cc +++ b/app/benchmark/timing/interrupt-reaction.cc @@ -7,10 +7,13 @@ TEST_MAKE_OS_MAIN( StartOS(0) ) DeclareTask(H2); + TASK(H1) { timing_start(0 | TIMING_POINT_START_INTERRUPT_IN_BLOCK); Machine::trigger_interrupt_from_user(37); /* IRQ + H2 */ + + timing_dump(); TerminateTask(); } diff --git a/app/benchmark/timing/manual-syswcet.py b/app/benchmark/timing/manual-syswcet.py index ecdd3d52ba9a97fd558718964fd1100037b13bfc..ff05339bc6877e2f4f2359cd2dd16c205db36a6c 100755 --- a/app/benchmark/timing/manual-syswcet.py +++ b/app/benchmark/timing/manual-syswcet.py @@ -85,7 +85,8 @@ def parse_args(): parser.add_argument('-b', '--bench', dest='bench', help='the benchmark under analysis', - choices=['tmr','computation_alarm','aborted_computation'], + choices=['tmr','computation_alarm','aborted_computation', 'copter', + 'activate_task', 'wait_event', 'interrupt_reaction'], required=False, default=None) parser.add_argument('-d', '--dref', dest='dref_file', @@ -140,10 +141,11 @@ def dref_key(dref_file, key, value): if os.path.exists(dref_file): with open(dref_file) as fd: content += [x.strip() for x in fd.readlines()] - line = '\\drefset{/%s/%s}{%s}' %(key, DREF_KEY, value) + key = '\\drefset{/%s/%s}' %(key, DREF_KEY) + line = '%s{%s}' %(key, value) found = False for idx in range(0, len(content)): - if content[idx].startswith("\\drefset{%s}" % key): + if content[idx].startswith(key): content[idx] = line found = True break @@ -180,7 +182,7 @@ def add_events_with_iat(cy_base, events = []): for (iat, cyc, name) in events: occ = (int(cy_total) // int(iat)) + 1 cy_total += occ * cyc - occurences[name] = occ + occurences[name] = (occ, occ * cyc) return cy_total, occurences @@ -243,6 +245,101 @@ def main(): dref_key(args.dref_file, "aborted computation", int(cy_total)) + # 4 syscall benchmarks + if args.all or args.bench == 'activate_task': + args.bench = 'activate_task' + cy_timing_0 = get_cycles_from_entry('timing_entry_0', args.bench) + dref_key(args.dref_file, "activate 0", int(cy_timing_0)) + cy_timing_1 = get_cycles_from_entry('timing_entry_1', args.bench) + cy_Handler13 = get_cycles_from_entry('OSEKOS_TASK_FUNC_Handler13', args.bench) + dref_key(args.dref_file, "activate 1", int(cy_timing_1+cy_Handler13)) + + cy_timing_2 = get_cycles_from_entry('timing_entry_2', args.bench) + cy_Handler12 = get_cycles_from_entry('OSEKOS_TASK_FUNC_Handler12', args.bench) + cy_idle = get_cycles_from_entry('__OS_HOOK_PreIdleHook', args.bench) + + dref_key(args.dref_file, "activate 2", int(cy_timing_2+cy_Handler12+cy_idle)) + + if args.all or args.bench == 'wait_event': + args.bench = 'wait_event' + cy_timing_entry = get_cycles_from_entry('timing_entry', args.bench) + cy_H2 = get_cycles_from_entry('OSEKOS_TASK_FUNC_H2', args.bench) + dref_key(args.dref_file, "wait event", int(cy_timing_entry + cy_H2)) + + if args.all or args.bench == 'interrupt_reaction': + args.bench = 'interrupt_reaction' + cy_ISR = get_cycles_from_entry('irq_entry', args.bench, ["irq_entry : <> : OSEKOS_ISR_ISR1 = 1"]) + cy_H2 = get_cycles_from_entry('OSEKOS_TASK_FUNC_H2', args.bench) + + dref_key(args.dref_file, "interrupt reaction", int(cy_ISR + cy_H2)) + + + if args.all or args.bench == 'copter': + args.bench = 'copter' + iat_timer = 100000 + cy_timer_isr = get_cycles_from_entry('irq_entry', args.bench, ["irq_entry : <> : timer_isr = 1"]) + + iat_mavlink = 200000 + cy_ISR_Mavlink = get_cycles_from_entry('irq_entry', args.bench, ["irq_entry : <> : OSEKOS_ISR_MavlinkRecvHandler = 1"]) + + cy_threads = {} + for thread in ( + 'SignalGatherInitiateTask', + 'SignalGatherFinishedTask', + 'SignalGatherTimeoutTask', + 'SignalProcessingActuateTask', + 'SignalProcessingAttitudeTask', + 'FlightControlTask', + 'FlightControlAttitudeTask', + 'FlightControlActuateTask', + 'MavlinkSendTask', + 'CopterControlWatchdogTask', + 'CopterControlTask', + ): + cy_threads[thread] = get_cycles_from_entry('OSEKOS_TASK_FUNC_'+thread, 'copter') + + cy_signal_processing = cy_threads['SignalGatherInitiateTask'] +\ + cy_threads['SignalGatherFinishedTask'] +\ + cy_threads['SignalGatherTimeoutTask'] + \ + cy_threads['SignalProcessingActuateTask'] +\ + cy_threads['SignalProcessingAttitudeTask'] + + cy_copter_0,occurences = add_events_with_iat( + cy_signal_processing, + [(iat_timer, cy_timer_isr, 'timer'), (iat_mavlink, cy_ISR_Mavlink, 'mavlink')] + ) + logging.info("copter 0: %s", occurences) + dref_key(args.dref_file, "copter 0", cy_copter_0) + + + cy_flight_control = cy_threads['FlightControlTask'] + \ + cy_threads['FlightControlAttitudeTask'] +\ + cy_threads['FlightControlActuateTask'] + \ + cy_threads['MavlinkSendTask'] + + + cy_copter_1, occurences = add_events_with_iat( + cy_flight_control, + [(iat_timer, cy_timer_isr, 'timer'), (3 * iat_timer, cy_signal_processing, 'signal-processing'), + (iat_mavlink, cy_ISR_Mavlink, 'mavlink')] + ) + + logging.info("copter 1: %s", occurences) + dref_key(args.dref_file, "copter 1", cy_copter_1) + + cy_rc_control = cy_ISR_Mavlink + \ + cy_threads['CopterControlTask'] + + cy_copter_2, occurences = add_events_with_iat( + cy_rc_control, + [(iat_timer, cy_timer_isr, 'timer'), + (3 * iat_timer, cy_signal_processing, 'signal-processing'), + (9 * iat_timer, cy_flight_control, 'flight-control'), + ] + ) + + logging.info("copter 2: %s", occurences) + dref_key(args.dref_file, "copter 2", cy_copter_2) if __name__=='__main__': main() diff --git a/app/benchmark/timing/run b/app/benchmark/timing/run index 1c0344283254bbe4f85a753a954495451de1fc08..ff85235e9426f9241306695411be529b1c5bc517 100755 --- a/app/benchmark/timing/run +++ b/app/benchmark/timing/run @@ -38,8 +38,8 @@ make test-$BM &> $TRACE_OUTPUT out_circuit=0 # iterate over all circuits dumped by the simulation -for i in $(grep -P timing-[0-9]+ ${TRACE_OUTPUT} | cut -d' ' -f 2); do - +for i in $(grep -P timing-[0-9]+ ${TRACE_OUTPUT} | cut -d' ' -f 2); do + # the trace will dump all circuits # However, only the current CIRCUIT is required if [ "${out_circuit}" -eq "${CIRCUIT}" ]; then @@ -49,4 +49,8 @@ for i in $(grep -P timing-[0-9]+ ${TRACE_OUTPUT} | cut -d' ' -f 2); do out_circuit=$(expr ${out_circuit} + 1) done +if [ x"$CIRCUIT" = x"0" ]; then + platin blocking-time -i $BM-system.pml --wca-detect-gurobi --dref-stats $BM.dref +fi + cd ${RUN_PWD} diff --git a/app/benchmark/timing/wait-event.cc b/app/benchmark/timing/wait-event.cc index 476765cf61af288dd137772fb440e94ec45b7214..b2648a343639c22ee7974f8a51f5c6ce6985f7c7 100644 --- a/app/benchmark/timing/wait-event.cc +++ b/app/benchmark/timing/wait-event.cc @@ -10,13 +10,18 @@ DeclareEvent(E2); bool done; +extern "C" { + void timing_entry() { + timing_start(0); + WaitEvent(E1); + timing_end(0); + } +} TASK(H1) { ActivateTask(H2); - timing_start(0); - WaitEvent(E1); - timing_end(0); + timing_entry(); /* ABB Split Point */ DisableAllInterrupts(); @@ -32,11 +37,3 @@ TASK(H2) { SetEvent(H1, E1); TerminateTask(); } - -TASK(H3) { - TerminateTask(); -} - -void PreIdleHook() { - Machine::trigger_interrupt_from_user(37); -} diff --git a/app/benchmark/timing/wait-event.oil b/app/benchmark/timing/wait-event.oil index 1995bce4420dcc4d2b3452f44ae2211257c9f860..b6bc685fd098eba87358b9902de40a62aa5ee906 100644 --- a/app/benchmark/timing/wait-event.oil +++ b/app/benchmark/timing/wait-event.oil @@ -26,21 +26,13 @@ CPU TestSystem { EVENT = E2; }; - TASK H3 { - SCHEDULE = NON; - PRIORITY = 5; - ACTIVATION = 1; - AUTOSTART = FALSE; - EVENT = E2; + EVENT E1 { + MASK = AUTO; }; - EVENT E1 { - MASK = AUTO; - }; - - EVENT E2 { - MASK = AUTO; - }; + EVENT E2 { + MASK = AUTO; + }; };