From 1339e427e1d2fd87601214cfeb662cf4659546a9 Mon Sep 17 00:00:00 2001 From: Alexander Chemeris Date: Thu, 29 Aug 2013 02:52:13 +0400 Subject: Some RTMD instrumentation. --- Transceiver52M/DriveLoop.cpp | 10 +++++++++- Transceiver52M/multiTRX.cpp | 5 +++++ Transceiver52M/radioInterface.cpp | 14 ++++++++++++-- Transceiver52M/radioVector.cpp | 17 +++++++++++++++++ 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/Transceiver52M/DriveLoop.cpp b/Transceiver52M/DriveLoop.cpp index 51ce750..533de0c 100644 --- a/Transceiver52M/DriveLoop.cpp +++ b/Transceiver52M/DriveLoop.cpp @@ -25,6 +25,8 @@ #include #include "DriveLoop.h" #include +#include "RTMD.h" +#define WITH_RTMD using namespace GSM; @@ -90,6 +92,7 @@ void DriveLoop::pushRadioVector(GSM::Time &nowTime) int i; radioVector *staleBurst; radioVector *next; + RTMD_SET("pushRadioVector"); for (i = 0; i < mChanM; i++) { // dump stale bursts, if any @@ -121,6 +124,7 @@ void DriveLoop::pushRadioVector(GSM::Time &nowTime) if (!mIsFiller[i]) delete mTxBursts[i]; } + RTMD_CLEAR("pushRadioVector"); } void DriveLoop::setModulus(int channel, int timeslot) @@ -231,11 +235,15 @@ void DriveLoop::driveReceiveFIFO() void DriveLoop::driveTransmitFIFO() { int i; + GSM::Time timeDiff; RadioClock *radioClock = (mRadioInterface->getClock()); - while (radioClock->get() + mTransmitLatency > mTransmitDeadlineClock) { + timeDiff = radioClock->get() + mTransmitLatency - mTransmitDeadlineClock; + while (timeDiff > 0) { + RTMD_VAL("DriveTimeDiff", timeDiff.FN()*8+timeDiff.TN()); pushRadioVector(mTransmitDeadlineClock); mTransmitDeadlineClock.incTN(); + timeDiff = radioClock->get() + mTransmitLatency - mTransmitDeadlineClock; } // FIXME -- This should not be a hard spin. diff --git a/Transceiver52M/multiTRX.cpp b/Transceiver52M/multiTRX.cpp index f3d0a56..1a88ec2 100644 --- a/Transceiver52M/multiTRX.cpp +++ b/Transceiver52M/multiTRX.cpp @@ -25,6 +25,8 @@ #include "Transceiver.h" #include "radioDevice.h" +#include "RTMD.h" +#define WITH_RTMD ConfigurationTable gConfig("/etc/OpenBTS/OpenBTS.db"); @@ -69,6 +71,8 @@ int main(int argc, char *argv[]) gLogInit("transceiver", gConfig.getStr("Log.Level").c_str(), LOG_LOCAL7); srandom(time(NULL)); + // Allocate 100Mb of RAM to the real-time log + RTMD_INIT(100*1024*1024); if (setupSignals() < 0) { LOG(ERR) << "Failed to setup signal handlers, exiting..."; @@ -109,6 +113,7 @@ int main(int argc, char *argv[]) sleep(1); LOG(NOTICE) << "Shutting down transceivers..."; + RTMD_FLUSH("osmo-trx.rtmd"); for (int i = 0; i < numARFCN; i++) trx[i]->shutdown(); diff --git a/Transceiver52M/radioInterface.cpp b/Transceiver52M/radioInterface.cpp index 6694066..31d67ce 100644 --- a/Transceiver52M/radioInterface.cpp +++ b/Transceiver52M/radioInterface.cpp @@ -24,6 +24,8 @@ #include "radioInterface.h" #include +#include "RTMD.h" +#define WITH_RTMD bool started = false; @@ -243,11 +245,18 @@ void RadioInterface::loadVectors(unsigned tN, int samplesPerBurst, void RadioInterface::driveReceiveRadio() { - if (!mOn) + RTMD_SET("driveReceiveRadio"); + if (!mOn) { + RTMD_VAL("driveReceiveRadio", -1); + RTMD_CLEAR("driveReceiveRadio"); return; + } - if (mReceiveFIFO[0].size() > 8) + if (mReceiveFIFO[0].size() > 8) { + RTMD_VAL("driveReceiveRadio", 2); + RTMD_CLEAR("driveReceiveRadio"); return; + } pullBuffer(); @@ -281,6 +290,7 @@ void RadioInterface::driveReceiveRadio() rcvCursor -= readSz; shiftRxBuffers(rcvBuffer, 2 * readSz, 2 * rcvCursor, mChanM); } + RTMD_CLEAR("driveReceiveRadio"); } double RadioInterface::setRxGain(double dB, int chan) diff --git a/Transceiver52M/radioVector.cpp b/Transceiver52M/radioVector.cpp index dcdb375..0e030be 100644 --- a/Transceiver52M/radioVector.cpp +++ b/Transceiver52M/radioVector.cpp @@ -20,6 +20,8 @@ */ #include "radioVector.h" +#include "RTMD.h" +#define WITH_RTMD radioVector::radioVector(const signalVector& wVector, GSM::Time& wTime) : signalVector(wVector), mTime(wTime) @@ -44,6 +46,8 @@ bool radioVector::operator>(const radioVector& other) const GSM::Time VectorQueue::nextTime() const { GSM::Time retVal; + + RTMD_SET("getStaleBurst"); mLock.lock(); while (mQ.size()==0) @@ -52,14 +56,18 @@ GSM::Time VectorQueue::nextTime() const retVal = mQ.top()->getTime(); mLock.unlock(); + RTMD_CLEAR("getStaleBurst"); return retVal; } radioVector* VectorQueue::getStaleBurst(const GSM::Time& targTime) { + RTMD_SET("getStaleBurst"); mLock.lock(); if ((mQ.size()==0)) { mLock.unlock(); + RTMD_VAL("getStaleBurst",2); + RTMD_CLEAR("getStaleBurst"); return NULL; } @@ -67,18 +75,24 @@ radioVector* VectorQueue::getStaleBurst(const GSM::Time& targTime) radioVector* retVal = mQ.top(); mQ.pop(); mLock.unlock(); + RTMD_CLEAR("getStaleBurst"); return retVal; } mLock.unlock(); + RTMD_VAL("getStaleBurst",2); + RTMD_CLEAR("getStaleBurst"); return NULL; } radioVector* VectorQueue::getCurrentBurst(const GSM::Time& targTime) { + RTMD_SET("getStaleBurst"); mLock.lock(); if ((mQ.size()==0)) { mLock.unlock(); + RTMD_VAL("getStaleBurst",2); + RTMD_CLEAR("getStaleBurst"); return NULL; } @@ -86,9 +100,12 @@ radioVector* VectorQueue::getCurrentBurst(const GSM::Time& targTime) radioVector* retVal = mQ.top(); mQ.pop(); mLock.unlock(); + RTMD_CLEAR("getStaleBurst"); return retVal; } mLock.unlock(); + RTMD_VAL("getStaleBurst",2); + RTMD_CLEAR("getStaleBurst"); return NULL; } -- cgit v1.2.3