bug fixing for new L1 scheduling, updates to vcd tracing
This commit is contained in:
@@ -210,6 +210,8 @@ typedef struct {
|
||||
pthread_t pthread_tx;
|
||||
/// pthread structure for rx processing thread
|
||||
pthread_t pthread_rx;
|
||||
/// flag to indicate first RX acquisition
|
||||
int first_rx;
|
||||
/// pthread attributes for tx processing thread
|
||||
pthread_attr_t attr_tx;
|
||||
/// 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
|
||||
int subframe = proc->subframe_rx;
|
||||
int frame = proc->frame_rx;
|
||||
|
||||
|
||||
if (subframe==9) {
|
||||
subframe=0;
|
||||
frame++;
|
||||
@@ -2515,7 +2516,10 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl
|
||||
fp->nb_antennas_rx);
|
||||
proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023;
|
||||
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_FRAME_NUMBER_RX_ENB, frame );
|
||||
@@ -2526,7 +2530,42 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl
|
||||
exit_fun( "problem receiving samples" );
|
||||
}
|
||||
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);
|
||||
for (l=0; l<fp->symbols_per_tti/2; l++)
|
||||
slot_fep_ul(fp,
|
||||
@@ -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) {
|
||||
//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++)
|
||||
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
|
||||
fp->nb_antennas_rx);
|
||||
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_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1);
|
||||
remove_7_5_kHz(eNB,(subframe<<1)+1);
|
||||
for (l=0; l<fp->symbols_per_tti/2; l++)
|
||||
slot_fep_ul(fp,
|
||||
@@ -2561,6 +2602,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl
|
||||
0,
|
||||
0
|
||||
);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0);
|
||||
if (eNB->node_function == NGFI_RRU_IF4) {
|
||||
//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
|
||||
|
||||
}
|
||||
|
||||
// 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[] = {
|
||||
"phy_procedures_eNb_rx",
|
||||
"phy_procedures_eNb_rx_common",
|
||||
"phy_procedures_eNb_rx_uespec",
|
||||
"phy_eNB_slot_fep",
|
||||
"phy_procedures_ue_tx",
|
||||
"phy_procedures_ue_rx",
|
||||
"phy_procedures_eNB_lte",
|
||||
|
||||
@@ -204,6 +204,7 @@ typedef enum {
|
||||
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_UESPEC,
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX,
|
||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
[*]
|
||||
[*] 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_mtime] "Fri May 27 01:33:50 2016"
|
||||
[dumpfile_size] 12743642
|
||||
[dumpfile_mtime] "Sun May 29 20:07:25 2016"
|
||||
[dumpfile_size] 16398004
|
||||
[savefile] "/home/papillon/openairinterface5g/targets/RT/USER/eNB_usrp.gtkw"
|
||||
[timestart] 10801070000
|
||||
[size] 1535 845
|
||||
[pos] -1 -1
|
||||
*-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
|
||||
[timestart] 10806270000
|
||||
[size] 1535 724
|
||||
[pos] 309 0
|
||||
*-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
|
||||
[signals_width] 254
|
||||
[sst_expanded] 1
|
||||
@@ -28,10 +28,12 @@ variables.subframe_number_RX_eNB[63:0]
|
||||
functions.eNB_thread_rx0
|
||||
functions.eNB_thread_tx0
|
||||
functions.phy_procedures_eNb_tx
|
||||
@29
|
||||
functions.phy_enb_sfgen
|
||||
@29
|
||||
functions.phy_eNB_slot_fep
|
||||
@28
|
||||
functions.phy_procedures_eNb_rx
|
||||
functions.phy_enb_prach_rx
|
||||
@24
|
||||
variables.dci_info[63:0]
|
||||
variables.ue0_BO[63:0]
|
||||
@@ -46,8 +48,6 @@ functions.macxface_SR_indication
|
||||
@420
|
||||
variables.ue0_SR_ENERGY[63:0]
|
||||
variables.ue0_SR_THRES[63:0]
|
||||
@24
|
||||
variables.dci_info[63:0]
|
||||
@28
|
||||
functions.phy_enb_ulsch_decoding0
|
||||
@24
|
||||
|
||||
@@ -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_RR) ? "SCHED_RR" :
|
||||
(policy == SCHED_OTHER) ? "SCHED_OTHER" :
|
||||
@@ -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_RR) ? "SCHED_RR" :
|
||||
(policy == SCHED_OTHER) ? "SCHED_OTHER" :
|
||||
@@ -975,6 +975,9 @@ void init_eNB_proc(void)
|
||||
proc->instance_cnt_tx = -1;
|
||||
proc->instance_cnt_prach = -1;
|
||||
proc->CC_id = CC_id;
|
||||
|
||||
proc->first_rx=1;
|
||||
|
||||
pthread_mutex_init( &proc->mutex_tx, NULL);
|
||||
pthread_cond_init( &proc->cond_tx, NULL);
|
||||
pthread_cond_init( &proc->cond_prach, NULL);
|
||||
|
||||
Reference in New Issue
Block a user