Hah. Yes. Sorry for the confusion. 


Sent from my iPhone

> On Mar 9, 2021, at 10:36 PM, Doug Blackburn <doug...@gmail.com> wrote:
> 
> 
> Marcus,
> 
> Thanks for your response; I believe I am.  The math is spread over two lines:
> 
>     uhd::time_spec_t expectedTime = startTime + (double) ( num_tx_samps  )
>                       / (double)usrp->get_tx_rate();
> 
> Best,
> Doug
> 
> 
>> On Tue, Mar 9, 2021 at 10:20 PM Marcus D Leech <patchvonbr...@gmail.com> 
>> wrote:
>> Shouldn’t you be scaling your num_tx_samples by the time per sample when 
>> calculating the expectedTime?
>> 
>> Sent from my iPhone
>> 
>>>> On Mar 9, 2021, at 10:03 PM, Doug Blackburn via USRP-users 
>>>> <usrp-users@lists.ettus.com> wrote:
>>>> 
>>> 
>>> Hello --
>>> 
>>> I've got some questions re: latency with the x300 over the 10GigE 
>>> interface.  
>>> 
>>> If I use the latency_test example operating at a rate of 50 MSPS, I have no 
>>> issues with a latency of 1ms.  The latency test receives data, examines the 
>>> time stamp, and transmits a single packet. 
>>> 
>>> I have an application where I'd like to run the transmitter continuously, 
>>> and I got curious about the latency involved in that operation.  My 
>>> application is similar to the benchmark_rate example.  I added the 
>>> following lines to the benchmark_rate example at line 256 after the line.
>>> 
>>> md.has_time_spec = false; 
>>> 
>>> ====
>>> if ( (num_tx_samps % 50000000) < 4*max_samps_per_packet )
>>> {
>>>     uhd::time_spec_t expectedTime = startTime + (double) ( num_tx_samps  )
>>>                       / (double)usrp->get_tx_rate();
>>>     uhd::time_spec_t timeAtLog = usrp->get_time_now();
>>>     timeAtLog = usrp->get_time_now();
>>>     std::cerr << "==== Actual time ====" << std::endl;
>>>     std::cerr << "     " << timeAtLog.get_full_secs() << " / "
>>>                           << timeAtLog.get_frac_secs() << std::endl;
>>>     std::cerr << "==== Expected time ====" << std::endl;
>>>     std::cerr << "     " << expectedTime.get_full_secs() << " / "
>>>                           << expectedTime.get_frac_secs() << std::endl;
>>> }
>>> ====
>>> 
>>> The intent of this insertion is to log the time at which we return from 
>>> tx_stream->send() and the time at which the first sample of that sent data 
>>> should be transmitted -- at approximately once per second when running at 
>>> 50 MSPS.
>>> 
>>> After the first second, I consistently saw the following results:
>>> 
>>> ==== Actual time ====
>>>      1 / 0.10517
>>> ==== Expected time ====
>>>      1 / 0.27253
>>> 
>>> ==== Actual time ====
>>>      1 / 0.105419
>>> ==== Expected time ====
>>>      1 / 0.27255
>>> 
>>> Which indicates to me that there is a latency of approximately 167ms when 
>>> transmitting data.  That is, the send() function is returning 167ms earlier 
>>> than I expect the data to actually be transmitted.   If I halve the sample 
>>> rate to 25 MSPS, the latency doubles.
>>> 
>>> What is the source of the latency when running in a continuous mode?  
>>> Initially, I had thought that this might be related to the 
>>> send_buffer_size, but making changes to send_buffer_size seem to not have 
>>> an effect.   FWIW, 167ms at 50 MSPS is suspiciously close to the value for 
>>> wmem_max (33554432) suggested in the x300 system configuration ... but 
>>> neither changing that value or send_buffer_size seems to make a difference.
>>> 
>>> Is this latency tunable?  
>>> 
>>> Thank you for your help!
>>> 
>>> Best Regards,
>>> Doug Blackburn
>>> 
>>> _______________________________________________
>>> USRP-users mailing list
>>> USRP-users@lists.ettus.com
>>> http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com
_______________________________________________
USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

Reply via email to