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) {
|
||||
subframe=0;
|
||||
frame++;
|
||||
frame&=1023;
|
||||
}
|
||||
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,
|
||||
&proc->timestamp_rx,
|
||||
rxp,
|
||||
fp->samples_per_tti>>1,
|
||||
fp->samples_per_tti,
|
||||
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;
|
||||
if (proc->first_rx == 0)
|
||||
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 (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
|
||||
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_FRAME_NUMBER_RX_ENB, frame );
|
||||
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)
|
||||
exit_fun( "problem receiving samples" );
|
||||
}
|
||||
|
||||
if (rxs != fp->samples_per_tti)
|
||||
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++)
|
||||
remove_7_5_kHz(eNB,1+(subframe<<1));
|
||||
for (l=0; l<fp->symbols_per_tti/2; l++) {
|
||||
slot_fep_ul(fp,
|
||||
&eNB->common_vars,
|
||||
l,
|
||||
@@ -2575,35 +2548,18 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl
|
||||
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,
|
||||
&eNB->common_vars,
|
||||
l,
|
||||
(subframe<<1)+1,
|
||||
1+(subframe<<1),
|
||||
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) {
|
||||
//send_IF4(eNB,subframe<<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;
|
||||
s->tx_md.time_spec = uhd::time_spec_t::from_ticks(timestamp, s->sample_rate);
|
||||
|
||||
|
||||
if(flags)
|
||||
s->tx_md.has_time_spec = true;
|
||||
else
|
||||
|
||||
@@ -28,7 +28,7 @@ eNBs =
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 7;
|
||||
downlink_frequency = 2680000000L;
|
||||
downlink_frequency = 2660000000L;
|
||||
uplink_frequency_offset = -120000000;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 25;
|
||||
@@ -64,15 +64,15 @@ eNBs =
|
||||
srs_ackNackST =;
|
||||
srs_MaxUpPts =;*/
|
||||
|
||||
pusch_p0_Nominal = -90;
|
||||
pusch_alpha = "AL1";
|
||||
pucch_p0_Nominal = -96;
|
||||
msg3_delta_Preamble = 6;
|
||||
pucch_deltaF_Format1 = "deltaF2";
|
||||
pucch_deltaF_Format1b = "deltaF3";
|
||||
pucch_deltaF_Format2 = "deltaF0";
|
||||
pucch_deltaF_Format2a = "deltaF0";
|
||||
pucch_deltaF_Format2b = "deltaF0";
|
||||
pusch_p0_Nominal = -96;
|
||||
pusch_alpha = "AL1";
|
||||
pucch_p0_Nominal = -103;
|
||||
msg3_delta_Preamble = 6;
|
||||
pucch_deltaF_Format1 = "deltaF2";
|
||||
pucch_deltaF_Format1b = "deltaF3";
|
||||
pucch_deltaF_Format2 = "deltaF0";
|
||||
pucch_deltaF_Format2a = "deltaF0";
|
||||
pucch_deltaF_Format2b = "deltaF0";
|
||||
|
||||
rach_numberOfRA_Preambles = 64;
|
||||
rach_preamblesGroupAConfig = "DISABLE";
|
||||
@@ -82,7 +82,7 @@ eNBs =
|
||||
rach_messagePowerOffsetGroupB = ;
|
||||
*/
|
||||
rach_powerRampingStep = 4;
|
||||
rach_preambleInitialReceivedTargetPower = -108;
|
||||
rach_preambleInitialReceivedTargetPower = -104;
|
||||
rach_preambleTransMax = 10;
|
||||
rach_raResponseWindowSize = 10;
|
||||
rach_macContentionResolutionTimer = 48;
|
||||
@@ -130,7 +130,7 @@ eNBs =
|
||||
};
|
||||
|
||||
////////// MME parameters:
|
||||
mme_ip_address = ( { ipv4 = "192.168.12.11";
|
||||
mme_ip_address = ( { ipv4 = "127.0.0.3";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
@@ -139,11 +139,11 @@ eNBs =
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.213/24";
|
||||
ENB_INTERFACE_NAME_FOR_S1_MME = "lo";
|
||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24";
|
||||
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.213/24";
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "lo";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24";
|
||||
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;
|
||||
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)*
|
||||
((phy_vars_eNB->frame_parms.Ncp==1) ? 6 : 7);
|
||||
int len;
|
||||
int len,len2;
|
||||
int16_t *txdata;
|
||||
|
||||
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+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)) {
|
||||
|
||||
|
||||
if (tx_offset<0)
|
||||
tx_offset += LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti;
|
||||
tx_offset = (int)slot_offset+time_offset[aa];
|
||||
txdata = (int16_t*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset];
|
||||
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))
|
||||
tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti;
|
||||
for (i=0; i<(len<<1); i++) {
|
||||
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 (subframe_select(&phy_vars_eNB->frame_parms,subframe) == SF_S) {
|
||||
for (i=0; i<len; i++) {
|
||||
phy_vars_eNB->common_vars.txdata[0][aa][tx_offset++] = 0x00010001;
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
if ((((phy_vars_eNB->frame_parms.tdd_config==0) ||
|
||||
(phy_vars_eNB->frame_parms.tdd_config==1) ||
|
||||
(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
|
||||
* (may be relaxed in the future for performance reasons)
|
||||
*/
|
||||
|
||||
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");
|
||||
exit_fun("nothing to add");
|
||||
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) {
|
||||
pthread_cond_wait(&sync_phy_proc.cond_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");
|
||||
}
|
||||
|
||||
|
||||
|
||||
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 );
|
||||
@@ -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++)
|
||||
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 (proc->frame_tx > 50) {
|
||||
openair0.trx_write_func(&openair0,
|
||||
(proc->timestamp_tx+openair0_cfg[0].tx_sample_advance),
|
||||
txp,
|
||||
PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti,
|
||||
PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx,
|
||||
1);
|
||||
}
|
||||
openair0.trx_write_func(&openair0,
|
||||
(proc->timestamp_tx+openair0_cfg[0].tx_sample_advance),
|
||||
txp,
|
||||
PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti,
|
||||
PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx,
|
||||
1);
|
||||
|
||||
|
||||
|
||||
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 );
|
||||
@@ -658,7 +687,7 @@ static void* eNB_thread_rx( void* param )
|
||||
|
||||
|
||||
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 ;
|
||||
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)) ||
|
||||
(fp->frame_type == FDD))) {
|
||||
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);
|
||||
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 );
|
||||
if (eNB->node_function != NGFI_RRU_IF4) {
|
||||
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 );
|
||||
}
|
||||
}
|
||||
|
||||
if ((subframe_select(fp,proc->subframe_rx) == SF_S)) {
|
||||
phy_procedures_eNB_S_RX(eNB, 0, no_relay );
|
||||
|
||||
// wake up TX for subframe n+4
|
||||
// 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 );
|
||||
#ifdef LOWLATENCY
|
||||
@@ -747,17 +807,17 @@ static void* eNB_thread_rx( void* param )
|
||||
|
||||
|
||||
}
|
||||
|
||||
//stop_meas( &softmodem_stats_rx_sf[proc->thread_index] );
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0, 0 );
|
||||
|
||||
|
||||
|
||||
//stop_meas( &softmodem_stats_rx_sf[proc->thread_index] );
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0, 0 );
|
||||
|
||||
|
||||
#ifdef DEBUG_THREADS
|
||||
printf( "Exiting eNB thread RX\n");
|
||||
printf( "Exiting eNB thread RX\n");
|
||||
#endif
|
||||
|
||||
eNB_thread_rx_status = 0;
|
||||
return &eNB_thread_rx_status;
|
||||
|
||||
eNB_thread_rx_status = 0;
|
||||
return &eNB_thread_rx_status;
|
||||
}
|
||||
|
||||
|
||||
@@ -848,7 +908,7 @@ static void* eNB_thread_prach( void* param )
|
||||
|
||||
|
||||
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 ;
|
||||
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_RR) ? "SCHED_RR" :
|
||||
(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_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_setschedpolicy (&proc->attr_rx, SCHED_FIFO);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user