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