GNU Radio 3.7.1 C++ API
|
00001 /* -*- c++ -*- */ 00002 /* 00003 * Copyright 2011,2013 Free Software Foundation, Inc. 00004 * 00005 * This file is part of GNU Radio 00006 * 00007 * GNU Radio is free software; you can redistribute it and/or modify 00008 * it under the terms of the GNU General Public License as published by 00009 * the Free Software Foundation; either version 3, or (at your option) 00010 * any later version. 00011 * 00012 * GNU Radio is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 * GNU General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU General Public License along 00018 * with this program; if not, write to the Free Software Foundation, Inc., 00019 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 00020 */ 00021 00022 #ifndef INCLUDED_GNURADIO_HIGH_RES_TIMER_H 00023 #define INCLUDED_GNURADIO_HIGH_RES_TIMER_H 00024 00025 #include <gnuradio/api.h> 00026 00027 //////////////////////////////////////////////////////////////////////// 00028 // Use architecture defines to determine the implementation 00029 //////////////////////////////////////////////////////////////////////// 00030 #if defined(linux) || defined(__linux) || defined(__linux__) 00031 #define GNURADIO_HRT_USE_CLOCK_GETTIME 00032 #include <ctime> 00033 #elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) 00034 #define GNURADIO_HRT_USE_QUERY_PERFORMANCE_COUNTER 00035 #elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) 00036 #define GNURADIO_HRT_USE_MACH_ABSOLUTE_TIME 00037 #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) 00038 #define GNURADIO_HRT_USE_CLOCK_GETTIME 00039 #include <ctime> 00040 #else 00041 #define GNURADIO_HRT_USE_MICROSEC_CLOCK 00042 #endif 00043 00044 00045 //////////////////////////////////////////////////////////////////////// 00046 namespace gr { 00047 00048 //! Typedef for the timer tick count 00049 typedef signed long long high_res_timer_type; 00050 00051 //! Get the current time in ticks 00052 high_res_timer_type high_res_timer_now(void); 00053 00054 //! Get the current time in ticks - for performance monitoring 00055 high_res_timer_type high_res_timer_now_perfmon(void); 00056 00057 //! Get the number of ticks per second 00058 high_res_timer_type high_res_timer_tps(void); 00059 00060 //! Get the tick count at the epoch 00061 high_res_timer_type high_res_timer_epoch(void); 00062 00063 #ifdef GNURADIO_HRT_USE_CLOCK_GETTIME 00064 //! storage for high res timer type 00065 GR_RUNTIME_API extern clockid_t high_res_timer_source; 00066 #endif 00067 00068 } /* namespace gr */ 00069 00070 //////////////////////////////////////////////////////////////////////// 00071 #ifdef GNURADIO_HRT_USE_CLOCK_GETTIME 00072 inline gr::high_res_timer_type gr::high_res_timer_now(void){ 00073 timespec ts; 00074 clock_gettime(CLOCK_MONOTONIC, &ts); 00075 return ts.tv_sec*high_res_timer_tps() + ts.tv_nsec; 00076 } 00077 00078 inline gr::high_res_timer_type gr::high_res_timer_now_perfmon(void){ 00079 timespec ts; 00080 clock_gettime(high_res_timer_source, &ts); 00081 return ts.tv_sec*high_res_timer_tps() + ts.tv_nsec; 00082 } 00083 00084 inline gr::high_res_timer_type gr::high_res_timer_tps(void){ 00085 return 1000000000UL; 00086 } 00087 #endif /* GNURADIO_HRT_USE_CLOCK_GETTIME */ 00088 00089 //////////////////////////////////////////////////////////////////////// 00090 #ifdef GNURADIO_HRT_USE_MACH_ABSOLUTE_TIME 00091 #include <mach/mach_time.h> 00092 00093 inline gr::high_res_timer_type gr::high_res_timer_now(void){ 00094 return mach_absolute_time(); 00095 } 00096 00097 inline gr::high_res_timer_type gr::high_res_timer_now_perfmon(void){ 00098 return gr::high_res_timer_now(); 00099 } 00100 00101 inline gr::high_res_timer_type gr::high_res_timer_tps(void){ 00102 mach_timebase_info_data_t info; 00103 mach_timebase_info(&info); 00104 return gr::high_res_timer_type(info.numer*1000000000UL)/info.denom; 00105 } 00106 #endif 00107 00108 //////////////////////////////////////////////////////////////////////// 00109 #ifdef GNURADIO_HRT_USE_QUERY_PERFORMANCE_COUNTER 00110 #include <Windows.h> 00111 00112 inline gr::high_res_timer_type gr::high_res_timer_now(void){ 00113 LARGE_INTEGER counts; 00114 QueryPerformanceCounter(&counts); 00115 return counts.QuadPart; 00116 } 00117 00118 inline gr::high_res_timer_type gr::high_res_timer_now_perfmon(void){ 00119 return gr::high_res_timer_now(); 00120 } 00121 00122 inline gr::high_res_timer_type gr::high_res_timer_tps(void){ 00123 LARGE_INTEGER freq; 00124 QueryPerformanceFrequency(&freq); 00125 return freq.QuadPart; 00126 } 00127 #endif 00128 00129 //////////////////////////////////////////////////////////////////////// 00130 #ifdef GNURADIO_HRT_USE_MICROSEC_CLOCK 00131 #include <boost/date_time/posix_time/posix_time.hpp> 00132 00133 inline gr::high_res_timer_type gr::high_res_timer_now(void){ 00134 static const boost::posix_time::ptime epoch(boost::posix_time::from_time_t(0)); 00135 return (boost::posix_time::microsec_clock::universal_time() - epoch).ticks(); 00136 } 00137 00138 inline gr::high_res_timer_type gr::high_res_timer_now_perfmon(void){ 00139 return gr::high_res_timer_now(); 00140 } 00141 00142 inline gr::high_res_timer_type gr::high_res_timer_tps(void){ 00143 return boost::posix_time::time_duration::ticks_per_second(); 00144 } 00145 #endif 00146 00147 //////////////////////////////////////////////////////////////////////// 00148 #include <boost/date_time/posix_time/posix_time.hpp> 00149 00150 inline gr::high_res_timer_type gr::high_res_timer_epoch(void){ 00151 static const double hrt_ticks_per_utc_ticks = gr::high_res_timer_tps()/double(boost::posix_time::time_duration::ticks_per_second()); 00152 boost::posix_time::time_duration utc = boost::posix_time::microsec_clock::universal_time() - boost::posix_time::from_time_t(0); 00153 return gr::high_res_timer_now() - utc.ticks()*hrt_ticks_per_utc_ticks; 00154 } 00155 00156 #endif /* INCLUDED_GNURADIO_HIGH_RES_TIMER_H */