Commit a60e7013 authored by Raymond Knopp's avatar Raymond Knopp

bug fixing for new L1 scheduling, updates to vcd tracing

parent cbc4160b
...@@ -210,6 +210,8 @@ typedef struct { ...@@ -210,6 +210,8 @@ typedef struct {
pthread_t pthread_tx; pthread_t pthread_tx;
/// pthread structure for rx processing thread /// pthread structure for rx processing thread
pthread_t pthread_rx; pthread_t pthread_rx;
/// flag to indicate first RX acquisition
int first_rx;
/// pthread attributes for tx processing thread /// pthread attributes for tx processing thread
pthread_attr_t attr_tx; pthread_attr_t attr_tx;
/// pthread attributes for rx processing thread /// pthread attributes for rx processing thread
......
...@@ -2487,6 +2487,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl ...@@ -2487,6 +2487,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl
int subframe = proc->subframe_rx; int subframe = proc->subframe_rx;
int frame = proc->frame_rx; int frame = proc->frame_rx;
if (subframe==9) { if (subframe==9) {
subframe=0; subframe=0;
frame++; frame++;
...@@ -2515,7 +2516,10 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl ...@@ -2515,7 +2516,10 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl
fp->nb_antennas_rx); fp->nb_antennas_rx);
proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023;
proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10;
AssertFatal(proc->subframe_rx == subframe, "Received Timestamp doesn't correspond to the time we think it is"); if (proc->first_rx == 0)
AssertFatal(proc->subframe_rx == subframe, "Received Timestamp doesn't correspond to the time we think it is");
else
proc->first_rx = 0;
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff );
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, frame ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, frame );
...@@ -2526,7 +2530,42 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl ...@@ -2526,7 +2530,42 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl
exit_fun( "problem receiving samples" ); exit_fun( "problem receiving samples" );
} }
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 );
// wake up TX thread
// lock the TX mutex and make sure the thread is ready
if (pthread_mutex_lock(&proc->mutex_tx) != 0) {
LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", proc->instance_cnt_tx );
exit_fun( "error locking mutex_tx" );
return;
}
int cnt_tx = ++proc->instance_cnt_tx;
// We have just received and processed the common part of the first slot of a subframe, say n.
// TX_rx is the last received timestamp (start of 1st slot), TX_tx is the desired
// transmitted timestamp of the next TX slot (first).
// The last (TS_rx mod samples_per_frame) was n*samples_per_tti,
// we want to generate subframe (n+3), so TS_tx = TX_rx+3*samples_per_tti,
// and proc->subframe_tx = proc->subframe_rx+3
proc->timestamp_tx = proc->timestamp_rx + (3*fp->samples_per_tti);
proc->frame_tx = (subframe > 6) ? (frame+1) : frame;
proc->subframe_tx = (subframe + 3)%10;
pthread_mutex_unlock( &proc->mutex_tx );
if (cnt_tx == 0){
// the thread was presumably waiting where it should and can now be woken up
if (pthread_cond_signal(&proc->cond_tx) != 0) {
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TX thread\n");
exit_fun( "ERROR pthread_cond_signal" );
return;
}
} else {
LOG_W( PHY,"[eNB] Frame %d, eNB TX thread busy!! (cnt_tx %i)\n", frame, cnt_tx );
exit_fun( "TX thread busy" );
return;
}
// now do common RX processing for first slot in subframe
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1);
remove_7_5_kHz(eNB,subframe<<1); remove_7_5_kHz(eNB,subframe<<1);
for (l=0; l<fp->symbols_per_tti/2; l++) for (l=0; l<fp->symbols_per_tti/2; l++)
slot_fep_ul(fp, slot_fep_ul(fp,
...@@ -2540,6 +2579,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl ...@@ -2540,6 +2579,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl
if (eNB->node_function == NGFI_RRU_IF4) { if (eNB->node_function == NGFI_RRU_IF4) {
//send_IF4(eNB,subframe<<1); //send_IF4(eNB,subframe<<1);
} }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0);
for (i=0; i<fp->nb_antennas_rx; i++) for (i=0; i<fp->nb_antennas_rx; i++)
rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][(fp->samples_per_tti>>1)+(subframe*fp->samples_per_tti)]; rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][(fp->samples_per_tti>>1)+(subframe*fp->samples_per_tti)];
...@@ -2552,6 +2592,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl ...@@ -2552,6 +2592,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl
fp->nb_antennas_rx); fp->nb_antennas_rx);
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 );
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff );
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1);
remove_7_5_kHz(eNB,(subframe<<1)+1); remove_7_5_kHz(eNB,(subframe<<1)+1);
for (l=0; l<fp->symbols_per_tti/2; l++) for (l=0; l<fp->symbols_per_tti/2; l++)
slot_fep_ul(fp, slot_fep_ul(fp,
...@@ -2561,6 +2602,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl ...@@ -2561,6 +2602,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl
0, 0,
0 0
); );
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0);
if (eNB->node_function == NGFI_RRU_IF4) { if (eNB->node_function == NGFI_RRU_IF4) {
//send_IF4(eNB,(subframe<<1)+1); //send_IF4(eNB,(subframe<<1)+1);
} }
...@@ -2610,39 +2652,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl ...@@ -2610,39 +2652,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl
} }
// wake up TX thread
// lock the TX mutex and make sure the thread is ready
if (pthread_mutex_lock(&proc->mutex_tx) != 0) {
LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", proc->instance_cnt_tx );
exit_fun( "error locking mutex_tx" );
return;
}
int cnt_tx = ++proc->instance_cnt_tx;
// We have just received and processed the common part of an entire subframe, say n.
// TX_rx is the last received timestamp (start of 2nd slot), TX_tx is the desired
// transmitted timestamp of the next TX slot (first).
// The last (TS_rx mod samples_per_frame) was (n+.5)*samples_per_tti,
// we want to generate subframe (n+3), so TS_tx = TX_rx+2.5*samples_per_tti,
// and proc->subframe_tx = proc->subframe_rx+3
proc->timestamp_tx = proc->timestamp_rx + (fp->samples_per_tti<<1) + (fp->samples_per_tti>>1);
proc->frame_tx = (subframe > 6) ? (frame+1) : frame;
proc->subframe_tx = (subframe + 3)%10;
pthread_mutex_unlock( &proc->mutex_tx );
if (cnt_tx == 0){
// the thread was presumably waiting where it should and can now be woken up
if (pthread_cond_signal(&proc->cond_tx) != 0) {
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TX thread\n");
exit_fun( "ERROR pthread_cond_signal" );
return;
}
} else {
LOG_W( PHY,"[eNB] Frame %d, eNB TX thread busy!! (cnt_tx %i)\n", frame, cnt_tx );
exit_fun( "TX thread busy" );
return;
}
} }
......
...@@ -230,6 +230,7 @@ const char* eurecomFunctionsNames[] = { ...@@ -230,6 +230,7 @@ const char* eurecomFunctionsNames[] = {
"phy_procedures_eNb_rx", "phy_procedures_eNb_rx",
"phy_procedures_eNb_rx_common", "phy_procedures_eNb_rx_common",
"phy_procedures_eNb_rx_uespec", "phy_procedures_eNb_rx_uespec",
"phy_eNB_slot_fep",
"phy_procedures_ue_tx", "phy_procedures_ue_tx",
"phy_procedures_ue_rx", "phy_procedures_ue_rx",
"phy_procedures_eNB_lte", "phy_procedures_eNB_lte",
......
...@@ -204,6 +204,7 @@ typedef enum { ...@@ -204,6 +204,7 @@ typedef enum {
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON,
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC,
VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX,
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,
......
[*] [*]
[*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI [*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI
[*] Fri May 27 01:34:58 2016 [*] Sun May 29 20:10:01 2016
[*] [*]
[dumpfile] "/tmp/openair_dump_eNB.vcd" [dumpfile] "/tmp/openair_dump_eNB.vcd"
[dumpfile_mtime] "Fri May 27 01:33:50 2016" [dumpfile_mtime] "Sun May 29 20:07:25 2016"
[dumpfile_size] 12743642 [dumpfile_size] 16398004
[savefile] "/home/papillon/openairinterface5g/targets/RT/USER/eNB_usrp.gtkw" [savefile] "/home/papillon/openairinterface5g/targets/RT/USER/eNB_usrp.gtkw"
[timestart] 10801070000 [timestart] 10806270000
[size] 1535 845 [size] 1535 724
[pos] -1 -1 [pos] 309 0
*-21.793451 10817350000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 *-18.793451 10806918339 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
[sst_width] 284 [sst_width] 284
[signals_width] 254 [signals_width] 254
[sst_expanded] 1 [sst_expanded] 1
...@@ -28,10 +28,12 @@ variables.subframe_number_RX_eNB[63:0] ...@@ -28,10 +28,12 @@ variables.subframe_number_RX_eNB[63:0]
functions.eNB_thread_rx0 functions.eNB_thread_rx0
functions.eNB_thread_tx0 functions.eNB_thread_tx0
functions.phy_procedures_eNb_tx functions.phy_procedures_eNb_tx
@29
functions.phy_enb_sfgen functions.phy_enb_sfgen
@29
functions.phy_eNB_slot_fep
@28 @28
functions.phy_procedures_eNb_rx functions.phy_procedures_eNb_rx
functions.phy_enb_prach_rx
@24 @24
variables.dci_info[63:0] variables.dci_info[63:0]
variables.ue0_BO[63:0] variables.ue0_BO[63:0]
...@@ -46,8 +48,6 @@ functions.macxface_SR_indication ...@@ -46,8 +48,6 @@ functions.macxface_SR_indication
@420 @420
variables.ue0_SR_ENERGY[63:0] variables.ue0_SR_ENERGY[63:0]
variables.ue0_SR_THRES[63:0] variables.ue0_SR_THRES[63:0]
@24
variables.dci_info[63:0]
@28 @28
functions.phy_enb_ulsch_decoding0 functions.phy_enb_ulsch_decoding0
@24 @24
......
...@@ -372,7 +372,7 @@ static void* eNB_thread_tx( void* param ) ...@@ -372,7 +372,7 @@ static void* eNB_thread_tx( void* param )
} }
LOG_I( HW, "[SCHED][eNB] TX thread %d started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n",sched_getcpu(),gettid(), LOG_I( HW, "[SCHED][eNB] TX thread started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n",sched_getcpu(),gettid(),
(policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_FIFO) ? "SCHED_FIFO" :
(policy == SCHED_RR) ? "SCHED_RR" : (policy == SCHED_RR) ? "SCHED_RR" :
(policy == SCHED_OTHER) ? "SCHED_OTHER" : (policy == SCHED_OTHER) ? "SCHED_OTHER" :
...@@ -868,7 +868,7 @@ static void* eNB_thread_prach( void* param ) ...@@ -868,7 +868,7 @@ static void* eNB_thread_prach( void* param )
} }
LOG_I( HW, "[SCHED][eNB] RX thread %d started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), LOG_I( HW, "[SCHED][eNB] RX thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(),
(policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_FIFO) ? "SCHED_FIFO" :
(policy == SCHED_RR) ? "SCHED_RR" : (policy == SCHED_RR) ? "SCHED_RR" :
(policy == SCHED_OTHER) ? "SCHED_OTHER" : (policy == SCHED_OTHER) ? "SCHED_OTHER" :
...@@ -975,6 +975,9 @@ void init_eNB_proc(void) ...@@ -975,6 +975,9 @@ void init_eNB_proc(void)
proc->instance_cnt_tx = -1; proc->instance_cnt_tx = -1;
proc->instance_cnt_prach = -1; proc->instance_cnt_prach = -1;
proc->CC_id = CC_id; proc->CC_id = CC_id;
proc->first_rx=1;
pthread_mutex_init( &proc->mutex_tx, NULL); pthread_mutex_init( &proc->mutex_tx, NULL);
pthread_cond_init( &proc->cond_tx, NULL); pthread_cond_init( &proc->cond_tx, NULL);
pthread_cond_init( &proc->cond_prach, NULL); pthread_cond_init( &proc->cond_prach, NULL);
......
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