debugging with USRP
This commit is contained in:
@@ -2491,6 +2491,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl
|
|||||||
if (subframe==9) {
|
if (subframe==9) {
|
||||||
subframe=0;
|
subframe=0;
|
||||||
frame++;
|
frame++;
|
||||||
|
frame&=1023;
|
||||||
}
|
}
|
||||||
else subframe++;
|
else subframe++;
|
||||||
|
|
||||||
@@ -2512,62 +2513,34 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl
|
|||||||
rxs = openair0.trx_read_func(&openair0,
|
rxs = openair0.trx_read_func(&openair0,
|
||||||
&proc->timestamp_rx,
|
&proc->timestamp_rx,
|
||||||
rxp,
|
rxp,
|
||||||
fp->samples_per_tti>>1,
|
fp->samples_per_tti,
|
||||||
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;
|
||||||
if (proc->first_rx == 0)
|
if (proc->first_rx == 0) {
|
||||||
AssertFatal(proc->subframe_rx == subframe, "Received Timestamp doesn't correspond to the time we think it is");
|
AssertFatal(proc->subframe_rx == subframe, "Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)",proc->subframe_rx,subframe);
|
||||||
|
AssertFatal(proc->frame_rx == frame, "Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)",proc->frame_rx,frame);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
proc->first_rx = 0;
|
proc->first_rx = 0;
|
||||||
|
|
||||||
|
// printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",proc->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe);
|
||||||
|
|
||||||
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 );
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, subframe );
|
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, subframe );
|
||||||
|
|
||||||
if (frame > 20){
|
|
||||||
if (rxs != fp->samples_per_tti>>1)
|
if (rxs != fp->samples_per_tti)
|
||||||
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
|
// 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);
|
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++)
|
remove_7_5_kHz(eNB,1+(subframe<<1));
|
||||||
|
for (l=0; l<fp->symbols_per_tti/2; l++) {
|
||||||
slot_fep_ul(fp,
|
slot_fep_ul(fp,
|
||||||
&eNB->common_vars,
|
&eNB->common_vars,
|
||||||
l,
|
l,
|
||||||
@@ -2575,35 +2548,18 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl
|
|||||||
0,
|
0,
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
|
|
||||||
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)];
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 );
|
|
||||||
rxs = openair0.trx_read_func(&openair0,
|
|
||||||
&proc->timestamp_rx,
|
|
||||||
rxp,
|
|
||||||
fp->samples_per_tti>>1,
|
|
||||||
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,
|
slot_fep_ul(fp,
|
||||||
&eNB->common_vars,
|
&eNB->common_vars,
|
||||||
l,
|
l,
|
||||||
(subframe<<1)+1,
|
1+(subframe<<1),
|
||||||
0,
|
0,
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,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);
|
||||||
//send_IF4(eNB,(subframe<<1)+1);
|
//send_IF4(eNB,(subframe<<1)+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -174,6 +174,8 @@ static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp,
|
|||||||
{
|
{
|
||||||
usrp_state_t *s = (usrp_state_t*)device->priv;
|
usrp_state_t *s = (usrp_state_t*)device->priv;
|
||||||
s->tx_md.time_spec = uhd::time_spec_t::from_ticks(timestamp, s->sample_rate);
|
s->tx_md.time_spec = uhd::time_spec_t::from_ticks(timestamp, s->sample_rate);
|
||||||
|
|
||||||
|
|
||||||
if(flags)
|
if(flags)
|
||||||
s->tx_md.has_time_spec = true;
|
s->tx_md.has_time_spec = true;
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ eNBs =
|
|||||||
tdd_config_s = 0;
|
tdd_config_s = 0;
|
||||||
prefix_type = "NORMAL";
|
prefix_type = "NORMAL";
|
||||||
eutra_band = 7;
|
eutra_band = 7;
|
||||||
downlink_frequency = 2680000000L;
|
downlink_frequency = 2660000000L;
|
||||||
uplink_frequency_offset = -120000000;
|
uplink_frequency_offset = -120000000;
|
||||||
Nid_cell = 0;
|
Nid_cell = 0;
|
||||||
N_RB_DL = 25;
|
N_RB_DL = 25;
|
||||||
@@ -64,15 +64,15 @@ eNBs =
|
|||||||
srs_ackNackST =;
|
srs_ackNackST =;
|
||||||
srs_MaxUpPts =;*/
|
srs_MaxUpPts =;*/
|
||||||
|
|
||||||
pusch_p0_Nominal = -90;
|
pusch_p0_Nominal = -96;
|
||||||
pusch_alpha = "AL1";
|
pusch_alpha = "AL1";
|
||||||
pucch_p0_Nominal = -96;
|
pucch_p0_Nominal = -103;
|
||||||
msg3_delta_Preamble = 6;
|
msg3_delta_Preamble = 6;
|
||||||
pucch_deltaF_Format1 = "deltaF2";
|
pucch_deltaF_Format1 = "deltaF2";
|
||||||
pucch_deltaF_Format1b = "deltaF3";
|
pucch_deltaF_Format1b = "deltaF3";
|
||||||
pucch_deltaF_Format2 = "deltaF0";
|
pucch_deltaF_Format2 = "deltaF0";
|
||||||
pucch_deltaF_Format2a = "deltaF0";
|
pucch_deltaF_Format2a = "deltaF0";
|
||||||
pucch_deltaF_Format2b = "deltaF0";
|
pucch_deltaF_Format2b = "deltaF0";
|
||||||
|
|
||||||
rach_numberOfRA_Preambles = 64;
|
rach_numberOfRA_Preambles = 64;
|
||||||
rach_preamblesGroupAConfig = "DISABLE";
|
rach_preamblesGroupAConfig = "DISABLE";
|
||||||
@@ -82,7 +82,7 @@ eNBs =
|
|||||||
rach_messagePowerOffsetGroupB = ;
|
rach_messagePowerOffsetGroupB = ;
|
||||||
*/
|
*/
|
||||||
rach_powerRampingStep = 4;
|
rach_powerRampingStep = 4;
|
||||||
rach_preambleInitialReceivedTargetPower = -108;
|
rach_preambleInitialReceivedTargetPower = -104;
|
||||||
rach_preambleTransMax = 10;
|
rach_preambleTransMax = 10;
|
||||||
rach_raResponseWindowSize = 10;
|
rach_raResponseWindowSize = 10;
|
||||||
rach_macContentionResolutionTimer = 48;
|
rach_macContentionResolutionTimer = 48;
|
||||||
@@ -130,7 +130,7 @@ eNBs =
|
|||||||
};
|
};
|
||||||
|
|
||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "192.168.12.11";
|
mme_ip_address = ( { ipv4 = "127.0.0.3";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
@@ -139,11 +139,11 @@ eNBs =
|
|||||||
|
|
||||||
NETWORK_INTERFACES :
|
NETWORK_INTERFACES :
|
||||||
{
|
{
|
||||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
ENB_INTERFACE_NAME_FOR_S1_MME = "lo";
|
||||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.213/24";
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24";
|
||||||
|
|
||||||
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
ENB_INTERFACE_NAME_FOR_S1U = "lo";
|
||||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.213/24";
|
ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24";
|
||||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+100
-40
@@ -167,10 +167,11 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB)
|
|||||||
|
|
||||||
unsigned int aa,slot_offset, slot_offset_F;
|
unsigned int aa,slot_offset, slot_offset_F;
|
||||||
int dummy_tx_b[7680*4] __attribute__((aligned(32)));
|
int dummy_tx_b[7680*4] __attribute__((aligned(32)));
|
||||||
int i, tx_offset;
|
int i,j, tx_offset;
|
||||||
int slot_sizeF = (phy_vars_eNB->frame_parms.ofdm_symbol_size)*
|
int slot_sizeF = (phy_vars_eNB->frame_parms.ofdm_symbol_size)*
|
||||||
((phy_vars_eNB->frame_parms.Ncp==1) ? 6 : 7);
|
((phy_vars_eNB->frame_parms.Ncp==1) ? 6 : 7);
|
||||||
int len;
|
int len,len2;
|
||||||
|
int16_t *txdata;
|
||||||
|
|
||||||
slot_offset_F = (subframe<<1)*slot_sizeF;
|
slot_offset_F = (subframe<<1)*slot_sizeF;
|
||||||
|
|
||||||
@@ -220,27 +221,52 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB)
|
|||||||
dummy_tx_b[i+2] = 0xff00;
|
dummy_tx_b[i+2] = 0xff00;
|
||||||
dummy_tx_b[i+3] = 0xff000000;
|
dummy_tx_b[i+3] = 0xff000000;
|
||||||
}*/
|
}*/
|
||||||
for (i=0; i<len; i++) {
|
|
||||||
tx_offset = (int)slot_offset+time_offset[aa]+i;
|
if (slot_offset+time_offset[aa]<0) {
|
||||||
|
txdata = (int16_t*)&phy_vars_eNB->common_vars.txdata[0][aa][(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti)+tx_offset];
|
||||||
|
len2 = -(slot_offset+time_offset[aa]);
|
||||||
|
len2 = (len2>len) ? len : len2;
|
||||||
|
for (i=0; i<(len2<<1); i++) {
|
||||||
|
txdata[i] = ((int16_t*)dummy_tx_b)[i]<<openair0_cfg[0].iq_txshift;
|
||||||
|
}
|
||||||
|
if (len2<len) {
|
||||||
|
txdata = (int16_t*)&phy_vars_eNB->common_vars.txdata[0][aa][0];
|
||||||
|
for (j=0; i<(len<<1); i++,j++) {
|
||||||
|
txdata[j++] = ((int16_t*)dummy_tx_b)[i]<<openair0_cfg[0].iq_txshift;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((slot_offset+time_offset[aa]+len)>(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti)) {
|
||||||
|
|
||||||
|
tx_offset = (int)slot_offset+time_offset[aa];
|
||||||
if (tx_offset<0)
|
txdata = (int16_t*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset];
|
||||||
tx_offset += LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti;
|
len2 = -tx_offset+LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti;
|
||||||
|
for (i=0; i<(len2<<1); i++) {
|
||||||
|
txdata[i] = ((int16_t*)dummy_tx_b)[i]<<openair0_cfg[0].iq_txshift;
|
||||||
|
}
|
||||||
|
txdata = (int16_t*)&phy_vars_eNB->common_vars.txdata[0][aa][0];
|
||||||
|
for (j=0; i<(len<<1); i++,j++) {
|
||||||
|
txdata[j++] = ((int16_t*)dummy_tx_b)[i]<<openair0_cfg[0].iq_txshift;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
tx_offset = (int)slot_offset+time_offset[aa];
|
||||||
|
txdata = (int16_t*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset];
|
||||||
|
|
||||||
if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti))
|
for (i=0; i<(len<<1); i++) {
|
||||||
tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti;
|
txdata[i] = ((int16_t*)dummy_tx_b)[i]<<openair0_cfg[0].iq_txshift;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[0] = ((short*)dummy_tx_b)[2*i]<<openair0_cfg[0].iq_txshift;
|
|
||||||
|
|
||||||
((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[1] = ((short*)dummy_tx_b)[2*i+1]<<openair0_cfg[0].iq_txshift;
|
|
||||||
}
|
|
||||||
// if S-subframe switch to RX in second subframe
|
// if S-subframe switch to RX in second subframe
|
||||||
|
/*
|
||||||
if (subframe_select(&phy_vars_eNB->frame_parms,subframe) == SF_S) {
|
if (subframe_select(&phy_vars_eNB->frame_parms,subframe) == SF_S) {
|
||||||
for (i=0; i<len; i++) {
|
for (i=0; i<len; i++) {
|
||||||
phy_vars_eNB->common_vars.txdata[0][aa][tx_offset++] = 0x00010001;
|
phy_vars_eNB->common_vars.txdata[0][aa][tx_offset++] = 0x00010001;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
if ((((phy_vars_eNB->frame_parms.tdd_config==0) ||
|
if ((((phy_vars_eNB->frame_parms.tdd_config==0) ||
|
||||||
(phy_vars_eNB->frame_parms.tdd_config==1) ||
|
(phy_vars_eNB->frame_parms.tdd_config==1) ||
|
||||||
(phy_vars_eNB->frame_parms.tdd_config==2) ||
|
(phy_vars_eNB->frame_parms.tdd_config==2) ||
|
||||||
@@ -420,12 +446,13 @@ static void* eNB_thread_tx( void* param )
|
|||||||
/* run PHY TX procedures the one after the other for all CCs to avoid race conditions
|
/* run PHY TX procedures the one after the other for all CCs to avoid race conditions
|
||||||
* (may be relaxed in the future for performance reasons)
|
* (may be relaxed in the future for performance reasons)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (pthread_mutex_lock(&sync_phy_proc.mutex_phy_proc_tx) != 0) {
|
if (pthread_mutex_lock(&sync_phy_proc.mutex_phy_proc_tx) != 0) {
|
||||||
LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX\n");
|
LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX\n");
|
||||||
exit_fun("nothing to add");
|
exit_fun("nothing to add");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* wait for our turn or oai_exit */
|
// wait for our turn or oai_exit
|
||||||
while (sync_phy_proc.phy_proc_CC_id != proc->CC_id && !oai_exit) {
|
while (sync_phy_proc.phy_proc_CC_id != proc->CC_id && !oai_exit) {
|
||||||
pthread_cond_wait(&sync_phy_proc.cond_phy_proc_tx,
|
pthread_cond_wait(&sync_phy_proc.cond_phy_proc_tx,
|
||||||
&sync_phy_proc.mutex_phy_proc_tx);
|
&sync_phy_proc.mutex_phy_proc_tx);
|
||||||
@@ -436,6 +463,7 @@ static void* eNB_thread_tx( void* param )
|
|||||||
exit_fun("nothing to add");
|
exit_fun("nothing to add");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, proc->frame_tx );
|
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, proc->frame_tx );
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX_ENB, proc->subframe_tx );
|
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX_ENB, proc->subframe_tx );
|
||||||
@@ -488,14 +516,15 @@ static void* eNB_thread_tx( void* param )
|
|||||||
for (i=0; i<PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx; i++)
|
for (i=0; i<PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx; i++)
|
||||||
txp[i] = (void*)&PHY_vars_eNB_g[0][0]->common_vars.txdata[0][i][proc->subframe_tx*PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti];
|
txp[i] = (void*)&PHY_vars_eNB_g[0][0]->common_vars.txdata[0][i][proc->subframe_tx*PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti];
|
||||||
// if symb_written < spp ==> error
|
// if symb_written < spp ==> error
|
||||||
if (proc->frame_tx > 50) {
|
openair0.trx_write_func(&openair0,
|
||||||
openair0.trx_write_func(&openair0,
|
(proc->timestamp_tx+openair0_cfg[0].tx_sample_advance),
|
||||||
(proc->timestamp_tx+openair0_cfg[0].tx_sample_advance),
|
txp,
|
||||||
txp,
|
PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti,
|
||||||
PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti,
|
PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx,
|
||||||
PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx,
|
1);
|
||||||
1);
|
|
||||||
}
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 );
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance)&0xffffffff );
|
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance)&0xffffffff );
|
||||||
@@ -658,7 +687,7 @@ static void* eNB_thread_rx( void* param )
|
|||||||
|
|
||||||
|
|
||||||
memset(&sparam, 0 , sizeof (sparam));
|
memset(&sparam, 0 , sizeof (sparam));
|
||||||
sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1;
|
sparam.sched_priority = sched_get_priority_max(SCHED_FIFO);
|
||||||
|
|
||||||
policy = SCHED_FIFO ;
|
policy = SCHED_FIFO ;
|
||||||
s = pthread_setschedparam(pthread_self(), policy, &sparam);
|
s = pthread_setschedparam(pthread_self(), policy, &sparam);
|
||||||
@@ -719,8 +748,10 @@ static void* eNB_thread_rx( void* param )
|
|||||||
if ((((fp->frame_type == TDD )&&(subframe_select(fp,proc->subframe_rx)==SF_UL)) ||
|
if ((((fp->frame_type == TDD )&&(subframe_select(fp,proc->subframe_rx)==SF_UL)) ||
|
||||||
(fp->frame_type == FDD))) {
|
(fp->frame_type == FDD))) {
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 1 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 1 );
|
||||||
// this spawns the prach and TX threads inside and updates the frame and subframe counters
|
// this spawns the prach inside and updates the frame and subframe counters
|
||||||
phy_procedures_eNB_common_RX(eNB, 0);
|
phy_procedures_eNB_common_RX(eNB, 0);
|
||||||
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 );
|
||||||
if (eNB->node_function != NGFI_RRU_IF4) {
|
if (eNB->node_function != NGFI_RRU_IF4) {
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 1 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 1 );
|
||||||
@@ -729,10 +760,39 @@ static void* eNB_thread_rx( void* param )
|
|||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 0 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 0 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((subframe_select(fp,proc->subframe_rx) == SF_S)) {
|
// wake up TX for subframe n+4
|
||||||
phy_procedures_eNB_S_RX(eNB, 0, no_relay );
|
// 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" );
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
int cnt_tx = ++proc->instance_cnt_tx;
|
||||||
|
// We have just received and processed the common part of a subframe, say n.
|
||||||
|
// TS_rx is the last received timestamp (start of 1st slot), TS_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 + (4*fp->samples_per_tti);
|
||||||
|
proc->frame_tx = (proc->frame_rx > 5) ? (proc->frame_rx+1)&1023 : proc->frame_rx;
|
||||||
|
proc->subframe_tx = (proc->subframe_rx + 4)%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" );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
LOG_W( PHY,"[eNB] Frame %d, eNB TX thread busy!! (cnt_tx %i)\n", proc->frame_tx, cnt_tx );
|
||||||
|
exit_fun( "TX thread busy" );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
stop_meas( &softmodem_stats_rx_sf );
|
stop_meas( &softmodem_stats_rx_sf );
|
||||||
#ifdef LOWLATENCY
|
#ifdef LOWLATENCY
|
||||||
@@ -747,17 +807,17 @@ static void* eNB_thread_rx( void* param )
|
|||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//stop_meas( &softmodem_stats_rx_sf[proc->thread_index] );
|
//stop_meas( &softmodem_stats_rx_sf[proc->thread_index] );
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0, 0 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0, 0 );
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG_THREADS
|
#ifdef DEBUG_THREADS
|
||||||
printf( "Exiting eNB thread RX\n");
|
printf( "Exiting eNB thread RX\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
eNB_thread_rx_status = 0;
|
eNB_thread_rx_status = 0;
|
||||||
return &eNB_thread_rx_status;
|
return &eNB_thread_rx_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -848,7 +908,7 @@ static void* eNB_thread_prach( void* param )
|
|||||||
|
|
||||||
|
|
||||||
memset(&sparam, 0 , sizeof (sparam));
|
memset(&sparam, 0 , sizeof (sparam));
|
||||||
sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1;
|
sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-2;
|
||||||
|
|
||||||
policy = SCHED_FIFO ;
|
policy = SCHED_FIFO ;
|
||||||
s = pthread_setschedparam(pthread_self(), policy, &sparam);
|
s = pthread_setschedparam(pthread_self(), policy, &sparam);
|
||||||
@@ -868,7 +928,7 @@ static void* eNB_thread_prach( void* param )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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(),
|
LOG_I( HW, "[SCHED][eNB] PRACH 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" :
|
||||||
@@ -962,7 +1022,7 @@ void init_eNB_proc(void)
|
|||||||
pthread_attr_setschedparam (&proc->attr_tx, &proc->sched_param_tx);
|
pthread_attr_setschedparam (&proc->attr_tx, &proc->sched_param_tx);
|
||||||
pthread_attr_setschedpolicy (&proc->attr_tx, SCHED_FIFO);
|
pthread_attr_setschedpolicy (&proc->attr_tx, SCHED_FIFO);
|
||||||
|
|
||||||
proc->sched_param_rx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY;
|
proc->sched_param_rx.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY;
|
||||||
pthread_attr_setschedparam (&proc->attr_rx, &proc->sched_param_rx);
|
pthread_attr_setschedparam (&proc->attr_rx, &proc->sched_param_rx);
|
||||||
pthread_attr_setschedpolicy (&proc->attr_rx, SCHED_FIFO);
|
pthread_attr_setschedpolicy (&proc->attr_rx, SCHED_FIFO);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user