Simple 64-bit timer for mbed. It is a drastically simplified version of Timer64 class by Tom Doyle. It is meant to be used in single-thread applications, where timer is used frequently, while standard 32-bit Timer is not enough.
Fork of Timer64 by
Timer64Simple.cpp@9:79633fe7d95b, 2017-06-09 (annotated)
- Committer:
- andriym
- Date:
- Fri Jun 09 13:32:48 2017 +0000
- Revision:
- 9:79633fe7d95b
- Parent:
- Timer64.cpp@8:5d17ff4f9c23
Simplified version (removed semaphore and rollover check timer).
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tedoyle | 0:1e0e79e82839 | 1 | /* |
tedoyle | 0:1e0e79e82839 | 2 | * Licensed under the Apache License, Version 2.0 (the "License"); |
tedoyle | 0:1e0e79e82839 | 3 | * you may not use this file except in compliance with the License. |
tedoyle | 0:1e0e79e82839 | 4 | * You may obtain a copy of the License at |
tedoyle | 0:1e0e79e82839 | 5 | * |
tedoyle | 0:1e0e79e82839 | 6 | * http://www.apache.org/licenses/LICENSE-2.0 |
tedoyle | 0:1e0e79e82839 | 7 | * |
tedoyle | 0:1e0e79e82839 | 8 | * Unless required by applicable law or agreed to in writing, software |
tedoyle | 0:1e0e79e82839 | 9 | * distributed under the License is distributed on an "AS IS" BASIS, |
tedoyle | 0:1e0e79e82839 | 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
tedoyle | 0:1e0e79e82839 | 11 | * See the License for the specific language governing permissions and |
tedoyle | 0:1e0e79e82839 | 12 | * limitations under the License. |
tedoyle | 0:1e0e79e82839 | 13 | */ |
tedoyle | 0:1e0e79e82839 | 14 | |
andriym | 9:79633fe7d95b | 15 | #include "Timer64Simple.h" |
tedoyle | 0:1e0e79e82839 | 16 | #include "ticker_api.h" |
tedoyle | 0:1e0e79e82839 | 17 | #include "us_ticker_api.h" |
tedoyle | 0:1e0e79e82839 | 18 | |
andriym | 9:79633fe7d95b | 19 | Timer64Simple::Timer64Simple() : |
andriym | 9:79633fe7d95b | 20 | _timerRunning(false), |
andriym | 9:79633fe7d95b | 21 | _tickerLastTimeUsec(0u), |
andriym | 9:79633fe7d95b | 22 | _totalTimeUsec(TIMER64_TOTAL_TIME_INIT), |
andriym | 9:79633fe7d95b | 23 | _ticker_data(get_us_ticker_data()) |
andriym | 9:79633fe7d95b | 24 | { |
andriym | 9:79633fe7d95b | 25 | ; |
andriym | 9:79633fe7d95b | 26 | } |
andriym | 9:79633fe7d95b | 27 | |
andriym | 9:79633fe7d95b | 28 | Timer64Simple::~Timer64Simple() |
tedoyle | 0:1e0e79e82839 | 29 | { |
tedoyle | 3:8396d3e6eb62 | 30 | ; |
tedoyle | 0:1e0e79e82839 | 31 | } |
tedoyle | 0:1e0e79e82839 | 32 | |
andriym | 9:79633fe7d95b | 33 | void Timer64Simple::start(void) |
tedoyle | 0:1e0e79e82839 | 34 | { |
andriym | 9:79633fe7d95b | 35 | if (!_timerRunning) |
andriym | 9:79633fe7d95b | 36 | { |
andriym | 9:79633fe7d95b | 37 | _tickerLastTimeUsec = ticker_read(_ticker_data); |
andriym | 9:79633fe7d95b | 38 | _timerRunning = true; |
andriym | 9:79633fe7d95b | 39 | } |
tedoyle | 0:1e0e79e82839 | 40 | } |
tedoyle | 0:1e0e79e82839 | 41 | |
andriym | 9:79633fe7d95b | 42 | void Timer64Simple::stop(void) |
tedoyle | 0:1e0e79e82839 | 43 | { |
andriym | 9:79633fe7d95b | 44 | if (_timerRunning) |
tedoyle | 0:1e0e79e82839 | 45 | { |
andriym | 9:79633fe7d95b | 46 | _read_us(); |
andriym | 9:79633fe7d95b | 47 | _timerRunning = false; |
tedoyle | 0:1e0e79e82839 | 48 | } |
tedoyle | 0:1e0e79e82839 | 49 | } |
tedoyle | 0:1e0e79e82839 | 50 | |
andriym | 9:79633fe7d95b | 51 | void Timer64Simple::reset(void) |
tedoyle | 0:1e0e79e82839 | 52 | { |
tedoyle | 0:1e0e79e82839 | 53 | if (_timerRunning) |
tedoyle | 0:1e0e79e82839 | 54 | { |
andriym | 9:79633fe7d95b | 55 | _tickerLastTimeUsec = ticker_read(_ticker_data); |
tedoyle | 0:1e0e79e82839 | 56 | } |
tedoyle | 0:1e0e79e82839 | 57 | |
andriym | 9:79633fe7d95b | 58 | _totalTimeUsec = TIMER64_TOTAL_TIME_INIT; |
tedoyle | 0:1e0e79e82839 | 59 | } |
tedoyle | 0:1e0e79e82839 | 60 | |
andriym | 9:79633fe7d95b | 61 | uint64_t Timer64Simple::read_us() |
tedoyle | 0:1e0e79e82839 | 62 | { |
andriym | 9:79633fe7d95b | 63 | if (_timerRunning) |
tedoyle | 0:1e0e79e82839 | 64 | { |
andriym | 9:79633fe7d95b | 65 | return _read_us(); |
tedoyle | 0:1e0e79e82839 | 66 | } |
andriym | 9:79633fe7d95b | 67 | return _totalTimeUsec; |
tedoyle | 0:1e0e79e82839 | 68 | } |
tedoyle | 0:1e0e79e82839 | 69 | |
andriym | 9:79633fe7d95b | 70 | uint64_t Timer64Simple::read_ms() |
tedoyle | 0:1e0e79e82839 | 71 | { |
andriym | 9:79633fe7d95b | 72 | if (_timerRunning) |
tedoyle | 0:1e0e79e82839 | 73 | { |
andriym | 9:79633fe7d95b | 74 | return _read_us()/1000LU; |
tedoyle | 3:8396d3e6eb62 | 75 | } |
andriym | 9:79633fe7d95b | 76 | return _totalTimeUsec/1000LU; |
tedoyle | 0:1e0e79e82839 | 77 | } |
tedoyle | 0:1e0e79e82839 | 78 | |
andriym | 9:79633fe7d95b | 79 | double Timer64Simple::read() |
tedoyle | 0:1e0e79e82839 | 80 | { |
andriym | 9:79633fe7d95b | 81 | if (_timerRunning) |
tedoyle | 3:8396d3e6eb62 | 82 | { |
andriym | 9:79633fe7d95b | 83 | return (double)_read_us()/1000000.0L; |
tedoyle | 3:8396d3e6eb62 | 84 | } |
andriym | 9:79633fe7d95b | 85 | return (double)_totalTimeUsec/1000000.0L; |
tedoyle | 0:1e0e79e82839 | 86 | } |
tedoyle | 0:1e0e79e82839 | 87 | |
andriym | 9:79633fe7d95b | 88 | bool Timer64Simple::is_running() |
tedoyle | 0:1e0e79e82839 | 89 | { |
andriym | 9:79633fe7d95b | 90 | return(_timerRunning); |
tedoyle | 0:1e0e79e82839 | 91 | } |
tedoyle | 0:1e0e79e82839 | 92 | |
andriym | 9:79633fe7d95b | 93 | uint64_t Timer64Simple::_read_us() |
tedoyle | 4:9ca673a83acb | 94 | { |
andriym | 9:79633fe7d95b | 95 | timestamp_t tickerCurrentTimeUsec = ticker_read(_ticker_data); |
tedoyle | 3:8396d3e6eb62 | 96 | |
tedoyle | 3:8396d3e6eb62 | 97 | // check for ticker time rollover |
tedoyle | 3:8396d3e6eb62 | 98 | |
andriym | 9:79633fe7d95b | 99 | if (tickerCurrentTimeUsec >= _tickerLastTimeUsec) |
tedoyle | 3:8396d3e6eb62 | 100 | { |
andriym | 9:79633fe7d95b | 101 | _totalTimeUsec += (uint64_t)(tickerCurrentTimeUsec - _tickerLastTimeUsec); |
tedoyle | 3:8396d3e6eb62 | 102 | } |
tedoyle | 3:8396d3e6eb62 | 103 | else |
tedoyle | 3:8396d3e6eb62 | 104 | { |
tedoyle | 3:8396d3e6eb62 | 105 | // rollover! |
andriym | 9:79633fe7d95b | 106 | _totalTimeUsec += (uint64_t)(4294967296U - _tickerLastTimeUsec) + (uint64_t)tickerCurrentTimeUsec; |
tedoyle | 3:8396d3e6eb62 | 107 | |
tedoyle | 3:8396d3e6eb62 | 108 | } |
tedoyle | 3:8396d3e6eb62 | 109 | |
andriym | 9:79633fe7d95b | 110 | _tickerLastTimeUsec = tickerCurrentTimeUsec; |
andriym | 9:79633fe7d95b | 111 | return(_totalTimeUsec); |
tedoyle | 3:8396d3e6eb62 | 112 | } |