Hi Johannes,
I try on 2 configurations :
- VM Ubuntu 20.04 + GR 3.9.3.0 + UHD 4.1.0.4
- Native LXubuntu 20.04 Prempt kernel + GR 3.9.4.0 + UHD 4.1.0.4
All are built from sources.
RX SR = 5Msps
TX SR = 200ksps
All seem to be supported by N210. Yes I decimate with the write value
(RX SR / TX SR).
On the VM system, I see a lot of underflow that appear randomly. I could
measure up to near a second of propagation delay in the flowgraph after
10min working period : it's unusable.
Indeed, working with a native Preempt linux distribution eliminate near
all underflow. But sometimes, maybe when OS generates an interrupt with
higher priority, I could get one underflow : one underflow in that case
in 8H working period. I can accept that if I can reset the flowgraph
just after without killing it and restart. The question is how ?
Best regards,
Fabien, F4CTZ.
Le 27/10/2021 à 14:47, Johannes Demel a écrit :
Hi Fabien,
unless this is a very specific issue and you know exactly that your OS
is the component that causes an issue, I recommend to stick with your
distros generic kernel image.
I'd need more information but my gut feeling tells me that your issue
is somehow a 2-clock problem.
So let's start with a few questions about your system.
Which Linux distribution do you use? Which exact GNU Radio and UHD
versions do you use? GR 3.9.3? UHD 4.1.0.x? How did you install GNU
Radio. Do you run your flowgraph in a VM or smth similar?
UHD RX sample rate?
UHD TX sample rate?
Are both rates supported by your N210?
Does your flowgraph decimate by some integer value?
Which blocks are in between?
Just to get this out of the way, another hardware block such as an
audio sink might get you into a 2-clock problem situation. Since you
use hardware blocks, I assume you don't use a Throttle block, if so,
remove the Throttle block.
Can you share the flowgraph? It might be easiest to just write down
the exact blocks.
Are there any custom blocks?
Do you need continuous streaming?
How fast does the delay grow?
A lot of questions, I know. The answers to these questions might help
to find your root issue.
Cheers
Johannes
On 26.10.21 21:41, Fabien PELLET wrote:
Hello,
Thanks for the answer Marcus.
OK I understand that. But is there any solution which permits to
reset that growing propagation delay ? How to reset the flowgraph
buffers without killing the application and restart it ? Is there any
method that permits to purge and resync buffers of the flowgraph ?
Even if my application runs on a preempt_rt OS with a good
calculation power, I'm not enough good in Linux tweaking to be sure
that my application will not have a unusable delay after a long time.
So I can accept to loose some time when I catch a PMT message of
underflow to reset the sequencer and buffers. But how without killing
apps ??
Best regards,
Fabien, F4CTZ
---- Marcus Müller a écrit ----
Hello!
On 26.10.21 16:12, Fabien PELLET wrote:
>
> Why that propagation delay is always growing ?
>
Exactly *becuause* your underflowing.
Your Receive side produces N samples – but too slow at some point,
leading to your
transmitter needing to "invent" an amount P of samples, because it
simply has a fixed
sample rate.
So, now, from the point of view of the transmitter's DAC, N+P sample
periods have passed,
whereas the receiver's ADC saw N sample periods. This repeats, and
every P > 0. Therefore,
the delay is always only growing.
Best regards,
Marcus
options:
parameters:
author: osboxes
catch_exceptions: 'True'
category: '[GRC Hier Blocks]'
cmake_opt: '""'
comment: ''
copyright: hgjhg
description: hjhghg
gen_cmake: 'On'
gen_linking: dynamic
generate_options: qt_gui
hier_block_src_path: '.:'
id: testcpp
max_nouts: '0'
output_language: python
placement: (0,0)
qt_qss_theme: ''
realtime_scheduling: ''
run: 'True'
run_command: '{python} -u {filename}'
run_options: prompt
sizing_mode: fixed
thread_safe_setters: '1'
title: test
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [8, 8]
rotation: 0
state: enabled
blocks:
- name: samp_rate
id: variable
parameters:
comment: ''
value: '5000000'
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [184, 12]
rotation: 0
state: enabled
- name: analog_agc2_xx_0
id: analog_agc2_xx
parameters:
affinity: ''
alias: ''
attack_rate: 10e-3
comment: ''
decay_rate: 5e-1
gain: '1.0'
max_gain: '65536'
maxoutbuf: '0'
minoutbuf: '0'
reference: '0.4'
type: complex
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [672, 388.0]
rotation: 0
state: enabled
- name: fir_filter_xxx_0
id: fir_filter_xxx
parameters:
affinity: ''
alias: ''
comment: ''
decim: '25'
maxoutbuf: '0'
minoutbuf: '0'
samp_delay: '0'
taps:
firdes.complex_band_pass_2(1.0,samp_rate,150,3000,samp_rate*0.1,50,window.WIN_BLACKMAN_HARRIS)
type: ccc
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [464, 556.0]
rotation: 0
state: true
- name: qtgui_waterfall_sink_x_0
id: qtgui_waterfall_sink_x
parameters:
affinity: ''
alias: ''
alpha1: '1.0'
alpha10: '1.0'
alpha2: '1.0'
alpha3: '1.0'
alpha4: '1.0'
alpha5: '1.0'
alpha6: '1.0'
alpha7: '1.0'
alpha8: '1.0'
alpha9: '1.0'
axislabels: 'True'
bw: samp_rate
color1: '0'
color10: '0'
color2: '0'
color3: '0'
color4: '0'
color5: '0'
color6: '0'
color7: '0'
color8: '0'
color9: '0'
comment: ''
fc: 10e6
fftsize: '8192'
freqhalf: 'True'
grid: 'False'
gui_hint: ''
int_max: '10'
int_min: '-140'
label1: dtft
label10: ''
label2: ''
label3: ''
label4: ''
label5: ''
label6: ''
label7: ''
label8: ''
label9: ''
legend: 'False'
maxoutbuf: '0'
minoutbuf: '0'
name: ''
nconnections: '1'
showports: 'True'
type: complex
update_time: '0.05'
wintype: window.WIN_BLACKMAN_hARRIS
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [632, 224.0]
rotation: 0
state: enabled
- name: uhd_usrp_sink_0
id: uhd_usrp_sink
parameters:
affinity: ''
alias: ''
ant0: '"TX/RX"'
ant1: '"TX/RX"'
ant10: '"TX/RX"'
ant11: '"TX/RX"'
ant12: '"TX/RX"'
ant13: '"TX/RX"'
ant14: '"TX/RX"'
ant15: '"TX/RX"'
ant16: '"TX/RX"'
ant17: '"TX/RX"'
ant18: '"TX/RX"'
ant19: '"TX/RX"'
ant2: '"TX/RX"'
ant20: '"TX/RX"'
ant21: '"TX/RX"'
ant22: '"TX/RX"'
ant23: '"TX/RX"'
ant24: '"TX/RX"'
ant25: '"TX/RX"'
ant26: '"TX/RX"'
ant27: '"TX/RX"'
ant28: '"TX/RX"'
ant29: '"TX/RX"'
ant3: '"TX/RX"'
ant30: '"TX/RX"'
ant31: '"TX/RX"'
ant4: '"TX/RX"'
ant5: '"TX/RX"'
ant6: '"TX/RX"'
ant7: '"TX/RX"'
ant8: '"TX/RX"'
ant9: '"TX/RX"'
bw0: '0'
bw1: '0'
bw10: '0'
bw11: '0'
bw12: '0'
bw13: '0'
bw14: '0'
bw15: '0'
bw16: '0'
bw17: '0'
bw18: '0'
bw19: '0'
bw2: '0'
bw20: '0'
bw21: '0'
bw22: '0'
bw23: '0'
bw24: '0'
bw25: '0'
bw26: '0'
bw27: '0'
bw28: '0'
bw29: '0'
bw3: '0'
bw30: '0'
bw31: '0'
bw4: '0'
bw5: '0'
bw6: '0'
bw7: '0'
bw8: '0'
bw9: '0'
center_freq0: '0'
center_freq1: '0'
center_freq10: '0'
center_freq11: '0'
center_freq12: '0'
center_freq13: '0'
center_freq14: '0'
center_freq15: '0'
center_freq16: '0'
center_freq17: '0'
center_freq18: '0'
center_freq19: '0'
center_freq2: '0'
center_freq20: '0'
center_freq21: '0'
center_freq22: '0'
center_freq23: '0'
center_freq24: '0'
center_freq25: '0'
center_freq26: '0'
center_freq27: '0'
center_freq28: '0'
center_freq29: '0'
center_freq3: '0'
center_freq30: '0'
center_freq31: '0'
center_freq4: '0'
center_freq5: '0'
center_freq6: '0'
center_freq7: '0'
center_freq8: '0'
center_freq9: '0'
clock_rate: 0e0
clock_source0: ''
clock_source1: ''
clock_source2: ''
clock_source3: ''
clock_source4: ''
clock_source5: ''
clock_source6: ''
clock_source7: ''
comment: ''
dev_addr: '"addr=192.168.10.2"'
dev_args: ''
gain0: '0'
gain1: '0'
gain10: '0'
gain11: '0'
gain12: '0'
gain13: '0'
gain14: '0'
gain15: '0'
gain16: '0'
gain17: '0'
gain18: '0'
gain19: '0'
gain2: '0'
gain20: '0'
gain21: '0'
gain22: '0'
gain23: '0'
gain24: '0'
gain25: '0'
gain26: '0'
gain27: '0'
gain28: '0'
gain29: '0'
gain3: '0'
gain30: '0'
gain31: '0'
gain4: '0'
gain5: '0'
gain6: '0'
gain7: '0'
gain8: '0'
gain9: '0'
gain_type0: default
gain_type1: default
gain_type10: default
gain_type11: default
gain_type12: default
gain_type13: default
gain_type14: default
gain_type15: default
gain_type16: default
gain_type17: default
gain_type18: default
gain_type19: default
gain_type2: default
gain_type20: default
gain_type21: default
gain_type22: default
gain_type23: default
gain_type24: default
gain_type25: default
gain_type26: default
gain_type27: default
gain_type28: default
gain_type29: default
gain_type3: default
gain_type30: default
gain_type31: default
gain_type4: default
gain_type5: default
gain_type6: default
gain_type7: default
gain_type8: default
gain_type9: default
len_tag_name: '""'
lo_export0: 'False'
lo_export1: 'False'
lo_export10: 'False'
lo_export11: 'False'
lo_export12: 'False'
lo_export13: 'False'
lo_export14: 'False'
lo_export15: 'False'
lo_export16: 'False'
lo_export17: 'False'
lo_export18: 'False'
lo_export19: 'False'
lo_export2: 'False'
lo_export20: 'False'
lo_export21: 'False'
lo_export22: 'False'
lo_export23: 'False'
lo_export24: 'False'
lo_export25: 'False'
lo_export26: 'False'
lo_export27: 'False'
lo_export28: 'False'
lo_export29: 'False'
lo_export3: 'False'
lo_export30: 'False'
lo_export31: 'False'
lo_export4: 'False'
lo_export5: 'False'
lo_export6: 'False'
lo_export7: 'False'
lo_export8: 'False'
lo_export9: 'False'
lo_source0: internal
lo_source1: internal
lo_source10: internal
lo_source11: internal
lo_source12: internal
lo_source13: internal
lo_source14: internal
lo_source15: internal
lo_source16: internal
lo_source17: internal
lo_source18: internal
lo_source19: internal
lo_source2: internal
lo_source20: internal
lo_source21: internal
lo_source22: internal
lo_source23: internal
lo_source24: internal
lo_source25: internal
lo_source26: internal
lo_source27: internal
lo_source28: internal
lo_source29: internal
lo_source3: internal
lo_source30: internal
lo_source31: internal
lo_source4: internal
lo_source5: internal
lo_source6: internal
lo_source7: internal
lo_source8: internal
lo_source9: internal
maxoutbuf: '0'
minoutbuf: '0'
nchan: '1'
num_mboards: '1'
otw: ''
samp_rate: samp_rate/25
sd_spec0: '"A:AB"'
sd_spec1: ''
sd_spec2: ''
sd_spec3: ''
sd_spec4: ''
sd_spec5: ''
sd_spec6: ''
sd_spec7: ''
show_lo_controls: 'False'
start_time: '-1.0'
stream_args: ''
stream_chans: '[]'
sync: none
time_source0: ''
time_source1: ''
time_source2: ''
time_source3: ''
time_source4: ''
time_source5: ''
time_source6: ''
time_source7: ''
type: fc32
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [952, 316.0]
rotation: 0
state: true
- name: uhd_usrp_source_1
id: uhd_usrp_source
parameters:
affinity: ''
alias: ''
ant0: '"RX1"'
ant1: '"RX2"'
ant10: '"RX2"'
ant11: '"RX2"'
ant12: '"RX2"'
ant13: '"RX2"'
ant14: '"RX2"'
ant15: '"RX2"'
ant16: '"RX2"'
ant17: '"RX2"'
ant18: '"RX2"'
ant19: '"RX2"'
ant2: '"RX2"'
ant20: '"RX2"'
ant21: '"RX2"'
ant22: '"RX2"'
ant23: '"RX2"'
ant24: '"RX2"'
ant25: '"RX2"'
ant26: '"RX2"'
ant27: '"RX2"'
ant28: '"RX2"'
ant29: '"RX2"'
ant3: '"RX2"'
ant30: '"RX2"'
ant31: '"RX2"'
ant4: '"RX2"'
ant5: '"RX2"'
ant6: '"RX2"'
ant7: '"RX2"'
ant8: '"RX2"'
ant9: '"RX2"'
bw0: '0'
bw1: '0'
bw10: '0'
bw11: '0'
bw12: '0'
bw13: '0'
bw14: '0'
bw15: '0'
bw16: '0'
bw17: '0'
bw18: '0'
bw19: '0'
bw2: '0'
bw20: '0'
bw21: '0'
bw22: '0'
bw23: '0'
bw24: '0'
bw25: '0'
bw26: '0'
bw27: '0'
bw28: '0'
bw29: '0'
bw3: '0'
bw30: '0'
bw31: '0'
bw4: '0'
bw5: '0'
bw6: '0'
bw7: '0'
bw8: '0'
bw9: '0'
center_freq0: 10e6
center_freq1: '0'
center_freq10: '0'
center_freq11: '0'
center_freq12: '0'
center_freq13: '0'
center_freq14: '0'
center_freq15: '0'
center_freq16: '0'
center_freq17: '0'
center_freq18: '0'
center_freq19: '0'
center_freq2: '0'
center_freq20: '0'
center_freq21: '0'
center_freq22: '0'
center_freq23: '0'
center_freq24: '0'
center_freq25: '0'
center_freq26: '0'
center_freq27: '0'
center_freq28: '0'
center_freq29: '0'
center_freq3: '0'
center_freq30: '0'
center_freq31: '0'
center_freq4: '0'
center_freq5: '0'
center_freq6: '0'
center_freq7: '0'
center_freq8: '0'
center_freq9: '0'
clock_rate: 0e0
clock_source0: ''
clock_source1: ''
clock_source2: ''
clock_source3: ''
clock_source4: ''
clock_source5: ''
clock_source6: ''
clock_source7: ''
comment: ''
dc_offs0: 0+0j
dc_offs1: 0+0j
dc_offs10: 0+0j
dc_offs11: 0+0j
dc_offs12: 0+0j
dc_offs13: 0+0j
dc_offs14: 0+0j
dc_offs15: 0+0j
dc_offs16: 0+0j
dc_offs17: 0+0j
dc_offs18: 0+0j
dc_offs19: 0+0j
dc_offs2: 0+0j
dc_offs20: 0+0j
dc_offs21: 0+0j
dc_offs22: 0+0j
dc_offs23: 0+0j
dc_offs24: 0+0j
dc_offs25: 0+0j
dc_offs26: 0+0j
dc_offs27: 0+0j
dc_offs28: 0+0j
dc_offs29: 0+0j
dc_offs3: 0+0j
dc_offs30: 0+0j
dc_offs31: 0+0j
dc_offs4: 0+0j
dc_offs5: 0+0j
dc_offs6: 0+0j
dc_offs7: 0+0j
dc_offs8: 0+0j
dc_offs9: 0+0j
dc_offs_enb0: disabled
dc_offs_enb1: default
dc_offs_enb10: default
dc_offs_enb11: default
dc_offs_enb12: default
dc_offs_enb13: default
dc_offs_enb14: default
dc_offs_enb15: default
dc_offs_enb16: default
dc_offs_enb17: default
dc_offs_enb18: default
dc_offs_enb19: default
dc_offs_enb2: default
dc_offs_enb20: default
dc_offs_enb21: default
dc_offs_enb22: default
dc_offs_enb23: default
dc_offs_enb24: default
dc_offs_enb25: default
dc_offs_enb26: default
dc_offs_enb27: default
dc_offs_enb28: default
dc_offs_enb29: default
dc_offs_enb3: default
dc_offs_enb30: default
dc_offs_enb31: default
dc_offs_enb4: default
dc_offs_enb5: default
dc_offs_enb6: default
dc_offs_enb7: default
dc_offs_enb8: default
dc_offs_enb9: default
dev_addr: '"addr=192.168.10.2"'
dev_args: ''
gain0: '0'
gain1: '0'
gain10: '0'
gain11: '0'
gain12: '0'
gain13: '0'
gain14: '0'
gain15: '0'
gain16: '0'
gain17: '0'
gain18: '0'
gain19: '0'
gain2: '0'
gain20: '0'
gain21: '0'
gain22: '0'
gain23: '0'
gain24: '0'
gain25: '0'
gain26: '0'
gain27: '0'
gain28: '0'
gain29: '0'
gain3: '0'
gain30: '0'
gain31: '0'
gain4: '0'
gain5: '0'
gain6: '0'
gain7: '0'
gain8: '0'
gain9: '0'
gain_type0: default
gain_type1: default
gain_type10: default
gain_type11: default
gain_type12: default
gain_type13: default
gain_type14: default
gain_type15: default
gain_type16: default
gain_type17: default
gain_type18: default
gain_type19: default
gain_type2: default
gain_type20: default
gain_type21: default
gain_type22: default
gain_type23: default
gain_type24: default
gain_type25: default
gain_type26: default
gain_type27: default
gain_type28: default
gain_type29: default
gain_type3: default
gain_type30: default
gain_type31: default
gain_type4: default
gain_type5: default
gain_type6: default
gain_type7: default
gain_type8: default
gain_type9: default
iq_imbal0: 0+0j
iq_imbal1: 0+0j
iq_imbal10: 0+0j
iq_imbal11: 0+0j
iq_imbal12: 0+0j
iq_imbal13: 0+0j
iq_imbal14: 0+0j
iq_imbal15: 0+0j
iq_imbal16: 0+0j
iq_imbal17: 0+0j
iq_imbal18: 0+0j
iq_imbal19: 0+0j
iq_imbal2: 0+0j
iq_imbal20: 0+0j
iq_imbal21: 0+0j
iq_imbal22: 0+0j
iq_imbal23: 0+0j
iq_imbal24: 0+0j
iq_imbal25: 0+0j
iq_imbal26: 0+0j
iq_imbal27: 0+0j
iq_imbal28: 0+0j
iq_imbal29: 0+0j
iq_imbal3: 0+0j
iq_imbal30: 0+0j
iq_imbal31: 0+0j
iq_imbal4: 0+0j
iq_imbal5: 0+0j
iq_imbal6: 0+0j
iq_imbal7: 0+0j
iq_imbal8: 0+0j
iq_imbal9: 0+0j
iq_imbal_enb0: disabled
iq_imbal_enb1: default
iq_imbal_enb10: default
iq_imbal_enb11: default
iq_imbal_enb12: default
iq_imbal_enb13: default
iq_imbal_enb14: default
iq_imbal_enb15: default
iq_imbal_enb16: default
iq_imbal_enb17: default
iq_imbal_enb18: default
iq_imbal_enb19: default
iq_imbal_enb2: default
iq_imbal_enb20: default
iq_imbal_enb21: default
iq_imbal_enb22: default
iq_imbal_enb23: default
iq_imbal_enb24: default
iq_imbal_enb25: default
iq_imbal_enb26: default
iq_imbal_enb27: default
iq_imbal_enb28: default
iq_imbal_enb29: default
iq_imbal_enb3: default
iq_imbal_enb30: default
iq_imbal_enb31: default
iq_imbal_enb4: default
iq_imbal_enb5: default
iq_imbal_enb6: default
iq_imbal_enb7: default
iq_imbal_enb8: default
iq_imbal_enb9: default
lo_export0: 'False'
lo_export1: 'False'
lo_export10: 'False'
lo_export11: 'False'
lo_export12: 'False'
lo_export13: 'False'
lo_export14: 'False'
lo_export15: 'False'
lo_export16: 'False'
lo_export17: 'False'
lo_export18: 'False'
lo_export19: 'False'
lo_export2: 'False'
lo_export20: 'False'
lo_export21: 'False'
lo_export22: 'False'
lo_export23: 'False'
lo_export24: 'False'
lo_export25: 'False'
lo_export26: 'False'
lo_export27: 'False'
lo_export28: 'False'
lo_export29: 'False'
lo_export3: 'False'
lo_export30: 'False'
lo_export31: 'False'
lo_export4: 'False'
lo_export5: 'False'
lo_export6: 'False'
lo_export7: 'False'
lo_export8: 'False'
lo_export9: 'False'
lo_source0: internal
lo_source1: internal
lo_source10: internal
lo_source11: internal
lo_source12: internal
lo_source13: internal
lo_source14: internal
lo_source15: internal
lo_source16: internal
lo_source17: internal
lo_source18: internal
lo_source19: internal
lo_source2: internal
lo_source20: internal
lo_source21: internal
lo_source22: internal
lo_source23: internal
lo_source24: internal
lo_source25: internal
lo_source26: internal
lo_source27: internal
lo_source28: internal
lo_source29: internal
lo_source3: internal
lo_source30: internal
lo_source31: internal
lo_source4: internal
lo_source5: internal
lo_source6: internal
lo_source7: internal
lo_source8: internal
lo_source9: internal
maxoutbuf: '0'
minoutbuf: '0'
nchan: '1'
num_mboards: '1'
otw: ''
rx_agc0: Default
rx_agc1: Default
rx_agc10: Default
rx_agc11: Default
rx_agc12: Default
rx_agc13: Default
rx_agc14: Default
rx_agc15: Default
rx_agc16: Default
rx_agc17: Default
rx_agc18: Default
rx_agc19: Default
rx_agc2: Default
rx_agc20: Default
rx_agc21: Default
rx_agc22: Default
rx_agc23: Default
rx_agc24: Default
rx_agc25: Default
rx_agc26: Default
rx_agc27: Default
rx_agc28: Default
rx_agc29: Default
rx_agc3: Default
rx_agc30: Default
rx_agc31: Default
rx_agc4: Default
rx_agc5: Default
rx_agc6: Default
rx_agc7: Default
rx_agc8: Default
rx_agc9: Default
samp_rate: samp_rate
sd_spec0: '"A:A"'
sd_spec1: ''
sd_spec2: ''
sd_spec3: ''
sd_spec4: ''
sd_spec5: ''
sd_spec6: ''
sd_spec7: ''
show_lo_controls: 'False'
start_time: '-1.0'
stream_args: ''
stream_chans: '[]'
sync: none
time_source0: ''
time_source1: ''
time_source2: ''
time_source3: ''
time_source4: ''
time_source5: ''
time_source6: ''
time_source7: ''
type: fc32
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [149, 438]
rotation: 0
state: true
connections:
- [analog_agc2_xx_0, '0', uhd_usrp_sink_0, '0']
- [fir_filter_xxx_0, '0', analog_agc2_xx_0, '0']
- [uhd_usrp_source_1, '0', fir_filter_xxx_0, '0']
- [uhd_usrp_source_1, '0', qtgui_waterfall_sink_x_0, '0']
metadata:
file_format: 1