Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
oai
openairinterface5G
Commits
e2c32228
Commit
e2c32228
authored
May 09, 2016
by
knopp
Browse files
removal of EXPRESSMIMO #ifdef's in lte-ue. move UE-specific code from lte-softmodem.c to lte-ue.c
parent
58ba0089
Changes
6
Expand all
Hide whitespace changes
Inline
Side-by-side
cmake_targets/CMakeLists.txt
View file @
e2c32228
...
...
@@ -259,15 +259,6 @@ if (${ENABLE_ITTI})
endif
(
${
ENABLE_ITTI
}
)
add_boolean_option
(
RTAI False
"Use RTAI"
)
if
(
${
RTAI
}
)
set
(
LOWLATENCY False
)
set
(
CPU_AFFINITY False
)
add_definitions
(
"-DENABLE_RTAI_CLOCK"
)
add_definitions
(
"-DCONFIG_RTAI_LXRT_INLINE"
)
include_directories
(
"/usr/realtime/include"
)
include_directories
(
"/usr/realtime/include/asm"
)
set
(
RTAI_SOURCE sched_dlsch.c sched_rx_pdsch.c rt_wrapper.c vcd_signal_dumper.c log.c
)
endif
(
${
RTAI
}
)
#############################
# ASN.1 grammar C code generation & dependancies
...
...
@@ -1574,8 +1565,6 @@ add_executable(lte-softmodem
${
rrc_h
}
${
s1ap_h
}
${
OPENAIR_BIN_DIR
}
/messages_xml.h
${
OPENAIR_TARGETS
}
/RT/USER/sched_dlsch.c
${
OPENAIR_TARGETS
}
/RT/USER/sched_rx_pdsch.c
${
OPENAIR_TARGETS
}
/RT/USER/rt_wrapper.c
${
OPENAIR_TARGETS
}
/RT/USER/lte-ue.c
${
OPENAIR_TARGETS
}
/RT/USER/lte-softmodem.c
...
...
@@ -1611,8 +1600,6 @@ add_executable(lte-softmodem-nos1
${
rrc_h
}
${
s1ap_h
}
${
OPENAIR_BIN_DIR
}
/messages_xml.h
${
OPENAIR_TARGETS
}
/RT/USER/sched_dlsch.c
${
OPENAIR_TARGETS
}
/RT/USER/sched_rx_pdsch.c
${
OPENAIR_TARGETS
}
/RT/USER/rt_wrapper.c
${
OPENAIR_TARGETS
}
/RT/USER/lte-ue.c
${
OPENAIR_TARGETS
}
/RT/USER/lte-softmodem.c
...
...
targets/RT/USER/lte-softmodem.c
View file @
e2c32228
...
...
@@ -113,12 +113,18 @@ unsigned short config_frames[4] = {2,9,11,13};
#include
"stats.h"
#endif
// In lte-enb.c
int
setup_eNB_buffers
(
PHY_VARS_eNB
**
phy_vars_eNB
,
openair0_config_t
*
openair0_cfg
,
openair0_rf_map
rf_map
[
MAX_NUM_CCs
]);
int
setup_ue_buffers
(
PHY_VARS_UE
**
phy_vars_ue
,
openair0_config_t
*
openair0_cfg
,
openair0_rf_map
rf_map
[
MAX_NUM_CCs
]);
extern
void
init_eNB
(
void
);
extern
void
stop_eNB
(
void
);
extern
void
kill_eNB_proc
(
void
);
// In lte-ue.c
int
setup_ue_buffers
(
PHY_VARS_UE
**
phy_vars_ue
,
openair0_config_t
*
openair0_cfg
,
openair0_rf_map
rf_map
[
MAX_NUM_CCs
]);
void
fill_ue_band_info
(
void
);
extern
void
init_UE
(
void
);
#ifdef XFORMS
// current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0)
// at eNB 0, an UL scope for every UE
...
...
@@ -130,9 +136,6 @@ unsigned char scope_enb_num_ue = 2;
#endif //XFORMS
pthread_t
main_ue_thread
;
pthread_attr_t
attr_UE_thread
;
...
...
@@ -144,7 +147,6 @@ int sync_var=-1; //!< protected by mutex \ref sync_mutex.
struct
sched_param
sched_param_UE_thread
;
#ifdef XFORMS
...
...
@@ -284,9 +286,8 @@ openair0_config_t openair0_cfg[MAX_CARDS];
double
cpuf
;
char
uecap_xer
[
1024
],
uecap_xer_in
=
0
;
extern
void
*
UE_thread
(
void
*
arg
);
extern
void
init_UE_threads
(
void
);
extern
void
kill_eNB_proc
(
void
);
/*---------------------BMC: timespec helpers -----------------------------*/
...
...
@@ -1120,7 +1121,6 @@ int main( int argc, char **argv )
uint16_t
Nid_cell
=
0
;
uint8_t
cooperation_flag
=
0
,
abstraction_flag
=
0
;
uint8_t
beta_ACK
=
0
,
beta_RI
=
0
,
beta_CQI
=
2
;
int
error_code
;
#if defined (XFORMS)
int
ret
;
...
...
@@ -1752,43 +1752,11 @@ int main( int argc, char **argv )
rt_sleep_ns
(
10
*
100000000ULL
);
pthread_attr_init
(
&
attr_UE_thread
);
pthread_attr_setstacksize
(
&
attr_UE_thread
,
8192
);
//5*PTHREAD_STACK_MIN);
#ifndef LOWLATENCY
sched_param_UE_thread
.
sched_priority
=
sched_get_priority_max
(
SCHED_FIFO
);
pthread_attr_setschedparam
(
&
attr_UE_thread
,
&
sched_param_UE_thread
);
#endif
// start the main thread
if
(
UE_flag
==
1
)
{
printf
(
"Intializing UE Threads ...
\n
"
);
init_UE_threads
();
sleep
(
1
);
error_code
=
pthread_create
(
&
main_ue_thread
,
&
attr_UE_thread
,
UE_thread
,
NULL
);
if
(
error_code
!=
0
)
{
LOG_D
(
HW
,
"[lte-softmodem.c] Could not allocate UE_thread, error %d
\n
"
,
error_code
);
return
(
error_code
);
}
else
{
LOG_D
(
HW
,
"[lte-softmodem.c] Allocate UE_thread successful
\n
"
);
pthread_setname_np
(
main_ue_thread
,
"main UE"
);
}
printf
(
"UE threads created
\n
"
);
#ifdef USE_MME
while
(
start_UE
==
0
)
{
sleep
(
1
);
}
#endif
}
else
{
init_eNB
();
}
if
(
UE_flag
==
1
)
init_UE
();
else
init_eNB
();
// Sleep to allow all threads to setup
sleep
(
1
);
...
...
targets/RT/USER/lte-ue.c
View file @
e2c32228
This diff is collapsed.
Click to expand it.
targets/RT/USER/sched_dlsch.c
deleted
100644 → 0
View file @
58ba0089
/*******************************************************************************
OpenAirInterface
Copyright(c) 1999 - 2014 Eurecom
OpenAirInterface is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenAirInterface is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenAirInterface.The full GNU General Public License is
included in this distribution in the file called "COPYING". If not,
see <http://www.gnu.org/licenses/>.
Contact Information
OpenAirInterface Admin: openair_admin@eurecom.fr
OpenAirInterface Tech : openair_tech@eurecom.fr
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
*******************************************************************************/
/*! \file sched_dlsch.c
* \brief DLSCH decoding thread (RTAI)
* \author R. Knopp, F. Kaltenberger
* \date 2011
* \version 0.1
* \company Eurecom
* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr
* \note
* \warning
*/
#include
<stdio.h>
#include
<stdlib.h>
#include
<sched.h>
#include
"rt_wrapper.h"
#include
<sys/mman.h>
#include
"PHY/types.h"
#include
"PHY/defs.h"
#include
"PHY/extern.h"
#include
"SCHED/defs.h"
#include
"UTIL/LOG/vcd_signal_dumper.h"
#define DEBUG_PHY
/// Mutex for instance count on dlsch scheduling
pthread_mutex_t
dlsch_mutex
[
8
];
/// Condition variable for dlsch thread
pthread_cond_t
dlsch_cond
[
8
];
pthread_t
dlsch_threads
[
8
];
pthread_attr_t
attr_dlsch_threads
;
unsigned
char
dlsch_thread_indices
[
8
];
// activity indicators for harq_pid's
int
dlsch_instance_cnt
[
8
];
// process ids for cpu
int
dlsch_cpuid
[
8
];
// subframe number for each harq_pid (needed to store ack in right place for UL)
int
dlsch_subframe
[
8
];
extern
int
oai_exit
;
/*
extern int dlsch_errors;
extern int dlsch_received;
extern int dlsch_errors_last;
extern int dlsch_received_last;
extern int dlsch_fer;
extern int current_dlsch_cqi;
*/
/** DLSCH Decoding Thread */
static
void
*
dlsch_thread
(
void
*
param
)
{
//unsigned long cpuid;
unsigned
char
dlsch_thread_index
=
*
((
unsigned
char
*
)
param
);
unsigned
int
ret
=
0
;
uint8_t
harq_pid
;
#ifdef RTAI
RT_TASK
*
task
;
char
task_name
[
8
];
#endif
int
eNB_id
=
0
,
UE_id
=
0
,
CC_id
=
0
;
PHY_VARS_UE
*
phy_vars_ue
=
PHY_vars_UE_g
[
UE_id
][
CC_id
];
if
((
dlsch_thread_index
<
0
)
||
(
dlsch_thread_index
>
7
))
{
LOG_E
(
PHY
,
"[SCHED][DLSCH] Illegal dlsch_thread_index %d (%p)!!!!
\n
"
,
dlsch_thread_index
,
param
);
return
0
;
}
#ifdef RTAI
sprintf
(
task_name
,
"DLSCH%d"
,
dlsch_thread_index
);
task
=
rt_task_init_schmod
(
nam2num
(
task_name
),
0
,
0
,
0
,
SCHED_FIFO
,
0xF
);
if
(
task
==
NULL
)
{
LOG_E
(
PHY
,
"[SCHED][DLSCH] Problem starting dlsch_thread_index %d (%s)!!!!
\n
"
,
dlsch_thread_index
,
task_name
);
return
0
;
}
else
{
LOG_I
(
PHY
,
"[SCHED][DLSCH] dlsch_thread for process %d started with id %p
\n
"
,
dlsch_thread_index
,
task
);
}
#endif
mlockall
(
MCL_CURRENT
|
MCL_FUTURE
);
//rt_set_runnable_on_cpuid(task,1);
//cpuid = rtai_cpuid();
#ifdef HARD_RT
rt_make_hard_real_time
();
#endif
//dlsch_cpuid[dlsch_thread_index] = cpuid;
while
(
!
oai_exit
)
{
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_THREAD0
+
dlsch_thread_index
,
0
);
if
(
pthread_mutex_lock
(
&
dlsch_mutex
[
dlsch_thread_index
])
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][DLSCH] error locking mutex.
\n
"
);
}
else
{
while
(
dlsch_instance_cnt
[
dlsch_thread_index
]
<
0
)
{
pthread_cond_wait
(
&
dlsch_cond
[
dlsch_thread_index
],
&
dlsch_mutex
[
dlsch_thread_index
]);
}
if
(
pthread_mutex_unlock
(
&
dlsch_mutex
[
dlsch_thread_index
])
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][DLSCH] error unlocking mutex.
\n
"
);
}
}
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_rx
,
dlsch_thread_index
);
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
;
}
harq_pid
=
dlsch_thread_index
;
if
(
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
])
{
// rt_printk("[SCHED][DLSCH] Frame %d, slot %d, start %llu, end %llu, proc time: %llu ns\n",phy_vars_ue->frame,last_slot,time0,time1,(time1-time0));
dlsch_unscrambling
(
&
phy_vars_ue
->
lte_frame_parms
,
0
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
],
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
G
,
phy_vars_ue
->
lte_ue_pdsch_vars
[
eNB_id
]
->
llr
[
0
],
0
,
dlsch_subframe
[
dlsch_thread_index
]
<<
1
);
LOG_I
(
PHY
,
"[UE %d] PDSCH Calling dlsch_decoding for subframe %d, harq_pid %d, G%d
\n
"
,
phy_vars_ue
->
Mod_id
,
dlsch_subframe
[
dlsch_thread_index
],
harq_pid
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
G
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING0
+
dlsch_thread_index
,
1
);
ret
=
dlsch_decoding
(
phy_vars_ue
,
phy_vars_ue
->
lte_ue_pdsch_vars
[
eNB_id
]
->
llr
[
0
],
&
phy_vars_ue
->
lte_frame_parms
,
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
],
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
],
dlsch_subframe
[
dlsch_thread_index
],
harq_pid
,
1
,
// is_crnti
0
);
// llr8_flag
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING0
+
dlsch_thread_index
,
0
);
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_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
(
ret
==
(
1
+
MAX_TURBO_ITERATIONS
))
{
phy_vars_ue
->
dlsch_errors
[
eNB_id
]
++
;
#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_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
}
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_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_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
);
#endif
phy_vars_ue
->
total_TBS
[
eNB_id
]
=
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
TBS
+
phy_vars_ue
->
total_TBS
[
eNB_id
];
phy_vars_ue
->
total_received_bits
[
eNB_id
]
=
phy_vars_ue
->
total_received_bits
[
eNB_id
]
+
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
TBS
;
}
}
// this is done in main thread
/*
if (phy_vars_ue->frame % 100 == 0) {
if ((phy_vars_ue->dlsch_received[eNB_id] - phy_vars_ue->dlsch_received_last[eNB_id]) != 0)
phy_vars_ue->dlsch_fer[eNB_id] = (100*(phy_vars_ue->dlsch_errors[eNB_id] - phy_vars_ue->dlsch_errors_last[eNB_id]))/(phy_vars_ue->dlsch_received[eNB_id] - phy_vars_ue->dlsch_received_last[eNB_id]);
phy_vars_ue->dlsch_errors_last[eNB_id] = phy_vars_ue->dlsch_errors[eNB_id];
phy_vars_ue->dlsch_received_last[eNB_id] = phy_vars_ue->dlsch_received[eNB_id];
}
*/
#ifdef DEBUG_PHY
if
(
phy_vars_ue
->
dlsch_ue
[
eNB_id
][
0
])
{
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_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_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_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
],
phy_vars_ue
->
PHY_measurements
.
wideband_cqi_tot
[
eNB_id
]);
}
}
else
{
LOG_I
(
PHY
,
"[UE %d][PDSCH ?/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (phy_vars_ue->dlsch_ue[eNB_id][0] == 0)
\n
"
,
phy_vars_ue
->
Mod_id
,
harq_pid
,
phy_vars_ue
->
frame_rx
,
dlsch_subframe
[
dlsch_thread_index
],
ret
);
}
#endif
if
(
pthread_mutex_lock
(
&
dlsch_mutex
[
dlsch_thread_index
])
!=
0
)
{
msg
(
"[openair][SCHED][DLSCH] error locking mutex.
\n
"
);
}
else
{
dlsch_instance_cnt
[
dlsch_thread_index
]
--
;
if
(
pthread_mutex_unlock
(
&
dlsch_mutex
[
dlsch_thread_index
])
!=
0
)
{
msg
(
"[openair][SCHED][DLSCH] error unlocking mutex.
\n
"
);
}
}
}
#ifdef HARD_RT
rt_make_soft_real_time
();
#endif
msg
(
"[openair][SCHED][DLSCH] DLSCH thread %d exiting
\n
"
,
dlsch_thread_index
);
return
0
;
}
int
init_dlsch_threads
(
void
)
{
int
error_code
;
struct
sched_param
p
;
unsigned
char
dlsch_thread_index
;
pthread_attr_init
(
&
attr_dlsch_threads
);
pthread_attr_setstacksize
(
&
attr_dlsch_threads
,
OPENAIR_THREAD_STACK_SIZE
);
//attr_dlsch_threads.priority = 1;
p
.
sched_priority
=
OPENAIR_THREAD_PRIORITY
;
pthread_attr_setschedparam
(
&
attr_dlsch_threads
,
&
p
);
#ifndef RTAI_ISNT_POSIX
pthread_attr_setschedpolicy
(
&
attr_dlsch_threads
,
SCHED_FIFO
);
#endif
for
(
dlsch_thread_index
=
0
;
dlsch_thread_index
<
8
;
dlsch_thread_index
++
)
{
pthread_mutex_init
(
&
dlsch_mutex
[
dlsch_thread_index
],
NULL
);
pthread_cond_init
(
&
dlsch_cond
[
dlsch_thread_index
],
NULL
);
dlsch_instance_cnt
[
dlsch_thread_index
]
=
-
1
;
dlsch_thread_indices
[
dlsch_thread_index
]
=
dlsch_thread_index
;
rt_printk
(
"[openair][SCHED][DLSCH][INIT] Allocating DLSCH thread for dlsch_thread_index %d (%p)
\n
"
,
dlsch_thread_index
,
&
dlsch_thread_indices
[
dlsch_thread_index
]);
error_code
=
pthread_create
(
&
dlsch_threads
[
dlsch_thread_index
],
&
attr_dlsch_threads
,
dlsch_thread
,
(
void
*
)
&
dlsch_thread_indices
[
dlsch_thread_index
]);
if
(
error_code
!=
0
)
{
rt_printk
(
"[openair][SCHED][DLSCH][INIT] Could not allocate dlsch_thread %d, error %d
\n
"
,
dlsch_thread_index
,
error_code
);
return
(
error_code
);
}
else
{
rt_printk
(
"[openair][SCHED][DLSCH][INIT] Allocate dlsch_thread %d successful
\n
"
,
dlsch_thread_index
);
}
}
return
(
0
);
}
void
cleanup_dlsch_threads
(
void
)
{
unsigned
char
dlsch_thread_index
;
for
(
dlsch_thread_index
=
0
;
dlsch_thread_index
<
8
;
dlsch_thread_index
++
)
{
// pthread_exit(&dlsch_threads[dlsch_thread_index]);
rt_printk
(
"[openair][SCHED][DLSCH] Scheduling dlsch_thread %d to exit
\n
"
,
dlsch_thread_index
);
dlsch_instance_cnt
[
dlsch_thread_index
]
=
0
;
if
(
pthread_cond_signal
(
&
dlsch_cond
[
dlsch_thread_index
])
!=
0
)
rt_printk
(
"[openair][SCHED][DLSCH] ERROR pthread_cond_signal
\n
"
);
else
rt_printk
(
"[openair][SCHED][DLSCH] Signalled dlsch_thread %d to exit
\n
"
,
dlsch_thread_index
);
rt_printk
(
"[openair][SCHED][DLSCH] Exiting ...
\n
"
);
pthread_cond_destroy
(
&
dlsch_cond
[
dlsch_thread_index
]);
pthread_mutex_destroy
(
&
dlsch_mutex
[
dlsch_thread_index
]);
}
}
targets/RT/USER/sched_rx_pdsch.c
deleted
100644 → 0
View file @
58ba0089
/*******************************************************************************
OpenAirInterface
Copyright(c) 1999 - 2014 Eurecom
OpenAirInterface is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenAirInterface is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenAirInterface.The full GNU General Public License is
included in this distribution in the file called "COPYING". If not,
see <http://www.gnu.org/licenses/>.
Contact Information
OpenAirInterface Admin: openair_admin@eurecom.fr
OpenAirInterface Tech : openair_tech@eurecom.fr
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
*******************************************************************************/
/*! \file sched_dlsch.c
* \brief DLSCH decoding thread (RTAI)
* \author R. Knopp, F. Kaltenberger
* \date 2011
* \version 0.1
* \company Eurecom
* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr
* \note
* \warning
*/
#include
<stdio.h>
#include
<stdlib.h>
#include
<sched.h>
#include
"rt_wrapper.h"
#include
<sys/mman.h>
#include
"PHY/types.h"
#include
"PHY/defs.h"
#include
"PHY/extern.h"
#include
"SCHED/defs.h"
#include
"SCHED/extern.h"
#include
"UTIL/LOG/vcd_signal_dumper.h"
RTIME
time0
,
time1
;
#define DEBUG_PHY
/// Mutex for instance count on rx_pdsch scheduling
pthread_mutex_t
rx_pdsch_mutex
;
/// Condition variable for rx_pdsch thread
pthread_cond_t
rx_pdsch_cond
;
pthread_t
rx_pdsch_thread_var
;
pthread_attr_t
attr_rx_pdsch_thread
;
// activity indicators for harq_pid's
int
rx_pdsch_instance_cnt
;
// process ids for cpu
int
rx_pdsch_cpuid
;
// subframe number for each harq_pid (needed to store ack in right place for UL)
int
rx_pdsch_slot
;
extern
int
oai_exit
;
extern
pthread_mutex_t
dlsch_mutex
[
8
];
extern
int
dlsch_instance_cnt
[
8
];
extern
int
dlsch_subframe
[
8
];
extern
pthread_cond_t
dlsch_cond
[
8
];
/** RX_PDSCH Decoding Thread */
static
void
*
rx_pdsch_thread
(
void
*
param
)
{
//unsigned long cpuid;
uint8_t
dlsch_thread_index
=
0
;
uint8_t
pilot2
,
harq_pid
,
subframe
;
// uint8_t last_slot;
uint8_t
dual_stream_UE
=
0
;
uint8_t
i_mod
=
0
;
#ifdef RTAI
RT_TASK
*
task
;
#endif
int
m
,
eNB_id
=
0
;
int
eNB_id_i
=
1
;
PHY_VARS_UE
*
UE
=
PHY_vars_UE_g
[
0
][
0
];
#ifdef RTAI
task
=
rt_task_init_schmod
(
nam2num
(
"RX_PDSCH_THREAD"
),
0
,
0
,
0
,
SCHED_FIFO
,
0xF
);
if
(
task
==
NULL
)
{
LOG_E
(
PHY
,
"[SCHED][RX_PDSCH] Problem starting rx_pdsch thread!!!!
\n
"
);
return
0
;
}
else
{
LOG_I
(
PHY
,
"[SCHED][RX_PDSCH] rx_pdsch_thread started for with id %p
\n
"
,
task
);
}
#endif
mlockall
(
MCL_CURRENT
|
MCL_FUTURE
);
//rt_set_runnable_on_cpuid(task,1);
//cpuid = rtai_cpuid();
#ifdef HARD_RT
rt_make_hard_real_time
();
#endif
if
(
UE
->
lte_frame_parms
.
Ncp
==
NORMAL
)
{
// normal prefix
pilot2
=
7
;
}
else
{
// extended prefix
pilot2
=
6
;
}