|
From: <do_...@wu...> - 2013-10-17 06:19:03
|
Author: ttsou
Date: 2013-10-17 01:18:56 -0500 (Thu, 17 Oct 2013)
New Revision: 6745
Modified:
software/public/openbts/trunk/Transceiver52M/Transceiver.cpp
software/public/openbts/trunk/Transceiver52M/Transceiver.h
Log:
Transceiver52M: Separate main transmit and receive drive threads
This patch primarily addresses observed repeated overrun
conditions in embedded environments - namely ARM.
The heartbeat of the transceiver is derived from the receive
sample stream, which drives the main GSM clock. Detach the
transmit thread from the receive loop to avoid interfering with
the receive I/O, which is sensitive to overrun conditions if
pull process is interrupted.
Signed-off-by: Thomas Tsou <to...@ts...>
Modified: software/public/openbts/trunk/Transceiver52M/Transceiver.cpp
===================================================================
--- software/public/openbts/trunk/Transceiver52M/Transceiver.cpp 2013-10-17 06:18:53 UTC (rev 6744)
+++ software/public/openbts/trunk/Transceiver52M/Transceiver.cpp 2013-10-17 06:18:56 UTC (rev 6745)
@@ -57,7 +57,8 @@
{
GSM::Time startTime(random() % gHyperframe,0);
- mFIFOServiceLoopThread = new Thread(32768); ///< thread to push bursts into transmit FIFO
+ mRxServiceLoopThread = new Thread(32768);
+ mTxServiceLoopThread = new Thread(32768);
mControlServiceLoopThread = new Thread(32768); ///< thread to process control messages from GSM core
mTransmitPriorityQueueServiceLoopThread = new Thread(32768);///< thread to process transmit bursts from GSM core
@@ -527,7 +528,8 @@
mRadioInterface->start();
// Start radio interface threads.
- mFIFOServiceLoopThread->start((void * (*)(void*))FIFOServiceLoopAdapter,(void*) this);
+ mTxServiceLoopThread->start((void * (*)(void*))TxServiceLoopAdapter,(void*) this);
+ mRxServiceLoopThread->start((void * (*)(void*))RxServiceLoopAdapter,(void*) this);
mTransmitPriorityQueueServiceLoopThread->start((void * (*)(void*))TransmitPriorityQueueServiceLoopAdapter,(void*) this);
writeClockInterface();
@@ -836,11 +838,9 @@
pushRadioVector(mTransmitDeadlineClock);
mTransmitDeadlineClock.incTN();
}
-
}
- // FIXME -- This should not be a hard spin.
- // But any delay here causes us to throw omni_thread_fatal.
- //else radioClock->wait();
+
+ radioClock->wait();
}
@@ -857,17 +857,22 @@
mLastClockUpdateTime = mTransmitDeadlineClock;
-}
-
+}
-
-
-void *FIFOServiceLoopAdapter(Transceiver *transceiver)
+void *RxServiceLoopAdapter(Transceiver *transceiver)
{
transceiver->setPriority();
while (1) {
transceiver->driveReceiveFIFO();
+ pthread_testcancel();
+ }
+ return NULL;
+}
+
+void *TxServiceLoopAdapter(Transceiver *transceiver)
+{
+ while (1) {
transceiver->driveTransmitFIFO();
pthread_testcancel();
}
Modified: software/public/openbts/trunk/Transceiver52M/Transceiver.h
===================================================================
--- software/public/openbts/trunk/Transceiver52M/Transceiver.h 2013-10-17 06:18:53 UTC (rev 6744)
+++ software/public/openbts/trunk/Transceiver52M/Transceiver.h 2013-10-17 06:18:56 UTC (rev 6745)
@@ -56,7 +56,8 @@
VectorFIFO* mTransmitFIFO; ///< radioInterface FIFO of transmit bursts
VectorFIFO* mReceiveFIFO; ///< radioInterface FIFO of receive bursts
- Thread *mFIFOServiceLoopThread; ///< thread to push/pull bursts into transmit/receive FIFO
+ Thread *mRxServiceLoopThread; ///< thread to pull bursts into receive FIFO
+ Thread *mTxServiceLoopThread; ///< thread to push bursts into transmit FIFO
Thread *mControlServiceLoopThread; ///< thread to process control messages from GSM core
Thread *mTransmitPriorityQueueServiceLoopThread;///< thread to process transmit bursts from GSM core
@@ -193,8 +194,10 @@
*/
bool driveTransmitPriorityQueue();
- friend void *FIFOServiceLoopAdapter(Transceiver *);
+ friend void *RxServiceLoopAdapter(Transceiver *);
+ friend void *TxServiceLoopAdapter(Transceiver *);
+
friend void *ControlServiceLoopAdapter(Transceiver *);
friend void *TransmitPriorityQueueServiceLoopAdapter(Transceiver *);
@@ -206,8 +209,9 @@
};
-/** FIFO thread loop */
-void *FIFOServiceLoopAdapter(Transceiver *);
+/** Main drive threads */
+void *RxServiceLoopAdapter(Transceiver *);
+void *TxServiceLoopAdapter(Transceiver *);
/** control message handler thread loop */
void *ControlServiceLoopAdapter(Transceiver *);
|