aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Transceiver52M/DriveLoop.cpp10
-rw-r--r--Transceiver52M/multiTRX.cpp5
-rw-r--r--Transceiver52M/radioInterface.cpp14
-rw-r--r--Transceiver52M/radioVector.cpp17
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 <stdio.h>
#include "DriveLoop.h"
#include <Logger.h>
+#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 <Logger.h>
+#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;
}