Commit 6b99b1b1 authored by Wang Tsu-Han's avatar Wang Tsu-Han

emulated RF using seperate thread condition signal every time period

parent 8950c6dd
...@@ -331,8 +331,10 @@ typedef struct RU_proc_t_s { ...@@ -331,8 +331,10 @@ typedef struct RU_proc_t_s {
int instance_cnt_asynch_rxtx; int instance_cnt_asynch_rxtx;
/// \internal This variable is protected by \ref mutex_fep /// \internal This variable is protected by \ref mutex_fep
int instance_cnt_fep; int instance_cnt_fep;
/// \internal This variable is protected by \ref mutex_fep /// \internal This variable is protected by \ref mutex_feptx
int instance_cnt_feptx; int instance_cnt_feptx;
/// This varible is protected by \ref mutex_emulatedRF
int instance_cnt_emulateRF;
/// pthread structure for RU FH processing thread /// pthread structure for RU FH processing thread
pthread_t pthread_FH; pthread_t pthread_FH;
pthread_t pthread_FH1; pthread_t pthread_FH1;
...@@ -346,8 +348,10 @@ typedef struct RU_proc_t_s { ...@@ -346,8 +348,10 @@ typedef struct RU_proc_t_s {
pthread_t pthread_synch; pthread_t pthread_synch;
/// pthread struct for RU RX FEP worker thread /// pthread struct for RU RX FEP worker thread
pthread_t pthread_fep; pthread_t pthread_fep;
/// pthread struct for RU RX FEPTX worker thread /// pthread struct for RU TX FEP worker thread
pthread_t pthread_feptx; pthread_t pthread_feptx;
/// pthread struct for emulated RF
pthread_t pthread_emulateRF;
/// pthread structure for asychronous RX/TX processing thread /// pthread structure for asychronous RX/TX processing thread
pthread_t pthread_asynch_rxtx; pthread_t pthread_asynch_rxtx;
/// flag to indicate first RX acquisition /// flag to indicate first RX acquisition
...@@ -371,6 +375,8 @@ typedef struct RU_proc_t_s { ...@@ -371,6 +375,8 @@ typedef struct RU_proc_t_s {
pthread_attr_t attr_fep; pthread_attr_t attr_fep;
/// pthread attributes for worker feptx thread /// pthread attributes for worker feptx thread
pthread_attr_t attr_feptx; pthread_attr_t attr_feptx;
/// pthread attributes for emulated RF
pthread_attr_t attr_emulateRF;
/// scheduling parameters for RU FH thread /// scheduling parameters for RU FH thread
struct sched_param sched_param_FH; struct sched_param sched_param_FH;
struct sched_param sched_param_FH1; struct sched_param sched_param_FH1;
...@@ -397,10 +403,12 @@ typedef struct RU_proc_t_s { ...@@ -397,10 +403,12 @@ typedef struct RU_proc_t_s {
pthread_cond_t cond_synch; pthread_cond_t cond_synch;
/// condition variable for asynch RX/TX thread /// condition variable for asynch RX/TX thread
pthread_cond_t cond_asynch_rxtx; pthread_cond_t cond_asynch_rxtx;
/// condition varaible for RU RX FEP thread /// condition varible for RU RX FEP thread
pthread_cond_t cond_fep; pthread_cond_t cond_fep;
/// condition varaible for RU RX FEPTX thread /// condition varible for RU TX FEP thread
pthread_cond_t cond_feptx; pthread_cond_t cond_feptx;
/// condition varible for emulated RF
pthread_cond_t cond_emulateRF;
/// condition variable for eNB signal /// condition variable for eNB signal
pthread_cond_t cond_eNBs; pthread_cond_t cond_eNBs;
/// mutex for RU FH /// mutex for RU FH
...@@ -422,6 +430,8 @@ typedef struct RU_proc_t_s { ...@@ -422,6 +430,8 @@ typedef struct RU_proc_t_s {
pthread_mutex_t mutex_fep; pthread_mutex_t mutex_fep;
/// mutex for fep TX worker thread /// mutex for fep TX worker thread
pthread_mutex_t mutex_feptx; pthread_mutex_t mutex_feptx;
/// mutex for emulated RF thread
pthread_mutex_t mutex_emulateRF;
/// symbol mask for IF4p5 reception per subframe /// symbol mask for IF4p5 reception per subframe
uint32_t symbol_mask[10]; uint32_t symbol_mask[10];
/// number of slave threads /// number of slave threads
......
...@@ -683,6 +683,24 @@ void fh_if4p5_north_out(RU_t *ru) { ...@@ -683,6 +683,24 @@ void fh_if4p5_north_out(RU_t *ru) {
if (ru->idx == 0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX, 0 ); if (ru->idx == 0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX, 0 );
} }
static void* emulatedRF_thread(void* param) {
RU_proc_t *proc = (RU_proc_t *) param;
int microsec = 500; // length of time to sleep, in miliseconds
struct timespec req = {0};
req.tv_sec = 0;
req.tv_nsec = microsec * 1000L;
wait_sync("emulatedRF_thread");
while(!oai_exit){
nanosleep(&req, (struct timespec *)NULL);
pthread_mutex_lock(&proc->mutex_emulateRF);
++proc->instance_cnt_emulateRF;
pthread_mutex_unlock(&proc->mutex_emulateRF);
pthread_cond_signal(&proc->cond_emulateRF);
}
return 0;
}
void rx_rf(RU_t *ru,int *frame,int *subframe) { void rx_rf(RU_t *ru,int *frame,int *subframe) {
RU_proc_t *proc = &ru->proc; RU_proc_t *proc = &ru->proc;
...@@ -699,11 +717,8 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) { ...@@ -699,11 +717,8 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) {
old_ts = proc->timestamp_rx; old_ts = proc->timestamp_rx;
#ifdef EMULATE_RF #ifdef EMULATE_RF
int microsec = 450; // length of time to sleep, in miliseconds wait_on_condition(&proc->mutex_emulateRF,&proc->cond_emulateRF,&proc->instance_cnt_emulateRF,"emulatedRF_thread");
struct timespec req = {0}; release_thread(&proc->mutex_emulateRF,&proc->instance_cnt_emulateRF,"emulatedRF_thread");
req.tv_sec = 0;
req.tv_nsec = microsec * 1000L;
nanosleep(&req, (struct timespec *)NULL);
rxs = fp->samples_per_tti; rxs = fp->samples_per_tti;
#else #else
rxs = ru->rfdevice.trx_read_func(&ru->rfdevice, rxs = ru->rfdevice.trx_read_func(&ru->rfdevice,
...@@ -715,7 +730,7 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) { ...@@ -715,7 +730,7 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) {
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 );
proc->timestamp_rx = -ru->ts_offset;//ts-ru->ts_offset; proc->timestamp_rx = ts-ru->ts_offset;
if (rxs != fp->samples_per_tti) if (rxs != fp->samples_per_tti)
LOG_E(PHY,"rx_rf: Asked for %d samples, got %d from USRP\n",fp->samples_per_tti,rxs); LOG_E(PHY,"rx_rf: Asked for %d samples, got %d from USRP\n",fp->samples_per_tti,rxs);
...@@ -728,7 +743,7 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) { ...@@ -728,7 +743,7 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) {
if (proc->timestamp_rx - old_ts != fp->samples_per_tti) { if (proc->timestamp_rx - old_ts != fp->samples_per_tti) {
//LOG_I(PHY,"rx_rf: rfdevice timing drift of %"PRId64" samples (ts_off %"PRId64")\n",proc->timestamp_rx - old_ts - fp->samples_per_tti,ru->ts_offset); //LOG_I(PHY,"rx_rf: rfdevice timing drift of %"PRId64" samples (ts_off %"PRId64")\n",proc->timestamp_rx - old_ts - fp->samples_per_tti,ru->ts_offset);
ru->ts_offset += (proc->timestamp_rx - old_ts - fp->samples_per_tti); ru->ts_offset += (proc->timestamp_rx - old_ts - fp->samples_per_tti);
proc->timestamp_rx = -ru->ts_offset;//ts-ru->ts_offset; proc->timestamp_rx = ts-ru->ts_offset;
} }
} }
...@@ -1405,7 +1420,7 @@ static void* ru_thread_tx( void* param ) { ...@@ -1405,7 +1420,7 @@ static void* ru_thread_tx( void* param ) {
} }
LOG_D(PHY,"ru_thread_tx: Waiting for TX processing\n"); LOG_D(PHY,"ru_thread_tx: Waiting for TX processing\n");
// wait until eNBs are finished subframe RX n and TX n+4 // wait until eNBs are finished subframe RX n and TX n+4
wait_on_condition(&proc->mutex_eNBs,&proc->cond_eNBs,&proc->instance_cnt_eNBs,"ru_thread"); wait_on_condition(&proc->mutex_eNBs,&proc->cond_eNBs,&proc->instance_cnt_eNBs,"ru_thread_tx");
//printf("//////////////////instance_cnt_eNBs = %d\n",proc->instance_cnt_eNBs);//////////////////********* //printf("//////////////////instance_cnt_eNBs = %d\n",proc->instance_cnt_eNBs);//////////////////*********
#ifdef EMULATE_RF #ifdef EMULATE_RF
...@@ -1421,7 +1436,7 @@ static void* ru_thread_tx( void* param ) { ...@@ -1421,7 +1436,7 @@ static void* ru_thread_tx( void* param ) {
if (ru->fh_north_out) ru->fh_north_out(ru); if (ru->fh_north_out) ru->fh_north_out(ru);
#endif #endif
release_thread(&proc->mutex_eNBs,&proc->instance_cnt_eNBs,"ru_thread"); release_thread(&proc->mutex_eNBs,&proc->instance_cnt_eNBs,"ru_thread_tx");
} }
return 0; return 0;
...@@ -1706,7 +1721,7 @@ void init_RU_proc(RU_t *ru) { ...@@ -1706,7 +1721,7 @@ void init_RU_proc(RU_t *ru) {
int i=0; int i=0;
RU_proc_t *proc; RU_proc_t *proc;
pthread_attr_t *attr_FH=NULL,*attr_FH1=NULL,*attr_prach=NULL,*attr_asynch=NULL,*attr_synch=NULL; pthread_attr_t *attr_FH=NULL,*attr_FH1=NULL,*attr_prach=NULL,*attr_asynch=NULL,*attr_synch=NULL,*attr_emulateRF=NULL;
//pthread_attr_t *attr_fep=NULL; //pthread_attr_t *attr_fep=NULL;
#ifdef Rel14 #ifdef Rel14
pthread_attr_t *attr_prach_br=NULL; pthread_attr_t *attr_prach_br=NULL;
...@@ -1724,6 +1739,7 @@ void init_RU_proc(RU_t *ru) { ...@@ -1724,6 +1739,7 @@ void init_RU_proc(RU_t *ru) {
proc->instance_cnt_synch = -1; proc->instance_cnt_synch = -1;
proc->instance_cnt_FH = -1; proc->instance_cnt_FH = -1;
proc->instance_cnt_FH1 = -1; proc->instance_cnt_FH1 = -1;
proc->instance_cnt_emulateRF = -1;
proc->instance_cnt_asynch_rxtx = -1; proc->instance_cnt_asynch_rxtx = -1;
proc->instance_cnt_eNBs = -1; proc->instance_cnt_eNBs = -1;
proc->first_rx = 1; proc->first_rx = 1;
...@@ -1739,15 +1755,18 @@ void init_RU_proc(RU_t *ru) { ...@@ -1739,15 +1755,18 @@ void init_RU_proc(RU_t *ru) {
pthread_mutex_init( &proc->mutex_synch,NULL); pthread_mutex_init( &proc->mutex_synch,NULL);
pthread_mutex_init( &proc->mutex_FH,NULL); pthread_mutex_init( &proc->mutex_FH,NULL);
pthread_mutex_init( &proc->mutex_FH1,NULL); pthread_mutex_init( &proc->mutex_FH1,NULL);
pthread_mutex_init( &proc->mutex_emulateRF,NULL);
pthread_cond_init( &proc->cond_prach, NULL); pthread_cond_init( &proc->cond_prach, NULL);
pthread_cond_init( &proc->cond_FH, NULL); pthread_cond_init( &proc->cond_FH, NULL);
pthread_cond_init( &proc->cond_FH1, NULL); pthread_cond_init( &proc->cond_FH1, NULL);
pthread_cond_init( &proc->cond_emulateRF, NULL);
pthread_cond_init( &proc->cond_asynch_rxtx, NULL); pthread_cond_init( &proc->cond_asynch_rxtx, NULL);
pthread_cond_init( &proc->cond_synch,NULL); pthread_cond_init( &proc->cond_synch,NULL);
pthread_attr_init( &proc->attr_FH); pthread_attr_init( &proc->attr_FH);
pthread_attr_init( &proc->attr_FH1); pthread_attr_init( &proc->attr_FH1);
pthread_attr_init( &proc->attr_emulateRF);
pthread_attr_init( &proc->attr_prach); pthread_attr_init( &proc->attr_prach);
pthread_attr_init( &proc->attr_synch); pthread_attr_init( &proc->attr_synch);
pthread_attr_init( &proc->attr_asynch_rxtx); pthread_attr_init( &proc->attr_asynch_rxtx);
...@@ -1766,12 +1785,16 @@ void init_RU_proc(RU_t *ru) { ...@@ -1766,12 +1785,16 @@ void init_RU_proc(RU_t *ru) {
attr_prach = &proc->attr_prach; attr_prach = &proc->attr_prach;
attr_synch = &proc->attr_synch; attr_synch = &proc->attr_synch;
attr_asynch = &proc->attr_asynch_rxtx; attr_asynch = &proc->attr_asynch_rxtx;
attr_emulateRF = &proc->attr_emulateRF;
#ifdef Rel14 #ifdef Rel14
attr_prach_br = &proc->attr_prach_br; attr_prach_br = &proc->attr_prach_br;
#endif #endif
#endif #endif
pthread_create( &proc->pthread_FH, attr_FH, ru_thread, (void*)ru );\ pthread_create( &proc->pthread_FH, attr_FH, ru_thread, (void*)ru );
#ifdef EMULATE_RF
pthread_create( &proc->pthread_emulateRF, attr_emulateRF, emulatedRF_thread, (void*)proc );
#endif
if (fh_two_thread==1) if (fh_two_thread==1)
pthread_create( &proc->pthread_FH1, attr_FH1, ru_thread_tx, (void*)ru ); pthread_create( &proc->pthread_FH1, attr_FH1, ru_thread_tx, (void*)ru );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment