diff options
-rw-r--r-- | tests/framework/instruments/WallClockTimer.cpp | 44 | ||||
-rw-r--r-- | tests/framework/instruments/WallClockTimer.h | 11 |
2 files changed, 50 insertions, 5 deletions
diff --git a/tests/framework/instruments/WallClockTimer.cpp b/tests/framework/instruments/WallClockTimer.cpp index 9063da0613..763fb9ab27 100644 --- a/tests/framework/instruments/WallClockTimer.cpp +++ b/tests/framework/instruments/WallClockTimer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 Arm Limited. + * Copyright (c) 2017-2021 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -48,13 +48,44 @@ std::string WallClock<output_timestamps>::id() const template <bool output_timestamps> void WallClock<output_timestamps>::start() { +#if defined(BARE_METAL) + uint64_t tmp; + uint64_t retval; + + __asm __volatile( + "mrs %[tmp], pmcr_el0\n" + "orr %[tmp], %[tmp], #1\n" + "msr pmcr_el0, %[tmp]\n" + "mrs %[tmp], pmcntenset_el0\n" + "orr %[tmp], %[tmp], #1<<31\n" + "msr pmcntenset_el0, %[tmp]\n" + "mrs %[retval], pmccntr_el0\n" + : [tmp] "=r"(tmp), [retval] "=r"(retval)); + + _start = retval; +#else // !defined(BARE_METAL) _start = std::chrono::system_clock::now(); +#endif // defined(BARE_METAL) } template <bool output_timestamps> void WallClock<output_timestamps>::stop() { +#if defined(BARE_METAL) + uint64_t tmp; + uint64_t retval; + + __asm __volatile( + "mrs %[retval], pmccntr_el0\n" + "mov %[tmp], #0x3f\n" + "orr %[tmp], %[tmp], #1<<31\n" + "msr pmcntenclr_el0, %[tmp]\n" + : [tmp] "=r"(tmp), [retval] "=r"(retval)); + + _stop = retval; +#else // !defined(BARE_METAL) _stop = std::chrono::system_clock::now(); +#endif // defined(BARE_METAL) } template <bool output_timestamps> @@ -63,14 +94,23 @@ Instrument::MeasurementsMap WallClock<output_timestamps>::measurements() const MeasurementsMap measurements; if(output_timestamps) { - // _start / _stop are in ns, so divide by an extra 1000: +#if defined(BARE_METAL) + measurements.emplace("[start]Wall clock time", Measurement(_start / static_cast<uint64_t>(_scale_factor), _unit)); + measurements.emplace("[end]Wall clock time", Measurement(_stop / static_cast<uint64_t>(_scale_factor), _unit)); +#else // !defined(BARE_METAL) measurements.emplace("[start]Wall clock time", Measurement(_start.time_since_epoch().count() / static_cast<uint64_t>(1000 * _scale_factor), _unit)); measurements.emplace("[end]Wall clock time", Measurement(_stop.time_since_epoch().count() / static_cast<uint64_t>(1000 * _scale_factor), _unit)); +#endif // defined(BARE_METAL) } else { +#if defined(BARE_METAL) + const double delta = _stop - _start; + measurements.emplace("Wall clock time", Measurement(delta / static_cast<double>(1000 * _scale_factor), _unit)); +#else // !defined(BARE_METAL) const auto delta = std::chrono::duration_cast<std::chrono::microseconds>(_stop - _start); measurements.emplace("Wall clock time", Measurement(delta.count() / _scale_factor, _unit)); +#endif // defined(BARE_METAL) } return measurements; } diff --git a/tests/framework/instruments/WallClockTimer.h b/tests/framework/instruments/WallClockTimer.h index 1ca4fe2c36..b1d7531f4e 100644 --- a/tests/framework/instruments/WallClockTimer.h +++ b/tests/framework/instruments/WallClockTimer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 Arm Limited. + * Copyright (c) 2017-2021 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -70,9 +70,14 @@ public: MeasurementsMap measurements() const override; private: - std::chrono::system_clock::time_point _start{}; +#if defined(BARE_METAL) + uint64_t _start {}; + uint64_t _stop{}; +#else // !defined(BARE_METAL) + std::chrono::system_clock::time_point _start {}; std::chrono::system_clock::time_point _stop{}; - float _scale_factor{}; +#endif // defined(BARE_METAL) + float _scale_factor {}; }; using WallClockTimer = WallClock<false>; |