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
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
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
OpenXG
OpenXG-RAN
Commits
e4526a8f
Commit
e4526a8f
authored
Sep 03, 2014
by
Raymond Knopp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
git-svn-id:
http://svn.eurecom.fr/openair4G/trunk@5776
818b1a75-f10b-46b9-bf7c-635c3b92a50f
parent
e1e8a6fd
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
434 additions
and
65 deletions
+434
-65
targets/RT/USER/lte-softmodem.c
targets/RT/USER/lte-softmodem.c
+379
-19
targets/RT/USER/sched_dlsch.c
targets/RT/USER/sched_dlsch.c
+9
-9
targets/RT/USER/sched_rx_pdsch.c
targets/RT/USER/sched_rx_pdsch.c
+31
-31
targets/SIMU/USER/oaisim.c
targets/SIMU/USER/oaisim.c
+15
-6
No files found.
targets/RT/USER/lte-softmodem.c
View file @
e4526a8f
...
...
@@ -167,30 +167,37 @@ unsigned char scope_enb_num_ue = 1;
static
SEM
*
mutex
;
//static CND *cond;
static
int
thread0
;
static
int
thread1
;
static
int
main_eNB_thread
;
static
int
main_ue_thread
;
#ifdef USRP
static
SEM
*
sync_sem
;
// to sync rx & tx streaming
#endif
//static int sync_thread;
#else
pthread_t
thread0
;
pthread_t
thread1
;
pthread_t
main_eNB_thread
;
pthread_t
main_ue_thread
;
pthread_attr_t
attr_dlsch_threads
;
struct
sched_param
sched_param_dlsch
;
#ifdef USRP
pthread_cond_t
sync_cond
;
pthread_mutex_t
sync_mutex
;
#endif
#endif
pthread_attr_t
attr_UE_init_synch
;
pthread_attr_t
attr_UE_thread_tx
;
pthread_attr_t
attr_UE_thread_rx
;
pthread_attr_t
attr_eNB_proc_tx
[
MAX_NUM_CCs
][
10
];
pthread_attr_t
attr_eNB_proc_rx
[
MAX_NUM_CCs
][
10
];
struct
sched_param
sched_param_UE_init_synch
;
struct
sched_param
sched_param_UE_thread_tx
;
struct
sched_param
sched_param_UE_thread_rx
;
struct
sched_param
sched_param_eNB_proc_tx
[
MAX_NUM_CCs
][
10
];
struct
sched_param
sched_param_eNB_proc_rx
[
MAX_NUM_CCs
][
10
];
#ifdef XFORMS
static
pthread_t
thread2
;
//xforms
static
pthread_t
forms_thread
;
//xforms
#endif
#ifdef EMOS
static
pthread_t
thread3
;
//emos
...
...
@@ -841,6 +848,7 @@ static void * eNB_thread_tx(void *param) {
if
(
pthread_mutex_lock
(
&
proc
->
mutex_tx
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][eNB] error locking mutex for eNB TX proc %d
\n
"
,
proc
->
subframe
);
oai_exit
=
1
;
}
else
{
...
...
@@ -853,6 +861,7 @@ static void * eNB_thread_tx(void *param) {
// LOG_I(PHY,"Waking up and unlocking mutex for eNB proc %d\n",proc->subframe);
if
(
pthread_mutex_unlock
(
&
proc
->
mutex_tx
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][eNB] error unlocking mutex for eNB TX proc %d
\n
"
,
proc
->
subframe
);
oai_exit
=
1
;
}
}
vcd_signal_dumper_dump_function_by_name
(
VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0
+
(
2
*
proc
->
subframe
),
1
);
...
...
@@ -1028,6 +1037,7 @@ static void * eNB_thread_rx(void *param) {
void
init_eNB_proc
(
void
)
{
int
i
;
...
...
@@ -1475,6 +1485,301 @@ static void *eNB_thread(void *arg)
return
0
;
}
int
is_synchronized
=
0
;
static
void
*
UE_thread_synch
(
void
*
arg
)
{
int
i
,
hw_slot_offset
;
PHY_VARS_UE
*
UE
=
arg
;
#ifdef USRP
printf
(
"waiting for USRP sync
\n
"
);
#ifdef RTAI
rt_sem_wait
(
sync_sem
);
#else
//pthread_mutex_lock(&sync_mutex);
pthread_cond_wait
(
&
sync_cond
,
&
sync_mutex
);
//pthread_mutex_unlock(&sync_mutex);
#endif
// printf("starting eNB thread @ %llu\n",get_usrp_time(&openair0));
#endif
while
(
!
oai_exit
)
{
if
(
pthread_mutex_lock
(
&
UE
->
mutex_synch
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][eNB] error locking mutex for UE initial synch thread
\n
"
);
oai_exit
=
1
;
}
else
{
while
(
UE
->
instance_cnt_synch
<
0
)
{
pthread_cond_wait
(
&
UE
->
cond_synch
,
&
UE
->
mutex_synch
);
}
if
(
pthread_mutex_unlock
(
&
UE
->
mutex_synch
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][eNB] error unlocking mutex for UE Initial Synch thread
\n
"
);
oai_exit
=
1
;
}
if
(
initial_sync
(
PHY_vars_UE_g
[
0
][
0
],
mode
)
==
0
)
{
/*
lte_adjust_synch(&PHY_vars_UE_g[0]->lte_frame_parms,
PHY_vars_UE_g[0],
0,
1,
16384);
*/
//for better visualization afterwards
/*
for (aa=0; aa<PHY_vars_UE_g[0]->lte_frame_parms.nb_antennas_rx; aa++)
memset(PHY_vars_UE_g[0]->lte_ue_common_vars.rxdata[aa],0,
PHY_vars_UE_g[0]->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int));
*/
if
(
mode
==
rx_calib_ue
)
{
exit_fun
(
"[HW][UE] UE in RX calibration mode"
);
}
else
{
is_synchronized
=
1
;
oai_exit
=
1
;
//start the DMA transfers
//LOG_D(HW,"Before openair0_start_rt_acquisition \n");
//openair0_start_rt_acquisition(0);
hw_slot_offset
=
(
PHY_vars_UE_g
[
0
][
0
]
->
rx_offset
<<
1
)
/
PHY_vars_UE_g
[
0
][
0
]
->
lte_frame_parms
.
samples_per_tti
;
LOG_D
(
HW
,
"Got synch: hw_slot_offset %d
\n
"
,
hw_slot_offset
);
}
}
else
{
if
(
openair_daq_vars
.
freq_offset
>=
0
)
{
openair_daq_vars
.
freq_offset
+=
100
;
openair_daq_vars
.
freq_offset
*=
-
1
;
}
else
{
openair_daq_vars
.
freq_offset
*=
-
1
;
}
if
(
abs
(
openair_daq_vars
.
freq_offset
)
>
7500
)
{
LOG_I
(
PHY
,
"[initial_sync] No cell synchronization found, abondoning
\n
"
);
mac_xface
->
macphy_exit
(
"No cell synchronization found, abondoning"
);
}
else
{
LOG_I
(
PHY
,
"[initial_sync] trying carrier off %d Hz
\n
"
,
openair_daq_vars
.
freq_offset
);
for
(
card
=
0
;
card
<
MAX_CARDS
;
card
++
)
{
for
(
i
=
0
;
i
<
openair0_cfg
[
card
].
rx_num_channels
;
i
++
)
{
openair0_cfg
[
card
].
rx_freq
[
i
]
=
carrier_freq
[
card
][
i
]
+
openair_daq_vars
.
freq_offset
;
openair0_cfg
[
card
].
tx_freq
[
i
]
=
carrier_freq
[
card
][
i
]
+
openair_daq_vars
.
freq_offset
;
}
}
// openair0_dump_config(&openair0_cfg[0],UE_flag);
// rt_sleep_ns(FRAME_PERIOD);
}
// freq_offset
}
// initial_sync=0
}
// mutex_lock
}
// while !oai_exit
return
(
0
);
}
static
void
*
UE_thread_tx
(
void
*
arg
)
{
PHY_VARS_UE
*
UE
=
(
PHY_VARS_UE
*
)
arg
;
#ifndef OPENAIR2
UE
->
UE_mode
[
eNB_id
]
=
PUSCH
;
UE
->
prach_resources
[
eNB_id
]
=
&
prach_resources_local
;
prach_resources_local
.
ra_RNTI
=
0xbeef
;
prach_resources_local
.
ra_PreambleIndex
=
0
;
#endif
UE
->
instance_cnt_tx
=-
1
;
mlockall
(
MCL_CURRENT
|
MCL_FUTURE
);
while
(
!
oai_exit
)
{
if
(
pthread_mutex_lock
(
&
UE
->
mutex_tx
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][eNB] error locking mutex for UE TX
\n
"
);
oai_exit
=
1
;
}
else
{
while
(
UE
->
instance_cnt_tx
<
0
)
{
pthread_cond_wait
(
&
UE
->
cond_tx
,
&
UE
->
mutex_tx
);
}
if
(
pthread_mutex_unlock
(
&
UE
->
mutex_tx
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][eNB] error unlocking mutex for UE TX
\n
"
);
oai_exit
=
1
;
}
}
if
((
subframe_select
(
&
UE
->
lte_frame_parms
,
UE
->
slot_tx
>>
1
)
==
SF_UL
)
||
(
UE
->
lte_frame_parms
.
frame_type
==
FDD
)){
phy_procedures_UE_TX
(
UE
,
eNB_id
,
0
,
mode
,
no_relay
);
}
if
((
subframe_select
(
&
UE
->
lte_frame_parms
,
UE
->
slot_tx
>>
1
)
==
SF_S
)
&&
((
UE
->
slot_tx
&
1
)
==
1
))
{
phy_procedures_UE_S_TX
(
UE
,
eNB_id
,
0
,
no_relay
);
}
if
(
pthread_mutex_lock
(
&
UE
->
mutex_tx
)
!=
0
)
{
printf
(
"[openair][SCHED][eNB] error locking mutex for UE TX thread
\n
"
);
}
else
{
UE
->
instance_cnt_tx
--
;
if
(
pthread_mutex_unlock
(
&
UE
->
mutex_tx
)
!=
0
)
{
printf
(
"[openair][SCHED][eNB] error unlocking mutex for UE
\n
"
);
}
}
UE
->
slot_tx
++
;
if
(
UE
->
slot_tx
==
20
)
{
UE
->
slot_tx
=
0
;
UE
->
frame_tx
++
;
}
}
return
(
0
);
}
static
void
*
UE_thread_rx
(
void
*
arg
)
{
PHY_VARS_UE
*
UE
=
(
PHY_VARS_UE
*
)
arg
;
UE
->
instance_cnt_rx
=-
1
;
mlockall
(
MCL_CURRENT
|
MCL_FUTURE
);
while
(
!
oai_exit
)
{
if
(
pthread_mutex_lock
(
&
UE
->
mutex_rx
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][eNB] error locking mutex for UE RX
\n
"
);
oai_exit
=
1
;
}
else
{
while
(
UE
->
instance_cnt_rx
<
0
)
{
pthread_cond_wait
(
&
UE
->
cond_rx
,
&
UE
->
mutex_rx
);
}
if
(
pthread_mutex_unlock
(
&
UE
->
mutex_rx
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][eNB] error unlocking mutex for UE RX
\n
"
);
oai_exit
=
1
;
}
if
((
subframe_select
(
&
UE
->
lte_frame_parms
,
UE
->
slot_rx
>>
1
)
==
SF_DL
)
||
(
UE
->
lte_frame_parms
.
frame_type
==
FDD
)){
phy_procedures_UE_RX
(
UE
,
eNB_id
,
0
,
mode
,
no_relay
,
NULL
);
}
if
((
subframe_select
(
&
UE
->
lte_frame_parms
,
UE
->
slot_rx
>>
1
)
==
SF_S
)
&&
((
UE
->
slot_rx
&
1
)
==
0
))
{
phy_procedures_UE_RX
(
UE
,
eNB_id
,
0
,
mode
,
no_relay
,
NULL
);
}
UE
->
slot_rx
++
;
if
(
UE
->
slot_rx
==
20
)
{
UE
->
slot_rx
=
0
;
UE
->
frame_rx
++
;
}
}
}
return
(
0
);
}
static
void
*
UE_thread_new
(
void
*
arg
)
{
int
slot
=
0
,
frame
=
0
,
hw_slot
,
last_slot
,
next_slot
,
hw_subframe
;
// unsigned int aa;
static
int
is_synchronized
=
0
;
#ifndef USRP
// volatile unsigned int *DAQ_MBOX = openair0_daq_cnt();
//exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;;
#endif
#ifdef USRP
printf
(
"waiting for USRP sync
\n
"
);
#ifdef RTAI
rt_sem_wait
(
sync_sem
);
#else
//pthread_mutex_lock(&sync_mutex);
pthread_cond_wait
(
&
sync_cond
,
&
sync_mutex
);
//pthread_mutex_unlock(&sync_mutex);
#endif
// printf("starting eNB thread @ %llu\n",get_usrp_time(&openair0));
#endif
while
(
!
oai_exit
)
{
#ifdef USRP
vcd_signal_dumper_dump_variable_by_name
(
VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME
,
hw_subframe
);
vcd_signal_dumper_dump_variable_by_name
(
VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME
,
frame
);
while
(
rx_cnt
<
sf_bounds
[
hw_subframe
])
{
openair0_timestamp
time0
,
time1
;
unsigned
int
rxs
;
vcd_signal_dumper_dump_function_by_name
(
VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ
,
1
);
rxs
=
openair0
.
trx_read_func
(
&
openair0
,
&
timestamp
,
&
rxdata
[
rx_cnt
*
samples_per_packets
],
samples_per_packets
);
if
(
rxs
!=
samples_per_packets
)
oai_exit
=
1
;
vcd_signal_dumper_dump_function_by_name
(
VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ
,
0
);
// Transmit TX buffer based on timestamp from RX
if
(
is_synchronized
)
{
vcd_signal_dumper_dump_function_by_name
(
VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE
,
1
);
openair0
.
trx_write_func
(
&
openair0
,
(
timestamp
+
samples_per_packets
*
tx_delay
-
tx_forward_nsamps
),
&
txdata
[
tx_cnt
*
samples_per_packets
],
samples_per_packets
,
1
);
vcd_signal_dumper_dump_function_by_name
(
VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE
,
0
);
}
rx_cnt
++
;
tx_cnt
++
;
if
(
tx_cnt
==
max_cnt
)
tx_cnt
=
0
;
}
if
(
rx_cnt
==
max_cnt
)
rx_cnt
=
0
;
#endif
if
(
is_synchronized
)
{
// phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[0][0], 0, 0,mode,0,NULL);
}
else
{
// we are not yet synchronized
if
(
slot
==
18
)
{
// Wake up initial synch thread
}
}
/*
if ((slot%2000)<10)
LOG_D(HW,"fun0: doing very hard work\n");
*/
hw_subframe
++
;
slot
+=
2
;
if
(
hw_subframe
==
10
)
{
hw_subframe
=
0
;
frame
++
;
slot
=
1
;
}
#if defined(ENABLE_ITTI)
itti_update_lte_time
(
frame
,
slot
);
#endif
}
}
#ifndef USRP
...
...
@@ -1484,7 +1789,7 @@ static void *UE_thread(void *arg) {
RT_TASK
*
task
;
#endif
// RTIME in, out, diff;
int
slot
=
0
,
frame
=
0
,
hw_slot
,
last_slot
,
next_slot
;
int
slot
=
0
,
frame
=
0
,
hw_slot
,
last_slot
,
next_slot
;
// unsigned int aa;
static
int
is_synchronized
=
0
;
int
delay_cnt
;
...
...
@@ -1526,9 +1831,13 @@ static void *UE_thread(void *arg) {
}
*/
while
(
!
oai_exit
)
{
hw_slot
=
(((((
volatile
unsigned
int
*
)
DAQ_MBOX
)[
0
]
+
1
)
%
150
)
<<
1
)
/
15
;
//the slot the hw is about to store
if
(
is_synchronized
)
{
//this is the mbox counter that indicates the start of the frame
rx_offset_mbox
=
(
PHY_vars_UE_g
[
0
][
0
]
->
rx_offset
*
150
)
/
(
10
*
PHY_vars_UE_g
[
0
][
0
]
->
lte_frame_parms
.
samples_per_tti
);
//this is the mbox counter where we should be
...
...
@@ -1606,7 +1915,7 @@ static void *UE_thread(void *arg) {
next_slot
=
(
slot
+
3
)
%
LTE_SLOTS_PER_FRAME
;
if
(
is_synchronized
)
{
phy_procedures_UE_lte
(
last_slot
,
next_slot
,
PHY_vars_UE_g
[
0
][
0
],
0
,
0
,
mode
,
0
,
NULL
);
//
phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[0][0], 0, 0,mode,0,NULL);
}
else
{
// we are not yet synchronized
...
...
@@ -1705,6 +2014,51 @@ static void *UE_thread(void *arg) {
#endif
void
init_UE_threads
(
void
)
{
PHY_VARS_UE
*
UE
=
PHY_vars_UE_g
[
0
][
0
];
pthread_attr_init
(
&
attr_UE_thread_tx
);
pthread_attr_setstacksize
(
&
attr_UE_thread_tx
,
OPENAIR_THREAD_STACK_SIZE
);
sched_param_UE_thread_tx
.
sched_priority
=
sched_get_priority_max
(
SCHED_FIFO
)
-
1
;
pthread_attr_setschedparam
(
&
attr_UE_thread_tx
,
&
sched_param_UE_thread_tx
);
pthread_attr_setschedpolicy
(
&
attr_UE_thread_tx
,
SCHED_FIFO
);
pthread_attr_init
(
&
attr_UE_thread_rx
);
pthread_attr_setstacksize
(
&
attr_UE_thread_rx
,
OPENAIR_THREAD_STACK_SIZE
);
sched_param_UE_thread_rx
.
sched_priority
=
sched_get_priority_max
(
SCHED_FIFO
)
-
1
;
pthread_attr_setschedparam
(
&
attr_UE_thread_rx
,
&
sched_param_UE_thread_rx
);
pthread_attr_setschedpolicy
(
&
attr_UE_thread_rx
,
SCHED_FIFO
);
UE
->
instance_cnt_tx
=-
1
;
UE
->
instance_cnt_rx
=-
1
;
UE
->
instance_cnt_synch
=-
1
;
pthread_mutex_init
(
&
UE
->
mutex_tx
,
NULL
);
pthread_mutex_init
(
&
UE
->
mutex_rx
,
NULL
);
pthread_mutex_init
(
&
UE
->
mutex_synch
,
NULL
);
pthread_cond_init
(
&
UE
->
cond_tx
,
NULL
);
pthread_cond_init
(
&
UE
->
cond_rx
,
NULL
);
pthread_cond_init
(
&
UE
->
cond_synch
,
NULL
);
pthread_create
(
&
UE
->
thread_tx
,
NULL
,
UE_thread_tx
,(
void
*
)
UE
);
pthread_create
(
&
UE
->
thread_rx
,
NULL
,
UE_thread_rx
,(
void
*
)
UE
);
pthread_create
(
&
UE
->
thread_rx
,
NULL
,
UE_thread_synch
,(
void
*
)
UE
);
UE
->
frame_tx
=
0
;
#ifdef USRP
UE
->
slot_tx
=
2
;
UE
->
slot_rx
=
0
;
UE
->
frame_rx
=
0
;
#else
UE
->
slot_tx
=
1
;
UE
->
slot_rx
=
19
;
UE
->
frame_rx
=
0
;
#endif
}
static
void
get_options
(
int
argc
,
char
**
argv
)
{
int
c
;
// char line[1000];
...
...
@@ -2505,7 +2859,7 @@ int main(int argc, char **argv) {
}
}
ret
=
pthread_create
(
&
thread2
,
NULL
,
scope_thread
,
NULL
);
ret
=
pthread_create
(
&
forms_thread
,
NULL
,
scope_thread
,
NULL
);
printf
(
"Scope thread created, ret=%d
\n
"
,
ret
);
}
#endif
...
...
@@ -2520,19 +2874,25 @@ int main(int argc, char **argv) {
#ifndef RTAI
pthread_attr_init
(
&
attr_dlsch_threads
);
pthread_attr_setstacksize
(
&
attr_dlsch_threads
,
OPENAIR_THREAD_STACK_SIZE
);
//attr_dlsch_threads.priority = 1;
sched_param_dlsch
.
sched_priority
=
90
;
//sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY;
pthread_attr_setschedparam
(
&
attr_dlsch_threads
,
&
sched_param_dlsch
);
pthread_attr_setschedpolicy
(
&
attr_dlsch_threads
,
SCHED_FIFO
);
pthread_attr_init
(
&
attr_UE_init_synch
);
pthread_attr_setstacksize
(
&
attr_UE_init_synch
,
OPENAIR_THREAD_STACK_SIZE
);
sched_param_UE_init_synch
.
sched_priority
=
90
;
//sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY;
pthread_attr_setschedparam
(
&
attr_UE_init_synch
,
&
sched_param_UE_init_synch
);
pthread_attr_setschedpolicy
(
&
attr_UE_init_synch
,
SCHED_FIFO
);
#endif
// start the main thread
if
(
UE_flag
==
1
)
{
#ifndef USRP
#ifdef RTAI
thread1
=
rt_thread_create
(
UE_thread
,
NULL
,
100000000
);
main_ue_thread
=
rt_thread_create
(
UE_thread_new
,
NULL
,
100000000
);
#else
error_code
=
pthread_create
(
&
thread1
,
&
attr_dlsch_threads
,
UE_thread
,
NULL
);
error_code
=
pthread_create
(
&
main_ue_thread
,
&
attr_dlsch_threads
,
UE_thread_new
,
NULL
);
if
(
error_code
!=
0
)
{
LOG_D
(
HW
,
"[lte-softmodem.c] Could not allocate UE_thread, error %d
\n
"
,
error_code
);
return
(
error_code
);
...
...
@@ -2559,9 +2919,9 @@ int main(int argc, char **argv) {
}
printf
(
"Creating eNB_thread
\n
"
);
#ifdef RTAI
thread0
=
rt_thread_create
(
eNB_thread
,
NULL
,
OPENAIR_THREAD_STACK_SIZE
);
main_eNB_thread
=
rt_thread_create
(
eNB_thread
,
NULL
,
OPENAIR_THREAD_STACK_SIZE
);
#else
error_code
=
pthread_create
(
&
thread0
,
&
attr_dlsch_threads
,
eNB_thread
,
NULL
);
error_code
=
pthread_create
(
&
main_eNB_thread
,
&
attr_dlsch_threads
,
eNB_thread
,
NULL
);
if
(
error_code
!=
0
)
{
LOG_D
(
HW
,
"[lte-softmodem.c] Could not allocate eNB_thread, error %d
\n
"
,
error_code
);
return
(
error_code
);
...
...
@@ -2603,7 +2963,7 @@ int main(int argc, char **argv) {
printf
(
"waiting for XFORMS thread
\n
"
);
if
(
do_forms
==
1
)
{
pthread_join
(
thread2
,
&
status
);
pthread_join
(
forms_thread
,
&
status
);
fl_hide_form
(
form_stats
->
stats_form
);
fl_free_form
(
form_stats
->
stats_form
);
if
(
UE_flag
==
1
)
{
...
...
@@ -2623,9 +2983,9 @@ int main(int argc, char **argv) {
if
(
UE_flag
==
1
)
{
#ifndef USRP
#ifdef RTAI
rt_thread_join
(
thread1
);
rt_thread_join
(
main_ue_thread
);
#else
pthread_join
(
thread1
,
&
status
);
pthread_join
(
main_ue_thread
,
&
status
);
#endif
#ifdef DLSCH_THREAD
cleanup_dlsch_threads
();
...
...
@@ -2635,12 +2995,12 @@ int main(int argc, char **argv) {
}
else
{
#ifdef RTAI
rt_thread_join
(
thread0
);
rt_thread_join
(
main_eNB_thread
);
#else
#ifdef DEBUG_THREADS
printf
(
"Joining eNB_thread ..."
);
#endif
pthread_join
(
thread0
,(
void
**
)
&
eNB_thread_status_p
);
pthread_join
(
main_eNB_thread
,(
void
**
)
&
eNB_thread_status_p
);
#ifdef DEBUG_THREADS
printf
(
"status %d
\n
"
,
*
eNB_thread_status_p
);
#endif
...
...
targets/RT/USER/sched_dlsch.c
View file @
e4526a8f
...
...
@@ -157,11 +157,11 @@ static void * dlsch_thread(void *param) {
vcd_signal_dumper_dump_function_by_name
(
VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_THREAD0
+
dlsch_thread_index
,
1
);
if
(
oai_exit
)
break
;
LOG_I
(
PHY
,
"[SCHED][DLSCH] Frame %d: Calling dlsch_decoding with dlsch_thread_index = %d
\n
"
,
phy_vars_ue
->
frame
,
dlsch_thread_index
);
LOG_I
(
PHY
,
"[SCHED][DLSCH] Frame %d: Calling dlsch_decoding with dlsch_thread_index = %d
\n
"
,
phy_vars_ue
->
frame
_rx
,
dlsch_thread_index
);
time_in
=
rt_get_time_ns
();
if
(
phy_vars_ue
->
frame
<
phy_vars_ue
->
dlsch_errors
[
eNB_id
])
{
if
(
phy_vars_ue
->
frame
_rx
<
phy_vars_ue
->
dlsch_errors
[
eNB_id
])
{
phy_vars_ue
->
dlsch_errors
[
eNB_id
]
=
0
;
phy_vars_ue
->
dlsch_received
[
eNB_id
]
=
0
;
}
...
...
@@ -197,7 +197,7 @@ static void * dlsch_thread(void *param) {
LOG_D
(
PHY
,
"[UE %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)
\n
"
,
phy_vars_ue
->
Mod_id
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
rnti
,
harq_pid
,
phy_vars_ue
->
frame
,
dlsch_subframe
[
dlsch_thread_index
],
ret
,
phy_vars_ue
->
frame
_rx
,
dlsch_subframe
[
dlsch_thread_index
],
ret
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
mcs
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
rvidx
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
TBS
);
...
...
@@ -209,7 +209,7 @@ static void * dlsch_thread(void *param) {
#ifdef DEBUG_PHY
LOG_I
(
PHY
,
"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d)
\n
"
,
phy_vars_ue
->
Mod_id
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
rnti
,
harq_pid
,
phy_vars_ue
->
frame
,
dlsch_subframe
[
dlsch_thread_index
],
harq_pid
,
phy_vars_ue
->
frame
_rx
,
dlsch_subframe
[
dlsch_thread_index
],
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
rvidx
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
mcs
);
#endif
...
...
@@ -217,14 +217,14 @@ static void * dlsch_thread(void *param) {
else
{
LOG_I
(
PHY
,
"[UE %d][PDSCH %x/%d] Frame %d subframe %d: Received DLSCH (rv %d,mcs %d)
\n
"
,
phy_vars_ue
->
Mod_id
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
rnti
,
harq_pid
,
phy_vars_ue
->
frame
,
dlsch_subframe
[
dlsch_thread_index
],
harq_pid
,
phy_vars_ue
->
frame
_rx
,
dlsch_subframe
[
dlsch_thread_index
],
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
rvidx
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
mcs
);
#ifdef OPENAIR2
mac_xface
->
ue_send_sdu
(
phy_vars_ue
->
Mod_id
,
0
,
// CC_id
phy_vars_ue
->
frame
,
phy_vars_ue
->
frame
_rx
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
b
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
TBS
>>
3
,
eNB_id
);
...
...
@@ -250,14 +250,14 @@ static void * dlsch_thread(void *param) {
LOG_I
(
PHY
,
"[UE %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)
\n
"
,
phy_vars_ue
->
Mod_id
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
rnti
,
harq_pid
,
phy_vars_ue
->
frame
,
dlsch_subframe
[
dlsch_thread_index
],
ret
,
phy_vars_ue
->
frame
_rx
,
dlsch_subframe
[
dlsch_thread_index
],
ret
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
mcs
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
rvidx
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
TBS
);
if
(
phy_vars_ue
->
frame
%
100
==
0
)
{
if
(
phy_vars_ue
->
frame
_rx
%
100
==
0
)
{
LOG_D
(
PHY
,
"[UE %d][PDSCH %x] Frame %d subframe %d dlsch_errors %d, dlsch_received %d, dlsch_fer %d, current_dlsch_cqi %d
\n
"
,
phy_vars_ue
->
Mod_id
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
rnti
,
phy_vars_ue
->
frame
,
dlsch_subframe
[
dlsch_thread_index
],
phy_vars_ue
->
frame
_rx
,
dlsch_subframe
[
dlsch_thread_index
],
phy_vars_ue
->
dlsch_errors
[
eNB_id
],
phy_vars_ue
->
dlsch_received
[
eNB_id
],
phy_vars_ue
->
dlsch_fer
[
eNB_id
],
...
...
targets/RT/USER/sched_rx_pdsch.c
View file @
e4526a8f
...
...
@@ -93,7 +93,7 @@ static void * rx_pdsch_thread(void *param) {
uint8_t
rx_pdsch_thread_index
=
0
;
uint8_t
dlsch_thread_index
=
0
;
uint8_t
pilot1
,
pilot2
,
pilot3
,
harq_pid
,
subframe
;
uint8_t
last_slot
;
//
uint8_t last_slot;
uint8_t
dual_stream_UE
=
0
;
uint8_t
i_mod
=
0
;
...
...
@@ -105,7 +105,7 @@ static void * rx_pdsch_thread(void *param) {
int
m
,
eNB_id
=
0
;
int
eNB_id_i
=
1
;
PHY_VARS_UE
*
phy_vars_ue
=
PHY_vars_UE_g
[
0
];
PHY_VARS_UE
*
UE
=
PHY_vars_UE_g
[
0
];
#ifdef RTAI
task
=
rt_task_init_schmod
(
nam2num
(
"RX_PDSCH_THREAD"
),
0
,
0
,
0
,
SCHED_FIFO
,
0xF
);
...
...
@@ -128,7 +128,7 @@ static void * rx_pdsch_thread(void *param) {
rt_make_hard_real_time
();
#endif
if
(
phy_vars_ue
->
lte_frame_parms
.
Ncp
==
0
)
{
// normal prefix
if
(
UE
->
lte_frame_parms
.
Ncp
==
0
)
{
// normal prefix
pilot1
=
4
;
pilot2
=
7
;
pilot3
=
11
;
...
...
@@ -157,27 +157,27 @@ static void * rx_pdsch_thread(void *param) {
vcd_signal_dumper_dump_function_by_name
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_THREAD
,
1
);
last_slot
=
rx_pdsch_slot
;
subframe
=
last_slot
>>
1
;
//
last_slot = rx_pdsch_slot;
subframe
=
UE
->
slot_rx
>>
1
;
// Important! assumption that PDCCH procedure of next SF is not called yet
harq_pid
=
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
current_harq_pid
;
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
G
=
get_G
(
&
phy_vars_ue
->
lte_frame_parms
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
nb_rb
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
rb_alloc
,
get_Qm
(
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
mcs
),
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
Nl
,
phy_vars_ue
->
lte_ue_pdcch_vars
[
eNB_id
]
->
num_pdcch_symbols
,
phy_vars_ue
->
frame
,
subframe
);
if
((
phy_vars_ue
->
transmission_mode
[
eNB_id
]
==
5
)
&&
(
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
dl_power_off
==
0
)
&&
harq_pid
=
UE
->
dlsch_ue
[
eNB_id
][
0
]
->
current_harq_pid
;
UE
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
G
=
get_G
(
&
UE
->
lte_frame_parms
,
UE
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
nb_rb
,
UE
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
rb_alloc
,
get_Qm
(
UE
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
mcs
),
UE
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
Nl
,
UE
->
lte_ue_pdcch_vars
[
eNB_id
]
->
num_pdcch_symbols
,
UE
->
frame_rx
,
subframe
);
if
((
UE
->
transmission_mode
[
eNB_id
]
==
5
)
&&
(
UE
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
dl_power_off
==
0
)
&&
(
openair_daq_vars
.
use_ia_receiver
>
0
))
{
dual_stream_UE
=
1
;
eNB_id_i
=
phy_vars_ue
->
n_connected_eNB
;
eNB_id_i
=
UE
->
n_connected_eNB
;
if
(
openair_daq_vars
.
use_ia_receiver
==
2
)
{
i_mod
=
get_Qm
(((
phy_vars_ue
->
frame
%
1024
)
/
3
)
%
28
);
i_mod
=
get_Qm
(((
UE
->
frame_rx
%
1024
)
/
3
)
%
28
);
}
else
{
i_mod
=
get_Qm
(
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
mcs
);
i_mod
=
get_Qm
(
UE
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
mcs
);
}
}
else
{
...
...
@@ -188,19 +188,19 @@ static void * rx_pdsch_thread(void *param) {
if
(
oai_exit
)
break
;
LOG_D
(
PHY
,
"[SCHED][RX_PDSCH] Frame %d, slot %d: Calling rx_pdsch_decoding with harq_pid %d
\n
"
,
phy_vars_ue
->
frame
,
last_slot
,
harq_pid
);
LOG_D
(
PHY
,
"[SCHED][RX_PDSCH] Frame %d, slot %d: Calling rx_pdsch_decoding with harq_pid %d
\n
"
,
UE
->
frame_rx
,
UE
->
slot_rx
,
harq_pid
);
time_in
=
rt_get_time_ns
();
// Check if we are in even or odd slot
if
(
last_slot
%
2
)
{
// odd slots
if
(
UE
->
slot_rx
%
2
)
{
// odd slots
// measure time
//time0 = rt_get_time_ns();
// rt_printk("[SCHED][RX_PDSCH][before rx_pdsch] Frame %d, slot %d, time %llu\n",
phy_vars_ue
->frame,last_slot,rt_get_time_ns());
for
(
m
=
pilot2
;
m
<
phy_vars_ue
->
lte_frame_parms
.
symbols_per_tti
;
m
++
)
{
// rt_printk("[SCHED][RX_PDSCH][before rx_pdsch] Frame %d, slot %d, time %llu\n",
UE
->frame,last_slot,rt_get_time_ns());
for
(
m
=
pilot2
;
m
<
UE
->
lte_frame_parms
.
symbols_per_tti
;
m
++
)
{
rx_pdsch
(
phy_vars_ue
,
rx_pdsch
(
UE
,
PDSCH
,
eNB_id
,
eNB_id_i
,
...
...
@@ -213,12 +213,12 @@ static void * rx_pdsch_thread(void *param) {
}
// time1 = rt_get_time_ns();
// rt_printk("[SCHED][RX_PDSCH] Frame %d, slot %d, start %llu, end %llu, proc time: %llu ns\n",
phy_vars_ue->frame
,last_slot,time0,time1,(time1-time0));
// rt_printk("[SCHED][RX_PDSCH] Frame %d, slot %d, start %llu, end %llu, proc time: %llu ns\n",
UE->frame_rx
,last_slot,time0,time1,(time1-time0));
dlsch_thread_index
=
harq_pid
;
if
(
pthread_mutex_lock
(
&
dlsch_mutex
[
dlsch_thread_index
])
!=
0
)
{
// Signal MAC_PHY Scheduler
LOG_E
(
PHY
,
"[UE %d] ERROR pthread_mutex_lock
\n
"
,
phy_vars_ue
->
Mod_id
);
// lock before accessing shared resource
LOG_E
(
PHY
,
"[UE %d] ERROR pthread_mutex_lock
\n
"
,
UE
->
Mod_id
);
// lock before accessing shared resource
// vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
//return(-1);
}
...
...
@@ -228,28 +228,28 @@ static void * rx_pdsch_thread(void *param) {
if
(
dlsch_instance_cnt
[
dlsch_thread_index
]
==
0
)
{
if
(
pthread_cond_signal
(
&
dlsch_cond
[
dlsch_thread_index
])
!=
0
)
{
LOG_E
(
PHY
,
"[UE %d] ERROR pthread_cond_signal for dlsch_cond[%d]
\n
"
,
phy_vars_ue
->
Mod_id
,
dlsch_thread_index
);
LOG_E
(
PHY
,
"[UE %d] ERROR pthread_cond_signal for dlsch_cond[%d]
\n
"
,
UE
->
Mod_id
,
dlsch_thread_index
);
// vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
//return(-1);
}
}
else
{
LOG_W
(
PHY
,
"[UE %d] DLSCH thread for dlsch_thread_index %d busy!!!
\n
"
,
phy_vars_ue
->
Mod_id
,
dlsch_thread_index
);
LOG_W
(
PHY
,
"[UE %d] DLSCH thread for dlsch_thread_index %d busy!!!
\n
"
,
UE
->
Mod_id
,
dlsch_thread_index
);
// vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
//return(-1);
}
}
else
{
// even slots
for
(
m
=
phy_vars_ue
->
lte_ue_pdcch_vars
[
eNB_id
]
->
num_pdcch_symbols
;
m
<
pilot2
;
m
++
)
{
for
(
m
=
UE
->
lte_ue_pdcch_vars
[
eNB_id
]
->
num_pdcch_symbols
;
m
<
pilot2
;
m
++
)
{
rx_pdsch
(
phy_vars_ue
,
rx_pdsch
(
UE
,
PDSCH
,
eNB_id
,
eNB_id_i
,
subframe
,
m
,
(
m
==
phy_vars_ue
->
lte_ue_pdcch_vars
[
eNB_id
]
->
num_pdcch_symbols
)
?
1
:
0
,
// first_symbol_flag
(
m
==
UE
->
lte_ue_pdcch_vars
[
eNB_id
]
->
num_pdcch_symbols
)
?
1
:
0
,
// first_symbol_flag
dual_stream_UE
,
i_mod
,
harq_pid
);
...
...
targets/SIMU/USER/oaisim.c
View file @
e4526a8f
...
...
@@ -771,8 +771,13 @@ void *l2l1_task(void *args_p) {
if
(
PHY_vars_UE_g
[
UE_inst
][
0
]
->
UE_mode
[
0
]
!=
NOT_SYNCHED
)
{
if
(
frame
>
0
)
{
PHY_vars_UE_g
[
UE_inst
][
0
]
->
frame
=
frame
;
PHY_vars_UE_g
[
UE_inst
][
0
]
->
frame_rx
=
frame
;
PHY_vars_UE_g
[
UE_inst
][
0
]
->
slot_rx
=
last_slot
;
PHY_vars_UE_g
[
UE_inst
][
0
]
->
slot_tx
=
next_slot
;
if
(
next_slot
>
1
)
PHY_vars_UE_g
[
UE_inst
][
0
]
->
frame_tx
=
frame
;
else
PHY_vars_UE_g
[
UE_inst
][
0
]
->
frame_tx
=
frame
+
1
;
#ifdef OPENAIR2
//Application
update_otg_UE
(
UE_inst
,
oai_emulation
.
info
.
time_ms
);
...
...
@@ -781,7 +786,7 @@ void *l2l1_task(void *args_p) {
pdcp_run
(
frame
,
0
,
UE_inst
,
0
);
#endif
for
(
CC_id
=
0
;
CC_id
<
MAX_NUM_CCs
;
CC_id
++
)
{
phy_procedures_UE_lte
(
last_slot
,
next_slot
,
PHY_vars_UE_g
[
UE_inst
][
CC_id
],
0
,
abstraction_flag
,
normal_txrx
,
phy_procedures_UE_lte
(
PHY_vars_UE_g
[
UE_inst
][
CC_id
],
0
,
abstraction_flag
,
normal_txrx
,
no_relay
,
NULL
);
}
ue_data
[
UE_inst
]
->
tx_power_dBm
=
PHY_vars_UE_g
[
UE_inst
][
0
]
->
tx_power_dBm
;
...
...
@@ -852,8 +857,12 @@ void *l2l1_task(void *args_p) {
if
(
PHY_vars_UE_g
[
UE_inst
][
0
]
->
UE_mode
[
0
]
!=
NOT_SYNCHED
)
{
LOG_D
(
EMU
,
"[RN %d] PHY procedures UE %d for frame %d, slot %d (subframe TX %d, RX %d)
\n
"
,
RN_id
,
UE_inst
,
frame
,
slot
,
next_slot
>>
1
,
last_slot
>>
1
);
PHY_vars_UE_g
[
UE_inst
][
0
]
->
frame
=
frame
;
phy_procedures_UE_lte
(
last_slot
,
next_slot
,
PHY_vars_UE_g
[
UE_inst
][
0
],
0
,
abstraction_flag
,
normal_txrx
,
PHY_vars_UE_g
[
UE_inst
][
0
]
->
frame_rx
=
frame
;
PHY_vars_UE_g
[
UE_inst
][
0
]
->
slot_rx
=
last_slot
;
PHY_vars_UE_g
[
UE_inst
][
0
]
->
slot_tx
=
next_slot
;
if
(
next_slot
>
1
)
PHY_vars_UE_g
[
UE_inst
][
0
]
->
frame_tx
=
frame
;
else
PHY_vars_UE_g
[
UE_inst
][
0
]
->
frame_tx
=
frame
+
1
;
phy_procedures_UE_lte
(
PHY_vars_UE_g
[
UE_inst
][
0
],
0
,
abstraction_flag
,
normal_txrx
,
r_type
,
PHY_vars_RN_g
[
RN_id
]);
}
else
if
(
last_slot
==
(
LTE_SLOTS_PER_FRAME
-
2
))
{
...
...
@@ -873,7 +882,7 @@ void *l2l1_task(void *args_p) {
}
#endif
emu_transport
(
frame
,
last_slot
,
next_slot
,
direction
,
oai_emulation
.
info
.
frame_type
[
0
],
ethernet_flag
);
if
((
direction
==
SF_DL
)
||
(
frame_parms
[
0
]
->
frame_type
==
0
))
{
if
((
direction
==
SF_DL
)
||
(
frame_parms
[
0
]
->
frame_type
==
FDD
))
{
// consider only sec id 0
/* for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) {
if (abstraction_flag == 0) {
...
...
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