From 7553aa973f352d48abbf5f8fc67530a5a64c108d Mon Sep 17 00:00:00 2001 From: Thomas Tsou Date: Fri, 8 Nov 2013 12:50:03 -0500 Subject: Transceiver52M: Set variable thread priority levels The transceiver and underlying device drivers are threaded. use the following priority levels. 0.50 - UHD driver internal threads 0.45 - Receive device drive thread 0.44 - Transmit device drive thread 0.43 - UHD asynchronous update thread (error reporting) 0.42 - Receive burst processing thread(s) Signed-off-by: Thomas Tsou --- Transceiver52M/Transceiver.cpp | 6 +++++- Transceiver52M/Transceiver.h | 2 +- Transceiver52M/UHDDevice.cpp | 10 +++++----- Transceiver52M/USRPDevice.h | 2 +- Transceiver52M/radioDevice.h | 2 +- Transceiver52M/radioInterface.h | 2 +- 6 files changed, 14 insertions(+), 10 deletions(-) (limited to 'Transceiver52M') diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp index 2d4a3cb..6e446f3 100644 --- a/Transceiver52M/Transceiver.cpp +++ b/Transceiver52M/Transceiver.cpp @@ -800,6 +800,8 @@ void *RxUpperLoopAdapter(TransceiverChannel *chan) delete chan; + trx->setPriority(0.42); + while (1) { trx->driveReceiveFIFO(num); pthread_testcancel(); @@ -809,7 +811,7 @@ void *RxUpperLoopAdapter(TransceiverChannel *chan) void *RxLowerLoopAdapter(Transceiver *transceiver) { - transceiver->setPriority(); + transceiver->setPriority(0.45); while (1) { transceiver->driveReceiveRadio(); @@ -820,6 +822,8 @@ void *RxLowerLoopAdapter(Transceiver *transceiver) void *TxLowerLoopAdapter(Transceiver *transceiver) { + transceiver->setPriority(0.44); + while (1) { transceiver->driveTxFIFO(); pthread_testcancel(); diff --git a/Transceiver52M/Transceiver.h b/Transceiver52M/Transceiver.h index 4356ef2..d1a6ec9 100644 --- a/Transceiver52M/Transceiver.h +++ b/Transceiver52M/Transceiver.h @@ -235,7 +235,7 @@ protected: void reset(); /** set priority on current thread */ - void setPriority() { mRadioInterface->setPriority(); } + void setPriority(float prio = 0.5) { mRadioInterface->setPriority(prio); } }; diff --git a/Transceiver52M/UHDDevice.cpp b/Transceiver52M/UHDDevice.cpp index 224ebd0..660bce4 100644 --- a/Transceiver52M/UHDDevice.cpp +++ b/Transceiver52M/UHDDevice.cpp @@ -218,7 +218,7 @@ public: bool start(); bool stop(); void restart(uhd::time_spec_t ts); - void setPriority(); + void setPriority(float prio); enum TxWindowType getWindowType() { return tx_window; } int readSamples(std::vector &bufs, int len, bool *overrun, @@ -308,6 +308,8 @@ private: void *async_event_loop(uhd_device *dev) { + dev->setPriority(0.43); + while (1) { dev->recv_async_msg(); pthread_testcancel(); @@ -673,8 +675,6 @@ bool uhd_device::start() return false; } - setPriority(); - // Register msg handler uhd::msg::register_handler(&uhd_msg_handler); @@ -703,9 +703,9 @@ bool uhd_device::stop() return true; } -void uhd_device::setPriority() +void uhd_device::setPriority(float prio) { - uhd::set_thread_priority_safe(); + uhd::set_thread_priority_safe(prio); return; } diff --git a/Transceiver52M/USRPDevice.h b/Transceiver52M/USRPDevice.h index cfc6222..c9f98ed 100644 --- a/Transceiver52M/USRPDevice.h +++ b/Transceiver52M/USRPDevice.h @@ -108,7 +108,7 @@ private: bool stop(); /** Set priority not supported */ - void setPriority() { } + void setPriority(float prio = 0.5) { } enum TxWindowType getWindowType() { return TX_WINDOW_USRP1; } diff --git a/Transceiver52M/radioDevice.h b/Transceiver52M/radioDevice.h index e577bc5..19b5a88 100644 --- a/Transceiver52M/radioDevice.h +++ b/Transceiver52M/radioDevice.h @@ -52,7 +52,7 @@ class RadioDevice { virtual enum TxWindowType getWindowType()=0; /** Enable thread priority */ - virtual void setPriority()=0; + virtual void setPriority(float prio = 0.5) = 0; /** Read samples from the radio. diff --git a/Transceiver52M/radioInterface.h b/Transceiver52M/radioInterface.h index 1e58ecb..124cdc3 100644 --- a/Transceiver52M/radioInterface.h +++ b/Transceiver52M/radioInterface.h @@ -133,7 +133,7 @@ public: double fullScaleOutputValue(); /** set thread priority on current thread */ - void setPriority() { mRadio->setPriority(); } + void setPriority(float prio = 0.5) { mRadio->setPriority(prio); } /** get transport window type of attached device */ enum RadioDevice::TxWindowType getWindowType() { return mRadio->getWindowType(); } -- cgit v1.2.3