diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index 50e836fe58..e844ae7444 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -332,7 +332,9 @@ int nr_dlsch_encoding(unsigned char *a, dlsch->harq_processes[harq_pid]->B = A+24; // dlsch->harq_processes[harq_pid]->b = a; - + + AssertFatal((A/8)+4 <= MAX_DLSCH_PAYLOAD_BYTES,"A %d is too big (A/8+4 = %d > %d)\n",A,(A/8)+4,MAX_DLSCH_PAYLOAD_BYTES); + memcpy(dlsch->harq_processes[harq_pid]->b,a,(A/8)+4); nr_segmentation(dlsch->harq_processes[harq_pid]->b, diff --git a/targets/RT/USER/gNB_usrp.gtkw b/targets/RT/USER/gNB_usrp.gtkw index 115514c1f5..4da0d4c5dd 100644 --- a/targets/RT/USER/gNB_usrp.gtkw +++ b/targets/RT/USER/gNB_usrp.gtkw @@ -1,11 +1,11 @@ [*] [*] GTKWave Analyzer v3.3.86 (w)1999-2017 BSI -[*] Tue May 7 21:21:14 2019 +[*] Wed May 8 09:33:31 2019 [*] [dumpfile] "/tmp/openair_dump_gNB40.vcd" -[dumpfile_mtime] "Tue May 7 21:19:43 2019" -[dumpfile_size] 18197199 -[savefile] "/home/belostome/raymond/openairinterface5g/targets/RT/USER/gNB_usrp.gtkw" +[dumpfile_mtime] "Wed May 8 09:32:07 2019" +[dumpfile_size] 1965634 +[savefile] "/home/espagne/raymond/openairinterface5g/targets/RT/USER/gNB_usrp.gtkw" [timestart] 8147990000 [size] 1920 859 [pos] -1 -1 @@ -17,8 +17,10 @@ @28 functions.trx_read functions.trx_write -@421 +@420 variables.frame_number_TX0_UE[63:0] +@421 +variables.frame_number_TX1_UE[63:0] @420 variables.frame_number_RX1_UE[63:0] @24 diff --git a/targets/RT/USER/nr-gnb.c b/targets/RT/USER/nr-gnb.c index b81df2e36a..343ee50078 100644 --- a/targets/RT/USER/nr-gnb.c +++ b/targets/RT/USER/nr-gnb.c @@ -244,8 +244,21 @@ static void* gNB_L1_thread_tx(void* param) { char thread_name[100]; + + // This tells L1_thread (RX) that L1_thread_tx is not ready yet + pthread_mutex_lock(&L1_proc_tx->mutex); + L1_proc_tx->instance_cnt = -2; + pthread_mutex_unlock(&L1_proc_tx->mutex); + sprintf(thread_name,"gNB_L1_thread_tx\n"); - + + thread_top_init(thread_name,1,870000L,1000000L,1000000L); + + // This tells L1_thread (RX) that L1_thread_tx is ready + pthread_mutex_lock(&L1_proc_tx->mutex); + L1_proc_tx->instance_cnt++; + pthread_mutex_unlock(&L1_proc_tx->mutex); + while (!oai_exit) { if (wait_on_condition(&L1_proc_tx->mutex,&L1_proc_tx->cond,&L1_proc_tx->instance_cnt,thread_name)<0) break; @@ -296,7 +309,10 @@ static void* gNB_L1_thread( void* param ) { char thread_name[100]; - + // This tells ru_thread that L1_thread is not ready + pthread_mutex_lock(&L1_proc->mutex); + L1_proc->instance_cnt = -2; + pthread_mutex_unlock(&L1_proc->mutex); // set default return value gNB_thread_rxtx_status = 0; @@ -304,6 +320,13 @@ static void* gNB_L1_thread( void* param ) { sprintf(thread_name,"gNB_L1_thread"); + thread_top_init(thread_name,1,870000L,1000000L,1000000L); + + // This tells ru_thread that L1_thread is ready + pthread_mutex_lock(&L1_proc->mutex); + L1_proc->instance_cnt++; + pthread_mutex_unlock(&L1_proc->mutex); + while (!oai_exit) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_PROC_RXTX0, 0 ); @@ -476,6 +499,11 @@ int wakeup_tx(PHY_VARS_gNB *gNB,int frame_rx,int slot_rx,int frame_tx,int slot_t exit_fun("ERROR pthread_lock"); return(-1); } + if (L1_proc_tx->instance_cnt == -2) { // L1_thread_tx isn't ready yet so return + pthread_mutex_unlock( &L1_proc_tx->mutex); + return(0); + } + while(L1_proc_tx->instance_cnt == 0){ pthread_cond_wait(&L1_proc_tx->cond,&L1_proc_tx->mutex); } @@ -490,7 +518,10 @@ int wakeup_tx(PHY_VARS_gNB *gNB,int frame_rx,int slot_rx,int frame_tx,int slot_t L1_proc_tx->timestamp_tx = timestamp_tx; pthread_mutex_unlock( &L1_proc_tx->mutex); - + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX1_UE,1); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX1_UE,0); + // the thread can now be woken up if (pthread_cond_signal(&L1_proc_tx->cond) != 0) { LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread\n"); @@ -535,16 +566,6 @@ int wakeup_rxtx(PHY_VARS_gNB *gNB,RU_t *ru) { wait.tv_sec=0; wait.tv_nsec=5000000L; - /* accept some delay in processing - up to 5ms */ - for (i = 0; i < fp->slots_per_frame && L1_proc->instance_cnt == 0; i++) { - LOG_W( PHY,"[gNB] SFN.SL %d.%d, gNB L1 thread busy!! (i %d, cnt %i)\n", L1_proc->frame_tx, L1_proc->slot_tx, i,L1_proc->instance_cnt); - usleep(100); - } - if (L1_proc->instance_cnt == 0) { - exit_fun( "RX thread busy" ); - return(-1); - } - // wake up TX for subframe n+sl_ahead // lock the TX mutex and make sure the thread is ready if (pthread_mutex_timedlock(&L1_proc->mutex,&wait) != 0) { @@ -552,7 +573,17 @@ int wakeup_rxtx(PHY_VARS_gNB *gNB,RU_t *ru) { exit_fun( "error locking mutex" ); return(-1); } - + + if (L1_proc->instance_cnt==-2) { // L1_thread isn't ready yet so return + pthread_mutex_unlock( &L1_proc->mutex ); + return(0); + } + + if (L1_proc->instance_cnt == 0) { // L1_thread is busy so abort the subframe + pthread_mutex_unlock( &L1_proc->mutex ); + LOG_W(PHY,"L1_thread isn't ready in %d.%d, aborting RX processing\n",ru_proc->frame_rx,ru_proc->tti_rx); + } + ++L1_proc->instance_cnt; // We have just received and processed the common part of a subframe, say n. @@ -569,6 +600,8 @@ int wakeup_rxtx(PHY_VARS_gNB *gNB,RU_t *ru) { LOG_D(PHY,"wakeupL1: passing parameter IC = %d, RX: %d.%d, TX: %d.%d to L1 sl_ahead = %d\n", L1_proc->instance_cnt, L1_proc->frame_rx, L1_proc->slot_rx, L1_proc->frame_tx, L1_proc->slot_tx, sl_ahead); + pthread_mutex_unlock( &L1_proc->mutex ); + // the thread can now be woken up if (pthread_cond_signal(&L1_proc->cond) != 0) { LOG_E( PHY, "[gNB] ERROR pthread_cond_signal for gNB RXn-TXnp4 thread\n"); @@ -576,8 +609,6 @@ int wakeup_rxtx(PHY_VARS_gNB *gNB,RU_t *ru) { return(-1); } - pthread_mutex_unlock( &L1_proc->mutex ); - return(0); } /* @@ -707,8 +738,8 @@ void init_gNB_proc(int inst) { L1_proc = &proc->L1_proc; L1_proc_tx = &proc->L1_proc_tx; - L1_proc->instance_cnt = -1; - L1_proc_tx->instance_cnt = -1; + L1_proc->instance_cnt = -2; + L1_proc_tx->instance_cnt = -2; L1_proc->instance_cnt_RUs = 0; L1_proc_tx->instance_cnt_RUs = 0; proc->instance_cnt_prach = -1; diff --git a/targets/RT/USER/nr-ru.c b/targets/RT/USER/nr-ru.c index fed7c1eb02..b6d3eb5316 100644 --- a/targets/RT/USER/nr-ru.c +++ b/targets/RT/USER/nr-ru.c @@ -754,7 +754,7 @@ void tx_rf(RU_t *ru) { if ((SF_type == SF_DL) || (SF_type == SF_S)) { - int siglen=fp->samples_per_slot>>1,flags=1; + int siglen=fp->samples_per_slot,flags=1; /* if (SF_type == SF_S) { @@ -1310,7 +1310,6 @@ static void* ru_thread_tx( void* param ) { if(!emulate_rf){ // do outgoing fronthaul (south) if needed if ((ru->fh_north_asynch_in == NULL) && (ru->fh_south_out)) ru->fh_south_out(ru); - if (ru->fh_north_out) ru->fh_north_out(ru); } else