2014-03-23 14:11:26 +00:00
|
|
|
/*! \page page_general General Application Notes
|
|
|
|
|
|
|
|
|
|
\tableofcontents
|
|
|
|
|
|
|
|
|
|
\section general_tuning Tuning Notes
|
|
|
|
|
|
|
|
|
|
\subsection general_tuning_process Two-stage tuning process
|
|
|
|
|
|
|
|
|
|
A USRP device has two stages of tuning:
|
|
|
|
|
|
|
|
|
|
- RF front-end: translates bewteen RF and IF
|
|
|
|
|
- DSP: translates between IF and baseband
|
|
|
|
|
|
|
|
|
|
In a typical use-case, the user specifies an overall center frequency
|
|
|
|
|
for the signal chain. The RF front-end will be tuned as close as
|
|
|
|
|
possible to the center frequency, and the DSP will account for the error
|
|
|
|
|
in tuning between target frequency and actual frequency. The user may
|
|
|
|
|
also explicitly control both stages of tuning through through the **tune_request_t** object, which allows for more advanced tuning.
|
|
|
|
|
|
|
|
|
|
In general, Using UHD software's advanced tuning is highly recommended
|
|
|
|
|
as it makes it easy to move the DC component out of your
|
|
|
|
|
band-of-interest. This can be done by passing your desired LO offset to
|
|
|
|
|
the **tune_request_t** object, and letting the UHD software handle the
|
|
|
|
|
rest.
|
|
|
|
|
|
|
|
|
|
The **tune_request_t** object can also be used with certain
|
|
|
|
|
daughterboards to use Integer-N tuning instead of the default fractional
|
|
|
|
|
tuning, allowing for better spur performance. The daughterboards that
|
|
|
|
|
support this functionality are:
|
|
|
|
|
|
|
|
|
|
- WBX (all revisions)
|
|
|
|
|
- WBX-120
|
|
|
|
|
- SBX (all revisions)
|
|
|
|
|
- SBX-120
|
|
|
|
|
- CBX
|
|
|
|
|
- CBX-120
|
|
|
|
|
|
|
|
|
|
\subsubsection general_tuning_rxchain Tuning the receive chain:
|
|
|
|
|
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp}
|
|
|
|
|
//tuning to a desired center frequency
|
|
|
|
|
usrp->set_rx_freq(target_frequency_in_hz);
|
|
|
|
|
|
|
|
|
|
--OR--
|
|
|
|
|
|
|
|
|
|
//advanced tuning with tune_request_t uhd::tune_request_t
|
|
|
|
|
tune_req(target_frequency_in_hz, desired_lo_offset);
|
|
|
|
|
tune_req.args = uhd::device_addr_t("mode_n=integer"); //to use Int-N tuning
|
|
|
|
|
//fill in any additional/optional tune request fields...
|
|
|
|
|
usrp->set_rx_freq(tune_req);
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
More information can be found in uhd::tune_request_t.
|
|
|
|
|
|
|
|
|
|
\subsection general_tuning_rfsettling RF front-end settling time
|
|
|
|
|
|
|
|
|
|
After tuning, the RF front-end will need time to settle into a usable
|
|
|
|
|
state. Typically, this means that the local oscillators must be given
|
|
|
|
|
time to lock before streaming begins. Lock time is not consistent; it
|
|
|
|
|
varies depending upon the device and requested settings. After tuning
|
|
|
|
|
and before streaming, the user should wait for the **lo_locked** sensor
|
|
|
|
|
to become true or sleep for a conservative amount of time (perhaps a
|
|
|
|
|
second).
|
|
|
|
|
|
|
|
|
|
\subsubsection general_tuning_waitcode Pseudo-code for dealing with settling time after tuning on receive:
|
|
|
|
|
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp}
|
|
|
|
|
usrp->set_rx_freq(...);
|
|
|
|
|
sleep(1);
|
|
|
|
|
usrp->issue_stream_command(...);
|
|
|
|
|
|
|
|
|
|
--OR--
|
|
|
|
|
|
|
|
|
|
usrp->set_rx_freq(...);
|
|
|
|
|
while (not usrp->get_rx_sensor("lo_locked").to_bool()){
|
|
|
|
|
//sleep for a short time in milliseconds
|
|
|
|
|
}
|
|
|
|
|
usrp->issue_stream_command(...);
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
\section general_subdev Specifying the Subdevice to Use
|
|
|
|
|
|
|
|
|
|
A subdevice specification string for USRP family devices is composed of:
|
|
|
|
|
|
|
|
|
|
<motherboard slot name>:<daughterboard frontend name>
|
|
|
|
|
|
|
|
|
|
Ex: The subdev spec markup string to select a WBX on slot B.
|
|
|
|
|
|
|
|
|
|
B:0
|
|
|
|
|
|
|
|
|
|
Ex: The subdev spec markup string to select a BasicRX on slot B.
|
|
|
|
|
|
|
|
|
|
B:AB
|
|
|
|
|
|
|
|
|
|
-- OR --
|
|
|
|
|
|
|
|
|
|
B:A
|
|
|
|
|
|
|
|
|
|
-- OR --
|
|
|
|
|
|
|
|
|
|
B:B
|
|
|
|
|
|
|
|
|
|
\subsection general_subdev_slotnames USRP Family Motherboard Slot Names
|
|
|
|
|
|
|
|
|
|
All USRP family motherboards have a first slot named **A:**. The USRP1 and the X3x0
|
|
|
|
|
have two daughterboard subdevice slots, known as **A:** and **B:**.
|
|
|
|
|
|
|
|
|
|
\subsection general_subdev_dbnames Daughterboard Frontend Names
|
|
|
|
|
|
|
|
|
|
Daughterboard frontend names can be used to specify which signal path is
|
|
|
|
|
used from a daughterboard. Most daughterboards have only one frontend **:0**.
|
|
|
|
|
A few daughterboards (Basic, LF and TVRX2) have multiple
|
|
|
|
|
frontend names available. The frontend names are documented in \ref page_dboards.
|
|
|
|
|
|
|
|
|
|
\section general_ounotes Overflow/Underflow Notes
|
|
|
|
|
|
|
|
|
|
<b>Note:</b> The following overflow/underflow notes do not apply to USRP1,
|
|
|
|
|
which does not support the advanced features available in newer
|
|
|
|
|
products.
|
|
|
|
|
|
|
|
|
|
\subsection general_ounotes_overflow Overflow notes
|
|
|
|
|
|
|
|
|
|
When receiving, the device produces samples at a constant rate.
|
|
|
|
|
Overflows occurs when the host does not consume data fast enough. When
|
|
|
|
|
UHD software detects the overflow, it prints an "O" or "D" to stdout,
|
|
|
|
|
and pushes an inline message packet into the receive stream.
|
|
|
|
|
|
|
|
|
|
<b>Network-based devices</b>: The host does not back-pressure the receive
|
|
|
|
|
stream. When the kernel's socket buffer becomes full, it will drop
|
|
|
|
|
subsequent packets. UHD software detects the overflow as a discontinuity
|
|
|
|
|
in the packet's sequence numbers, and pushes an inline message packet
|
|
|
|
|
into the receive stream. In this case the character "D" is printed to
|
|
|
|
|
stdout as an indication.
|
|
|
|
|
|
|
|
|
|
<b>Other devices</b>: The host back-pressures the receive stream.
|
|
|
|
|
Therefore, overflows always occur in the device itself. When the
|
|
|
|
|
device's internal buffers become full, streaming is shut off, and an
|
|
|
|
|
inline message packet is sent to the host. In this case the character
|
|
|
|
|
"O" is printed to stdout as an indication. If the device was in
|
|
|
|
|
continuous streaming mode, the UHD software will automatically restart
|
|
|
|
|
streaming when the buffer has space again.
|
|
|
|
|
|
|
|
|
|
\subsection general_ounotes_underrun Underrun notes
|
|
|
|
|
|
|
|
|
|
When transmitting, the device consumes samples at a constant rate.
|
|
|
|
|
Underflow occurs when the host does not produce data fast enough. When
|
|
|
|
|
UHD software detects the underflow, it prints a "U" to stdout, and
|
|
|
|
|
pushes a message packet into the async message stream.
|
|
|
|
|
|
|
|
|
|
<b>Note:</b> "O" and "U" message are generally harmless, and just mean the host machine can't keep up with the requested rates.
|
|
|
|
|
|
|
|
|
|
\section general_threading Threading Notes
|
|
|
|
|
|
|
|
|
|
\subsection general_threading_safety Thread safety notes
|
|
|
|
|
|
|
|
|
|
For the most part, UHD software is thread-safe. Please observe the
|
|
|
|
|
following limitations:
|
|
|
|
|
|
|
|
|
|
<b>Fast-path thread requirements:</b> There are three fast-path methods for
|
|
|
|
|
a device: `send()`, `recv()`, and `recv_async_msg()`. All three
|
|
|
|
|
methods are thread-safe and can be called from different thread
|
|
|
|
|
contexts. For performance, the user should call each method from a
|
|
|
|
|
separate thread context. These methods can also be used in a
|
|
|
|
|
non-blocking fashion by using a timeout of zero.
|
|
|
|
|
|
|
|
|
|
<b>Slow-path thread requirements:</b> It is safe to change multiple
|
|
|
|
|
settings simultaneously. However, this could leave the settings for a
|
|
|
|
|
device in an uncertain state. This is because changing one setting could
|
|
|
|
|
have an impact on how a call affects other settings. Example: setting
|
|
|
|
|
the channel mapping affects how the antennas are set. It is recommended
|
|
|
|
|
to use at most one thread context for manipulating device settings.
|
|
|
|
|
|
|
|
|
|
\subsection general_threading_prio Thread priority scheduling
|
|
|
|
|
|
2014-07-22 15:36:06 +00:00
|
|
|
When UHD software spawns a new thread, it may try to boost the thread's
|
|
|
|
|
scheduling priority. If setting the new priority fails, the UHD software
|
|
|
|
|
prints a warning to the console, as shown below. This warning is harmless;
|
|
|
|
|
it simply means that the thread will retain a normal or default scheduling priority.
|
|
|
|
|
|
|
|
|
|
UHD Warning:
|
|
|
|
|
Unable to set the thread priority. Performance may be negatively affected.
|
|
|
|
|
Please see the general application notes in the manual for instructions.
|
|
|
|
|
EnvironmentError: OSError: error in pthread_setschedparam
|
2014-03-23 14:11:26 +00:00
|
|
|
|
|
|
|
|
<b>Linux Notes:</b>
|
|
|
|
|
|
|
|
|
|
Non-privileged users need special permission to change the scheduling
|
2014-07-22 15:36:06 +00:00
|
|
|
priority. Add the following line to the file `/etc/security/limits.conf`:
|
2014-03-23 14:11:26 +00:00
|
|
|
|
|
|
|
|
@GROUP - rtprio 99
|
|
|
|
|
|
2014-07-22 15:36:06 +00:00
|
|
|
Replace `GROUP` with a group in which your user is a member. You may need
|
|
|
|
|
to log out and log back into the account for the settings to take effect.
|
|
|
|
|
In most Linux distributions, a list of groups and group members can be found in the file `/etc/group`.
|
2014-03-23 14:11:26 +00:00
|
|
|
|
|
|
|
|
\section general_misc Miscellaneous Notes
|
|
|
|
|
|
|
|
|
|
\subsection general_misc_dynamic Support for dynamically loadable modules
|
|
|
|
|
|
|
|
|
|
For a module to be loaded at runtime, it must be:
|
|
|
|
|
|
|
|
|
|
- found in the `UHD_MODULE_PATH` environment variable,
|
|
|
|
|
- installed into the `\<install-path\>/share/uhd/modules` directory,
|
|
|
|
|
- or installed into `/usr/share/uhd/modules` directory (UNIX only).
|
|
|
|
|
|
|
|
|
|
\subsection general_misc_prints Disabling or redirecting prints to stdout
|
|
|
|
|
|
|
|
|
|
The user can disable the UHD library from printing directly to stdout by
|
|
|
|
|
registering a custom message handler. The handler will intercept all
|
|
|
|
|
messages, which can be dropped or redirected. Only one handler can be
|
|
|
|
|
registered at a time. Make **register_handler** your first call into
|
|
|
|
|
the UHD library:
|
|
|
|
|
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp}
|
|
|
|
|
#include <uhd/utils/msg.hpp>
|
|
|
|
|
|
|
|
|
|
void my_handler(uhd::msg::type_t type, const std::string &msg){
|
|
|
|
|
//handle the message...
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uhd::msg::register_handler(&my_handler);
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
// vim:ft=doxygen:
|