For the first version can you try setting has_time_spec to false after the
first packet is sent, and don't bother to set the time_spec on subsequent
packets within a burst? The time_spec should really only be for the first
packet. The radio will ignore the timestamp on the subsequent packets
within a burst, and I noticed we set has_time_spec to false after the first
packet in our benchmark_rate example.

L means the first packet of the burst came after the indicated time, and 1
second should be enough time. So I suspect either the time is being
calculated wrong or you're sending multiple bursts. If a subsequent packet
in a burst comes late, it would show up as a U rather than L.

Wade

On Mon, Jun 17, 2024 at 11:18 PM <cjohn...@serranosystems.com> wrote:

> Would you be able to provide some suggestions? We need to keep precision
> timing for transmission. Neither of the two proof of concepts (POC) below
> are meeting our needs. Of course we are sending 2 packets due to lack of
> jumbo frames.
>
> We have 2048 samples (4 bytes per sample) we would have liked to send per
> packet, or 2048/200E+6 = 10.24 us per packet or 97656 packets per second.
> It’s a continuous stream. This doesn’t include packet overhead.
>
> The reason the Jumbo frame thing came up was because we were getting “L”s
> (missed timing) when using the time spec, and “U” when not using timing
> spec, most likely due to 2 packets per transmission instead of 1 jumbo
> frame.
>
> I have provided POC of our test Tx program for 2 cases. The first uses
> timing spec, which doesn’t keep up. The second was just to see how it would
> perform if there wasn’t a time spec.
>
> This thread runs as the highest priority in Linux, and we have tuned
> according to your documentation.
>
> *First Test Program 1), PPS is ~95500,  but we get “L”s constantly .*
>
> [INFO] [UHD] linux; GNU C++ version 9.4.0; Boost_107100; UHD_
>
> [INFO] [X300] X300 initialization sequence...
>
> [INFO] [X300] Maximum frame size: 8000 bytes.
>
> [INFO] [GPS] Found an internal GPSDO: LC_XO, Firmware Rev 0.929a
>
> [INFO] [X300] Radio 1x clock: 200 MHz
>
> Actual TX Rate: 200.000000 Msps
>
> Actual TX Freq: 2400.000000 MHz
>
> Actual TX Gain: 30.000000 dB
>
> Actual TX Bandwidth: 16.000000 MHz
>
> [WARNING] [0/Radio#0] Attempting to set tick rate to 0. Skipping.
>
> Using transmit_packets_timespec()
>
> Start transmit_packets_timespec()
>
> Packet size: 8192 bytes
>
> --------------------------------------------
>
> Transmitted packets: 30632386
>
> Dropped packets: 9
>
> PAUSE frames received: 0
>
> PAUSE frames transmitted: 0
>
> GPS lock lost events: 0
>
> Network RX packets: 19733243
>
> Network TX packets: 206298940
>
> Network RX errors: 0
>
> Network TX errors: 0
>
> Network RX dropped: 0
>
> Network TX dropped: 0
>
> USRP TX overruns: 0
>
> USRP TX underruns: 0
>
> USRP sequence errors: 0
>
> GPS time sync: 1136281795
>
> GPS time sync errors: 0
>
> Packets Per Second (PPS): 95428
>
>
> *Second Test Program 2), PPS is ~98000, Buffer Size is 8192 (without USRP
> overhead), occasional “U”*
>
> [INFO] [UHD] linux; GNU C++ version 9.4.0; Boost_107100; UHD_
>
> [INFO] [X300] X300 initialization sequence...
>
> [INFO] [X300] Maximum frame size: 8000 bytes.
>
> [INFO] [GPS] Found an internal GPSDO: LC_XO, Firmware Rev 0.929a
>
> [INFO] [X300] Radio 1x clock: 200 MHz
>
> Actual TX Rate: 200.000000 Msps
>
> Actual TX Freq: 2400.000000 MHz
>
> Actual TX Gain: 30.000000 dB
>
> Actual TX Bandwidth: 16.000000 MHz
>
> [WARNING] [0/Radio#0] Attempting to set tick rate to 0. Skipping.
>
> Using transmit_packets_no_timespec()
>
> Start transmit_packets_no_timespec()
>
> Packet size: 8192 bytes
>
> --------------------------------------------
>
> Transmitted packets: 12844561
>
> Dropped packets: 0
>
> PAUSE frames received: 0
>
> PAUSE frames transmitted: 0
>
> GPS lock lost events: 0
>
> Network RX packets: 5528620
>
> Network TX packets: 77280212
>
> Network RX errors: 0
>
> Network TX errors: 0
>
> Network RX dropped: 0
>
> Network TX dropped: 0
>
> USRP TX overruns: 0
>
> USRP TX underruns: 0
>
> USRP sequence errors: 0
>
> GPS time sync: 1136280963
>
> GPS time sync errors: 0
>
> Packets Per Second (PPS): 98050
>
>
> // 2 function to simulate our packet transmission
> // First Test Program 1)
> void transmit_packets_timespec(uhd::usrp::multi_usrp::sptr usrp, 
> uhd::tx_streamer::sptr tx_stream, std::atomic<bool> &gps_locked, double rate) 
> {
>     uhd::tx_metadata_t md;
>     md.start_of_burst = true;
>     md.end_of_burst = false;
>     md.has_time_spec = true;
>
>     std::vector<std::complex<int16_t>> buffer(2048); // CRJ TEMP buffer(2048);
>
>     std::cout << "Start transmit_packets_timespec()" << std::endl;
>     std::cout << "Packet size: " << buffer.size() * 
> sizeof(std::complex<int16_t>) << " bytes" << std::endl;
>
>     // Get and print the maximum number of samples per packet
>     size_t max_num_samps = tx_stream->get_max_num_samps();
>     std::cout << "Max number of samples per packet: " << max_num_samps << 
> std::endl;
>
>     // Initialize timestamp
>     md.time_spec = uhd::time_spec_t(usrp->get_time_now().get_full_secs() + 
> 1.0); // Start 1 second in the future
>
>     while (1 /*!stop_logging.load()*/) {
>         //if (gps_locked.load()) {
>             //  md.time_spec = 
> uhd::time_spec_t(usrp->get_time_now().get_full_secs() + 1.0);
>         //}
>
>         size_t num_tx_samps = tx_stream->send(&buffer.front(), buffer.size(), 
> md);
>
>         if (num_tx_samps < buffer.size()) {
>             dropped_packets++;
>         } else {
>             transmitted_packets++;
>         }
>
>         md.time_spec = md.time_spec + uhd::time_spec_t(buffer.size() / rate);
>
>         md.start_of_burst = false;
>         //std::this_thread::sleep_for(std::chrono::milliseconds(5));
>     }
>
>     // Mark end of burst
>     md.end_of_burst = true;
>     tx_stream->send("", 0, md);
> }
>
> // Second Test Program 2)
> void transmit_packets_no_timespec(uhd::usrp::multi_usrp::sptr usrp, 
> uhd::tx_streamer::sptr tx_stream, std::atomic<bool> &gps_locked, double rate) 
> {
>     uhd::tx_metadata_t md;
>     md.start_of_burst = true;
>     md.end_of_burst = false;
>     md.has_time_spec = false; // No time specification
>
>     std::vector<std::complex<int16_t>> buffer(2048);
>
>     std::cout << "Start transmit_packets_no_timespec()" << std::endl;
>     std::cout << "Packet size: " << buffer.size() * 
> sizeof(std::complex<int16_t>) << " bytes" << std::endl;
>
>     while (!stop_logging.load()) {
>         size_t num_tx_samps = tx_stream->send(&buffer.front(), buffer.size(), 
> md);
>
>         if (num_tx_samps < buffer.size()) {
>             dropped_packets++;
>         } else {
>             transmitted_packets++;
>         }
>
>         md.start_of_burst = false;
>         // Adjust the sleep time to control the packet rate
>         // std::this_thread::sleep_for(std::chrono::milliseconds(1));
>     }
>
>     // Mark end of burst
>     md.end_of_burst = true;
>     tx_stream->send("", 0, md);
> }
>
> _______________________________________________
> USRP-users mailing list -- usrp-users@lists.ettus.com
> To unsubscribe send an email to usrp-users-le...@lists.ettus.com
>
_______________________________________________
USRP-users mailing list -- usrp-users@lists.ettus.com
To unsubscribe send an email to usrp-users-le...@lists.ettus.com

Reply via email to