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 Tom Doyle

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?

UserRevisionLine numberNew 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 }