diff options
Diffstat (limited to 'include/object')
-rw-r--r-- | include/object/ptalog.h | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/include/object/ptalog.h b/include/object/ptalog.h index 9d30a40..6394474 100644 --- a/include/object/ptalog.h +++ b/include/object/ptalog.h @@ -29,6 +29,8 @@ class PTALog { #ifdef PTALOG_TIMING counter_value_t timer; counter_overflow_t overflow; + counter_value_t prev_state_timer; + counter_overflow_t prev_state_overflow; #endif #ifdef PTALOG_WITH_RETURNVALUES uint16_t return_value; @@ -55,9 +57,19 @@ class PTALog { } #ifdef PTALOG_TIMING - void passNop(Counter& counter) + /* + * This function is meant to estimate the overhead of counter.start() + * and counter.stop(). It immediately restarts the counter to ensure that + * state durations are captured accurately. + * This means that the overflow value is unusable. We assume that there + * are no overflows in this short time span. + */ + inline void passNop() { - kout << "[PTA] nop=" << counter.value << "/" << counter.overflow << endl; + counter.start(); + counter.stop(); + counter.start(); // .value is kept until .stop + kout << "[PTA] nop=" << counter.value << "/" << 0 << endl; } #endif @@ -76,7 +88,12 @@ class PTALog { void stopBenchmark() { +#ifdef PTALOG_TIMING + counter.stop(); + kout << "[PTA] benchmark stop, cycles=" << counter.value << "/" << counter.overflow << endl; +#else kout << "[PTA] benchmark stop" << endl; +#endif } void dump(uint16_t trace_id) @@ -85,6 +102,7 @@ class PTALog { for (uint8_t i = 0; i < log_index; i++) { kout << "[PTA] transition=" << log[i].transition_id; #ifdef PTALOG_TIMING + kout << " prevcycles=" << log[i].prev_state_timer << "/" << log[i].prev_state_overflow; kout << " cycles=" << log[i].timer << "/" << log[i].overflow; #endif #ifdef PTALOG_WITH_RETURNVALUES @@ -97,6 +115,9 @@ class PTALog { #ifdef PTALOG_GPIO_BAR void startTransition(char const *code, uint8_t code_length) { + counter.stop(); + log[log_index - 1].prev_state_timer = counter.value; + log[log_index - 1].prev_state_overflow = counter.overflow; // Quiet zone (must last at least 10x longer than a module) arch.sleep_ms(60); for (uint8_t byte = 0; byte < code_length; byte++) { @@ -109,6 +130,7 @@ class PTALog { gpio.write(sync_pin, 0); // Quiet zone arch.sleep_ms(60); + counter.start(); } #else inline void startTransition() @@ -118,7 +140,14 @@ class PTALog { arch.sleep_ms(10); gpio.write(sync_pin, 0); arch.sleep_ms(10); -#else +#endif +#ifdef PTALOG_TIMING + counter.stop(); + log[log_index - 1].prev_state_timer = counter.value; + log[log_index - 1].prev_state_overflow = counter.overflow; + counter.start(); +#endif +#ifndef PTALOG_GPIO_BEFORE gpio.write(sync_pin, 1); #endif } @@ -131,11 +160,7 @@ class PTALog { } #endif -#ifdef PTALOG_TIMING - inline void stopTransition(Counter& counter) -#else inline void stopTransition() -#endif { #ifdef PTALOG_GPIO #if !defined(PTALOG_GPIO_BEFORE) && !defined(PTALOG_GPIO_BAR) @@ -143,8 +168,10 @@ class PTALog { #endif #endif #ifdef PTALOG_TIMING + counter.stop(); log[log_index - 1].timer = counter.value; log[log_index - 1].overflow = counter.overflow; + counter.start(); #endif } }; |