Brian --

Thanks so much!   I sprinkled my comments in below :

On Wed, Mar 10, 2021 at 1:42 PM Brian Padalino <bpadal...@gmail.com> wrote:

> On Wed, Mar 10, 2021 at 12:39 PM Doug Blackburn <doug...@gmail.com> wrote:
>
>> Brian,
>>
>> I've seen this using UHD-3.14 and UHD-3.15.LTS.
>>
>
> The DMA FIFO block default size is set here in the source code for
> UHD-3.15.LTS:
>
>
> https://github.com/EttusResearch/uhd/blob/UHD-3.15.LTS/host/lib/rfnoc/dma_fifo_block_ctrl_impl.cpp#L25
>
> And the interface in the header file provides a way to resize it:
>
>
> https://github.com/EttusResearch/uhd/blob/UHD-3.15.LTS/host/include/uhd/rfnoc/dma_fifo_block_ctrl.hpp#L33
>
> I'd probably resize it before sending any data to it.
>
> That should help with your latency question I think.
>

This is super helpful.  I'll give it a shot and see what happens!


>
>
>>
>> I have performed some follow-on testing that raises more questions,
>> particularly about the usage of end_of_burst and start_of_burst.  I talk
>> through my tests and observations below; the questions that these generated
>> are at the end ...
>>
>> I thought it would be interesting to modify benchmark_rate.cpp to attempt
>> to place a timestamp on each buffer that was sent out to see if I could
>> observe the same behavior.  I haven't seen thorough explanations of what
>> exactly the start_of_burst and end_of_burst metadata fields do at a low
>> level beyond this posting --
>> http://lists.ettus.com/pipermail/usrp-users_lists.ettus.com/2016-November/050555.html
>> and a note about start_of_burst resetting the CORDICs (I'd appreciate being
>> pointed in the right direction if I've missed it, thank you!) --  so I
>> wanted to test the effect on timing when has_time_spec is true and the SOB
>> and EOB fields are either false or true.  I initially set my test up in the
>> following way (I hope the pseudocode makes sense) to make observations
>> easy.  I watched for the LO on a spectrum analyzer.  Per the code below, I
>> would expect a burst every 2 seconds if the time_spec was followed ...
>>
>> ======
>> max_samps_per_packet = 50e5; // 100ms at 50 MSPS
>> start_of_burst = <true,false>
>> end_of_burst = <true,false>
>> has_time_spec = true;
>> while( not burst_timer_elapsed)
>> {
>>     tx_stream->send();
>>     start_of_burst = <true,false>
>>     end_of_burst = <true, false>
>>     time_spec = time_spec + 2.0;
>>  }
>>
>
> A few things.  I'd expect a burst every 2 seconds if you set sob = true,
> eob = true outside the loop, and never change it and only change the
> time_spec for every send.  Does that not work for you?
>
>
Yes -- that does work, too.  I tried all the different combinations ... So
for example, if sob/eob were true/true outside the loop and false/false
inside the loop, I'd see a two second pause after the first burst and then
we'd roll through the rest of them contiguously.


> Next, The sizing of packets can be really important here.  The way the DUC
> works is a little unintuitive.  The DUC works by creating N packets from 1
> input packet.  To this end, if you have an extra 1 sample, it will repeat
> that small 1 sample packet N times - very processing inefficient.
>
> Furthermore, when I tried doing this I would run into weird edge cases
> with the DMA FIFO where the send() call would block indefinitely.  My
> workaround was to manually zero stuff and keep the transmit FIFO constantly
> going - not using any eob flags at all.  My system would actually use a
> software FIFO for bursts that wanted to go out, and I had a software thread
> in a tight loop that would check if the FIFO had anything in it.  If it
> didn't, it would zero stuff some small amount of transmit samples (1 packet
> I believe).  If it did, it would send the burst.  You may want to do
> something similar even with a synchronized system and counting outgoing
> samples.
>

:) This is what led me here; the application I was working on essentially
did that.  I'd have some data I'd want to send at a specific time.  I'd
translate that time to a number of buffers past the start of my transmit
(with some extra bookkeeping and buffer magic to align samples, etc), and
found that I could only get this to work if my requested transmit time was
at least 167 ms in the future.   This didn't quite reconcile with the 1ms
of latency I could demonstrate with 'latency_test'  -- which uses a single
packet -- hence my trip down the rabbit hole.  If I can lower that number a
little by modifying the FIFO block, I think I'll be happy, but ...


>
>
>>
>> My observations were as follows: if end_of_burst for the prior burst was
>> set to true, my code adhered to the time_spec.  The value of start_of_burst
>> had no effect on whether or not the expected timing was followed.  If
>> end_of_burst was set to false, the time_spec for the following burst is
>> ignored and the packet is transmitted as soon as possible.
>>
>> I then followed this up with another test -- I replaced
>>       time_spec = time_spec + 2.0;
>> with the equivalent of
>>       time_spec = time_spec + 0.100;
>>
>> And set end_of_burst and start_of_burst to true.
>>
>> I figured if I can run this continuously by setting has_time_spec to
>> 'false' after the first burst and easily push data into the FIFO buffer,
>> that doing this should not be a problem ... but I'm presented with a stream
>> of lates and no actual transmission.
>>
>> I understand that 100ms is not an integer multiple of packet size
>> returned by get_max_num_samps() -- so I tried an integer multiple of the
>> packet size, too, with an appropriately updated time_spec. This also
>> resulted with a lates through the entire transmit.
>>
>> So .... here are my additional questions:
>>
>> Is the only effect of "start_of_burst = true" to cause the CORDICs to
>> reset?
>> What is end_of_burst doing to enable a following time_spec to be used?
>> What additional work is being performed when I set end_of_burst and
>> has_time_spec to 'true' such that I get latest throughout the entire
>> attempted transmission?
>>
>
> I don't know the answer to these questions.  Try the suggestions above and
> see if they help you out or not.
>
> Good luck!
>
>
...I would love to know the answer to these questions if anyone knew them.
Or could point me towards where they are documented.

Thanks again!


> Brian
>

Best, Doug
_______________________________________________
USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

Reply via email to