Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lizhongxiao
OpenXG-RAN
Commits
d6923bf0
Commit
d6923bf0
authored
Nov 02, 2023
by
Raymond Knopp
Committed by
Robert Schmidt
Feb 06, 2024
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
synchronization of RU and L1 threads to avoid race condition with
rfsimulator
parent
d32d40f0
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
65 additions
and
18 deletions
+65
-18
executables/nr-gnb.c
executables/nr-gnb.c
+12
-0
executables/nr-ru.c
executables/nr-ru.c
+34
-2
openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+2
-2
openair1/PHY/NR_TRANSPORT/pucch_rx.c
openair1/PHY/NR_TRANSPORT/pucch_rx.c
+3
-7
openair1/PHY/NR_TRANSPORT/srs_rx.c
openair1/PHY/NR_TRANSPORT/srs_rx.c
+2
-1
openair1/PHY/defs_RU.h
openair1/PHY/defs_RU.h
+1
-1
openair1/PHY/defs_gNB.h
openair1/PHY/defs_gNB.h
+6
-0
openair1/SCHED_NR/nr_ru_procedures.c
openair1/SCHED_NR/nr_ru_procedures.c
+2
-2
openair1/SCHED_NR/phy_procedures_nr_gNB.c
openair1/SCHED_NR/phy_procedures_nr_gNB.c
+3
-3
No files found.
executables/nr-gnb.c
View file @
d6923bf0
...
...
@@ -239,6 +239,7 @@ void rx_func(void *param)
// RX processing
int
rx_slot_type
=
nr_slot_select
(
cfg
,
frame_rx
,
slot_rx
);
if
(
rx_slot_type
==
NR_UPLINK_SLOT
||
rx_slot_type
==
NR_MIXED_SLOT
)
{
LOG_D
(
NR_PHY
,
"%d.%d Starting RX processing
\n
"
,
frame_rx
,
slot_rx
);
// UE-specific RX processing for subframe n
// TODO: check if this is correct for PARALLEL_RU_L1_TRX_SPLIT
...
...
@@ -271,6 +272,15 @@ void rx_func(void *param)
gNB
->
UL_INFO
.
CC_id
=
gNB
->
CC_id
;
gNB
->
if_inst
->
NR_UL_indication
(
&
gNB
->
UL_INFO
);
stop_meas
(
&
gNB
->
ul_indication_stats
);
notifiedFIFO_elt_t
*
res
=
newNotifiedFIFO_elt
(
sizeof
(
processingData_L1_t
),
0
,
&
gNB
->
L1_rx_out
,
NULL
);
processingData_L1_t
*
syncMsg
=
NotifiedFifoData
(
res
);
syncMsg
->
gNB
=
gNB
;
syncMsg
->
frame_rx
=
frame_rx
;
syncMsg
->
slot_rx
=
slot_rx
;
res
->
key
=
slot_rx
;
LOG_D
(
NR_PHY
,
"Signaling completion for %d.%d (mod_slot %d) on L1_rx_out
\n
"
,
frame_rx
,
slot_rx
,
slot_rx
%
RU_RX_SLOT_DEPTH
);
pushNotifiedFIFO
(
&
gNB
->
L1_rx_out
,
res
);
}
stop_meas
(
&
softmodem_stats_rxtx_sf
);
...
...
@@ -372,6 +382,7 @@ void init_gNB_Tpool(int inst) {
initNotifiedFIFO
(
&
gNB
->
L1_tx_free
);
initNotifiedFIFO
(
&
gNB
->
L1_tx_filled
);
initNotifiedFIFO
(
&
gNB
->
L1_tx_out
);
initNotifiedFIFO
(
&
gNB
->
L1_rx_out
);
// create the RX thread responsible for triggering RX processing and then TX processing if a single thread is used
threadCreate
(
&
gNB
->
L1_rx_thread
,
L1_rx_thread
,
(
void
*
)
gNB
,
"L1_rx_thread"
,
gNB
->
L1_rx_thread_core
,
OAI_PRIORITY_RT_MAX
);
...
...
@@ -400,6 +411,7 @@ void term_gNB_Tpool(int inst) {
abortNotifiedFIFO
(
&
gNB
->
L1_tx_free
);
abortNotifiedFIFO
(
&
gNB
->
L1_tx_filled
);
abortNotifiedFIFO
(
&
gNB
->
L1_tx_out
);
abortNotifiedFIFO
(
&
gNB
->
L1_rx_out
);
gNB_L1_proc_t
*
proc
=
&
gNB
->
proc
;
if
(
!
get_softmodem_params
()
->
emulate_l1
)
...
...
executables/nr-ru.c
View file @
d6923bf0
...
...
@@ -1169,6 +1169,7 @@ void *ru_thread( void *param ) {
int
initial_wait
=
0
;
int
opp_enabled0
=
opp_enabled
;
bool
rx_tti_busy
[
RU_RX_SLOT_DEPTH
]
=
{
false
};
nfapi_nr_config_request_scf_t
*
cfg
=
&
ru
->
config
;
// set default return value
ru_thread_status
=
0
;
...
...
@@ -1298,7 +1299,7 @@ void *ru_thread( void *param ) {
if
(
initial_wait
==
1
&&
proc
->
frame_rx
<
300
)
{
if
(
proc
->
frame_rx
>
0
&&
((
proc
->
frame_rx
%
100
)
==
0
)
&&
proc
->
tti_rx
==
0
)
{
LOG_
I
(
PHY
,
"delay processing to let RX stream settle, frame %d (trials %d)
\n
"
,
proc
->
frame_rx
,
ru
->
rx_fhaul
.
trials
);
LOG_
D
(
PHY
,
"delay processing to let RX stream settle, frame %d (trials %d)
\n
"
,
proc
->
frame_rx
,
ru
->
rx_fhaul
.
trials
);
print_meas
(
&
ru
->
rx_fhaul
,
"rx_fhaul"
,
NULL
,
NULL
);
reset_meas
(
&
ru
->
rx_fhaul
);
}
...
...
@@ -1331,12 +1332,43 @@ void *ru_thread( void *param ) {
if
(
ru
->
idx
!=
0
)
proc
->
frame_tx
=
(
proc
->
frame_tx
+
proc
->
frame_offset
)
&
1023
;
LOG_D
(
NR_PHY
,
"In %d.%d: Checking L1 status
\n
"
,
proc
->
frame_rx
,
proc
->
tti_rx
);
for
(
int
n
=
0
;
n
<
RU_RX_SLOT_DEPTH
;
n
++
)
LOG_D
(
NR_PHY
,
"slot n %d => %d
\n
"
,
n
,
rx_tti_busy
[
n
]);
// handle potential race by blocking if rxdataF is being used by L1
// first empty L1 return fifo and block on current slot if needed
notifiedFIFO_elt_t
*
res
=
pollNotifiedFIFO
(
&
gNB
->
L1_rx_out
);
LOG_D
(
NR_PHY
,
"%d.%d Polling L1_rx_out %p
\n
"
,
proc
->
frame_rx
,
proc
->
tti_rx
,
res
);
while
(
res
)
{
processingData_L1_t
*
info
=
(
processingData_L1_t
*
)
NotifiedFifoData
(
res
);
LOG_D
(
NR_PHY
,
"%d.%d res %d.%d completed, clearing %d
\n
"
,
proc
->
frame_rx
,
proc
->
tti_rx
,
info
->
frame_rx
,
info
->
slot_rx
,
info
->
slot_rx
%
RU_RX_SLOT_DEPTH
);
rx_tti_busy
[
info
->
slot_rx
%
RU_RX_SLOT_DEPTH
]
=
false
;
res
=
pollNotifiedFIFO
(
&
gNB
->
L1_rx_out
);
}
LOG_D
(
NR_PHY
,
"%d.%d Done polling
\n
"
,
proc
->
frame_rx
,
proc
->
tti_rx
);
// do RX front-end processing (frequency-shift, dft) if needed
int
slot_type
=
nr_slot_select
(
cfg
,
proc
->
frame_rx
,
proc
->
tti_rx
);
if
(
slot_type
==
NR_UPLINK_SLOT
||
slot_type
==
NR_MIXED_SLOT
)
{
if
(
ru
->
feprx
)
{
if
(
rx_tti_busy
[
proc
->
tti_rx
%
RU_RX_SLOT_DEPTH
])
{
bool
not_done
=
true
;
LOG_D
(
NR_PHY
,
"%d.%d Waiting to access RX slot %d
\n
"
,
proc
->
frame_rx
,
proc
->
tti_rx
,
proc
->
tti_rx
%
RU_RX_SLOT_DEPTH
);
while
(
not_done
)
{
res
=
pullNotifiedFIFO
(
&
gNB
->
L1_rx_out
);
if
(
!
res
)
break
;
processingData_L1_t
*
info
=
(
processingData_L1_t
*
)
NotifiedFifoData
(
res
);
LOG_D
(
NR_PHY
,
"%d.%d Got access to RX slot %d.%d (%d)
\n
"
,
proc
->
frame_rx
,
proc
->
tti_rx
,
info
->
frame_rx
,
info
->
slot_rx
,
proc
->
tti_rx
%
RU_RX_SLOT_DEPTH
);
rx_tti_busy
[
info
->
slot_rx
%
RU_RX_SLOT_DEPTH
]
=
false
;
if
((
info
->
slot_rx
%
RU_RX_SLOT_DEPTH
)
==
(
proc
->
tti_rx
%
RU_RX_SLOT_DEPTH
))
not_done
=
false
;
}
if
(
!
res
)
break
;
}
ru
->
feprx
(
ru
,
proc
->
tti_rx
);
//set the tti that was generated to busy
LOG_D
(
NR_PHY
,
"Setting %d.%d (%d) to busy
\n
"
,
proc
->
frame_rx
,
proc
->
tti_rx
,
proc
->
tti_rx
%
RU_RX_SLOT_DEPTH
);
rx_tti_busy
[
proc
->
tti_rx
%
RU_RX_SLOT_DEPTH
]
=
true
;
clock_gettime
(
CLOCK_MONOTONIC
,
&
ru
->
rt_ru_profiling
.
return_RU_feprx
[
rt_prof_idx
]);
//LOG_M("rxdata.m","rxs",ru->common.rxdata[0],1228800,1,1);
LOG_D
(
PHY
,
"RU proc: frame_rx = %d, tti_rx = %d
\n
"
,
proc
->
frame_rx
,
proc
->
tti_rx
);
...
...
openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
View file @
d6923bf0
...
...
@@ -1409,7 +1409,7 @@ static void nr_pusch_symbol_processing(void *arg)
if
(
gNB
->
pusch_vars
[
ulsch_id
].
ul_valid_re_per_slot
[
symbol
]
==
0
)
continue
;
int
soffset
=
(
slot
&
3
)
*
frame_parms
->
symbols_per_slot
*
frame_parms
->
ofdm_symbol_size
;
int
soffset
=
(
slot
%
RU_RX_SLOT_DEPTH
)
*
frame_parms
->
symbols_per_slot
*
frame_parms
->
ofdm_symbol_size
;
inner_rx
(
gNB
,
ulsch_id
,
slot
,
...
...
@@ -1591,7 +1591,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
// extract the first dmrs for the channel level computation
// extract the data in the OFDM frame, to the start of the array
int
soffset
=
(
slot
&
3
)
*
frame_parms
->
symbols_per_slot
*
frame_parms
->
ofdm_symbol_size
;
int
soffset
=
(
slot
%
RU_RX_SLOT_DEPTH
)
*
frame_parms
->
symbols_per_slot
*
frame_parms
->
ofdm_symbol_size
;
nb_re_pusch
=
(
nb_re_pusch
+
15
)
&
~
15
;
...
...
openair1/PHY/NR_TRANSPORT/pucch_rx.c
View file @
d6923bf0
...
...
@@ -501,7 +501,7 @@ void nr_decode_pucch1(c16_t **rxdataF,
* Implement TS 38.211 Subclause 6.3.2.4.1 Sequence modulation
*
*/
const
int
soffset
=
(
nr_tti_tx
&
3
)
*
frame_parms
->
symbols_per_slot
*
frame_parms
->
ofdm_symbol_size
;
const
int
soffset
=
(
nr_tti_tx
%
RU_RX_SLOT_DEPTH
)
*
frame_parms
->
symbols_per_slot
*
frame_parms
->
ofdm_symbol_size
;
// lprime is the index of the OFDM symbol in the slot that corresponds to the first OFDM symbol of the PUCCH transmission in the slot given by [5, TS 38.213]
const
int
lprime
=
startingSymbolIndex
;
// mcs = 0 except for PUCCH format 0
...
...
@@ -1019,16 +1019,12 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
pucch_pdu
->
prb_start
);
//extract pucch and dmrs first
int
l2
=
pucch_pdu
->
start_symbol_index
;
int
soffset
=
(
slot
&
3
)
*
frame_parms
->
symbols_per_slot
*
frame_parms
->
ofdm_symbol_size
;
int
soffset
=
(
slot
%
RU_RX_SLOT_DEPTH
)
*
frame_parms
->
symbols_per_slot
*
frame_parms
->
ofdm_symbol_size
;
int
re_offset
[
2
];
re_offset
[
0
]
=
(
12
*
(
pucch_pdu
->
prb_start
+
pucch_pdu
->
bwp_start
)
+
frame_parms
->
first_carrier_offset
)
%
frame_parms
->
ofdm_symbol_size
;
if
(
re_offset
[
0
]
>=
frame_parms
->
ofdm_symbol_size
)
re_offset
[
0
]
-=
frame_parms
->
ofdm_symbol_size
;
if
(
pucch_pdu
->
freq_hop_flag
==
0
)
re_offset
[
1
]
=
re_offset
[
0
];
else
{
...
...
openair1/PHY/NR_TRANSPORT/srs_rx.c
View file @
d6923bf0
...
...
@@ -34,6 +34,7 @@
#include "PHY/impl_defs_nr.h"
#include "PHY/defs_nr_common.h"
#include "PHY/defs_gNB.h"
#include "PHY/defs_RU.h"
#include "PHY/CODING/nrSmallBlock/nr_small_block_defs.h"
#include "PHY/NR_UE_TRANSPORT/srs_modulation_nr.h"
#include "common/utils/LOG/log.h"
...
...
@@ -75,7 +76,7 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB,
c16_t
**
rxdataF
=
gNB
->
common_vars
.
rxdataF
;
const
NR_DL_FRAME_PARMS
*
frame_parms
=
&
gNB
->
frame_parms
;
const
uint16_t
n_symbols
=
(
slot
&
3
)
*
frame_parms
->
symbols_per_slot
;
// number of symbols until this slot
const
uint16_t
n_symbols
=
(
slot
%
RU_RX_SLOT_DEPTH
)
*
frame_parms
->
symbols_per_slot
;
// number of symbols until this slot
const
uint8_t
l0
=
frame_parms
->
symbols_per_slot
-
1
-
srs_pdu
->
time_start_position
;
// starting symbol in this slot
const
uint64_t
symbol_offset
=
(
n_symbols
+
l0
)
*
frame_parms
->
ofdm_symbol_size
;
const
uint64_t
subcarrier_offset
=
frame_parms
->
first_carrier_offset
+
srs_pdu
->
bwp_start
*
NR_NB_SC_PER_RB
;
...
...
openair1/PHY/defs_RU.h
View file @
d6923bf0
...
...
@@ -197,7 +197,7 @@ typedef struct {
#define NUMBER_OF_NR_RU_PRACH_MAX 8
#define NUMBER_OF_NR_RU_PRACH_OCCASIONS_MAX 12
#define RU_RX_SLOT_DEPTH 4
typedef
struct
RU_proc_t_s
{
/// Pointer to associated RU descriptor
struct
RU_t_s
*
ru
;
...
...
openair1/PHY/defs_gNB.h
View file @
d6923bf0
...
...
@@ -716,6 +716,7 @@ typedef struct PHY_VARS_gNB_s {
notifiedFIFO_t
L1_tx_free
;
notifiedFIFO_t
L1_tx_filled
;
notifiedFIFO_t
L1_tx_out
;
notifiedFIFO_t
L1_rx_out
;
notifiedFIFO_t
resp_RU_tx
;
tpool_t
threadPool
;
int
nbSymb
;
...
...
@@ -823,4 +824,9 @@ typedef struct processingData_L1tx {
int
sched_response_id
;
}
processingData_L1tx_t
;
typedef
struct
processingData_L1rx
{
int
frame_rx
;
int
slot_rx
;
PHY_VARS_gNB
*
gNB
;
}
processingData_L1rx_t
;
#endif
openair1/SCHED_NR/nr_ru_procedures.c
View file @
d6923bf0
...
...
@@ -242,7 +242,7 @@ void nr_fep_full(RU_t *ru, int slot) {
// remove_7_5_kHz(ru,proc->tti_rx<<1);
// remove_7_5_kHz(ru,1+(proc->tti_rx<<1));
int
offset
=
(
proc
->
tti_rx
&
3
)
*
(
fp
->
symbols_per_slot
*
fp
->
ofdm_symbol_size
);
int
offset
=
(
proc
->
tti_rx
%
RU_RX_SLOT_DEPTH
)
*
(
fp
->
symbols_per_slot
*
fp
->
ofdm_symbol_size
);
for
(
l
=
0
;
l
<
fp
->
symbols_per_slot
;
l
++
)
{
for
(
aa
=
0
;
aa
<
fp
->
nb_antennas_rx
;
aa
++
)
{
nr_slot_fep_ul
(
fp
,
...
...
@@ -378,7 +378,7 @@ void nr_fep(void* arg) {
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX
+
aid
,
1
);
int
offset
=
(
tti_rx
&
3
)
*
fp
->
symbols_per_slot
*
fp
->
ofdm_symbol_size
;
int
offset
=
(
tti_rx
%
RU_RX_SLOT_DEPTH
)
*
fp
->
symbols_per_slot
*
fp
->
ofdm_symbol_size
;
for
(
int
l
=
startSymbol
;
l
<=
endSymbol
;
l
++
)
nr_slot_fep_ul
(
fp
,
ru
->
common
.
rxdata
[
aid
],
...
...
openair1/SCHED_NR/phy_procedures_nr_gNB.c
View file @
d6923bf0
...
...
@@ -317,7 +317,7 @@ static void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req)
if (ulsch_harq->ulsch_pdu.mcs_index == 0 && dumpsig==1) {
int off = ((ulsch_harq->ulsch_pdu.rb_size&1) == 1)? 4:0;
LOG_M("rxsigF0.m","rxsF0",&gNB->common_vars.rxdataF[0][(ulsch_harq->slot
&3
)*gNB->frame_parms.ofdm_symbol_size*gNB->frame_parms.symbols_per_slot],gNB->frame_parms.ofdm_symbol_size*gNB->frame_parms.symbols_per_slot,1,1);
LOG_M("rxsigF0.m","rxsF0",&gNB->common_vars.rxdataF[0][(ulsch_harq->slot
%RU_RX_SLOT_DEPTH
)*gNB->frame_parms.ofdm_symbol_size*gNB->frame_parms.symbols_per_slot],gNB->frame_parms.ofdm_symbol_size*gNB->frame_parms.symbols_per_slot,1,1);
LOG_M("rxsigF0_ext.m","rxsF0_ext",
&gNB->pusch_vars[0].rxdataF_ext[0][ulsch_harq->ulsch_pdu.start_symbol_index*NR_NB_SC_PER_RB *
ulsch_harq->ulsch_pdu.rb_size],ulsch_harq->ulsch_pdu.nr_of_symbols*(off+(NR_NB_SC_PER_RB *
...
...
@@ -465,7 +465,7 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
__attribute__
((
unused
))
int
off
=
((
pusch_pdu
->
rb_size
&
1
)
==
1
)
?
4
:
0
;
LOG_M
(
"rxsigF0.m"
,
"rxsF0"
,
&
gNB
->
common_vars
.
rxdataF
[
0
][(
slot_rx
&
3
)
*
gNB
->
frame_parms
.
ofdm_symbol_size
*
gNB
->
frame_parms
.
symbols_per_slot
],
gNB
->
frame_parms
.
ofdm_symbol_size
*
gNB
->
frame_parms
.
symbols_per_slot
,
1
,
1
);
LOG_M
(
"rxsigF0.m"
,
"rxsF0"
,
&
gNB
->
common_vars
.
rxdataF
[
0
][(
slot_rx
%
RU_RX_SLOT_DEPTH
)
*
gNB
->
frame_parms
.
ofdm_symbol_size
*
gNB
->
frame_parms
.
symbols_per_slot
],
gNB
->
frame_parms
.
ofdm_symbol_size
*
gNB
->
frame_parms
.
symbols_per_slot
,
1
,
1
);
LOG_M
(
"chestF0.m"
,
"chF0"
,
&
gNB
->
pusch_vars
[
0
].
ul_ch_estimates
[
0
][
pusch_pdu
->
start_symbol_index
*
gNB
->
frame_parms
.
ofdm_symbol_size
],
...
...
@@ -492,7 +492,7 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
1
,
0
);
if
(
gNB
->
frame_parms
.
nb_antennas_rx
>
1
)
{
LOG_M
(
"rxsigF1.m"
,
"rxsF1"
,
&
gNB
->
common_vars
.
rxdataF
[
1
][(
slot_rx
&
3
)
*
gNB
->
frame_parms
.
ofdm_symbol_size
*
gNB
->
frame_parms
.
symbols_per_slot
],
gNB
->
frame_parms
.
ofdm_symbol_size
*
gNB
->
frame_parms
.
symbols_per_slot
,
1
,
1
);
LOG_M
(
"rxsigF1.m"
,
"rxsF1"
,
&
gNB
->
common_vars
.
rxdataF
[
1
][(
slot_rx
%
RU_RX_SLOT_DEPTH
)
*
gNB
->
frame_parms
.
ofdm_symbol_size
*
gNB
->
frame_parms
.
symbols_per_slot
],
gNB
->
frame_parms
.
ofdm_symbol_size
*
gNB
->
frame_parms
.
symbols_per_slot
,
1
,
1
);
LOG_M
(
"chestF1.m"
,
"chF1"
,
&
gNB
->
pusch_vars
[
0
].
ul_ch_estimates
[
1
][
pusch_pdu
->
start_symbol_index
*
gNB
->
frame_parms
.
ofdm_symbol_size
],
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment