From a373ab3a151c49f6037d3bec8529421d196d6e98 Mon Sep 17 00:00:00 2001 From: knopp <knopp@mycompany.com> Date: Mon, 13 Jul 2015 15:38:59 +0000 Subject: [PATCH] proper scheduling priorities for SCHED_DEADLINE in lte-ue.c git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7701 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- targets/RT/USER/lte-ue.c | 93 +++++++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 35 deletions(-) diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index a5b7d5d4dc7..5c9bf13504f 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -436,6 +436,13 @@ static void *UE_thread_synch(void *arg) } else { UE->is_synchronized = 1; + + if( UE->mode == rx_dump_frame ){ + write_output("rxsig_frame0.m","rxsf0", &UE->lte_ue_common_vars.rxdata[0][0],10*UE->lte_frame_parms.samples_per_tti,1,1); + LOG_I(PHY,"Dummping Frame ... bye bye \n"); + exit(0); + } + #ifndef EXMIMO UE->slot_rx = 0; UE->slot_tx = 4; @@ -572,7 +579,7 @@ static void *UE_thread_tx(void *arg) attr.size = sizeof(attr); attr.sched_flags = 0; attr.sched_nice = 0; - attr.sched_priority = sched_get_priority_max(SCHED_DEADLINE)-1; + attr.sched_priority = 0; /* This creates a 1ms reservation every 10ms period*/ attr.sched_policy = SCHED_DEADLINE; @@ -721,7 +728,7 @@ static void *UE_thread_rx(void *arg) attr.size = sizeof(attr); attr.sched_flags = 0; attr.sched_nice = 0; - attr.sched_priority = sched_get_priority_max(SCHED_DEADLINE)-1; + attr.sched_priority = 0; // This creates a .5ms reservation every 1ms period attr.sched_policy = SCHED_DEADLINE; @@ -888,7 +895,6 @@ static void *UE_thread_rx(void *arg) } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RX, 0 ); - if (pthread_mutex_lock(&UE->mutex_rx) != 0) { LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RX\n" ); exit_fun("noting to add"); @@ -962,7 +968,7 @@ void *UE_thread(void *arg) attr.size = sizeof(attr); attr.sched_flags = 0; attr.sched_nice = 0; - attr.sched_priority = sched_get_priority_max(SCHED_DEADLINE); + attr.sched_priority = 0;//sched_get_priority_max(SCHED_DEADLINE); // This creates a .5 ms reservation attr.sched_policy = SCHED_DEADLINE; @@ -1005,9 +1011,11 @@ void *UE_thread(void *arg) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_DUMMY_DUMP, dummy_dump ); + while (rxpos < (1+hw_subframe)*UE->lte_frame_parms.samples_per_tti) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); + #ifndef USRP_DEBUG DevAssert( UE->lte_frame_parms.nb_antennas_rx <= 2 ); @@ -1019,15 +1027,17 @@ void *UE_thread(void *arg) /* if (dummy_dump == 0) printf("writing %d samples to %d (first_rx %d)\n",spp - ((first_rx==1) ? rx_off_diff : 0),rxpos,first_rx); */ - rxs = openair0.trx_read_func(&openair0, - ×tamp, - rxp, - spp - ((first_rx==1) ? rx_off_diff : 0), - UE->lte_frame_parms.nb_antennas_rx); - - if (rxs != (spp- ((first_rx==1) ? rx_off_diff : 0))) { - exit_fun("problem in rx"); - return &UE_thread_retval; + if (UE->mode != loop_through_memory) { + rxs = openair0.trx_read_func(&openair0, + ×tamp, + rxp, + spp - ((first_rx==1) ? rx_off_diff : 0), + UE->lte_frame_parms.nb_antennas_rx); + + if (rxs != (spp- ((first_rx==1) ? rx_off_diff : 0))) { + exit_fun("problem in rx"); + return &UE_thread_retval; + } } if (rx_off_diff !=0) @@ -1036,7 +1046,7 @@ void *UE_thread(void *arg) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); // Transmit TX buffer based on timestamp from RX - if (tx_enabled) { + if ((tx_enabled) && (UE->mode!=loop_through_memory)) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); DevAssert( UE->lte_frame_parms.nb_antennas_tx <= 2 ); @@ -1054,7 +1064,8 @@ void *UE_thread(void *arg) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); } - + else if (UE->mode == loop_through_memory) + rt_sleep_ns(1000000); #else // define USRP_DEBUG is active rt_sleep_ns(1000000); @@ -1095,13 +1106,18 @@ void *UE_thread(void *arg) if (instance_cnt_rx == 0) { + LOG_D(HW,"signalling rx thread to wake up, hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 ); if (pthread_cond_signal(&UE->cond_rx) != 0) { LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE RX thread\n" ); exit_fun("nothing to add"); return &UE_thread_retval; } - + LOG_D(HW,"signalled rx thread to wake up, hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 ); + if (UE->mode == loop_through_memory) { + printf("Processing subframe %d",UE->slot_rx>>1); + getchar(); + } if (UE->mode == rx_calib_ue) { if (frame == 10) { @@ -1128,13 +1144,15 @@ void *UE_thread(void *arg) return &UE_thread_retval; } - if (pthread_mutex_lock(&UE->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][UE] error locking mutex for UE TX thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } + if ((tx_enabled)&&(UE->mode != loop_through_memory)) { + + if (pthread_mutex_lock(&UE->mutex_tx) != 0) { + LOG_E( PHY, "[SCHED][UE] error locking mutex for UE TX thread\n" ); + exit_fun("nothing to add"); + return &UE_thread_retval; + } + - if (tx_enabled) { int instance_cnt_tx = ++UE->instance_cnt_tx; if (pthread_mutex_unlock(&UE->mutex_tx) != 0) { @@ -1227,20 +1245,25 @@ void *UE_thread(void *arg) // dump ahead in time to start of frame #ifndef USRP_DEBUG - rxs = openair0.trx_read_func(&openair0, - ×tamp, - (void**)rxdata, - UE->rx_offset, - UE->lte_frame_parms.nb_antennas_rx); - if (rxs != UE->rx_offset) { - exit_fun("problem in rx"); - return &UE_thread_retval; + if (UE->mode != loop_through_memory) { + rxs = openair0.trx_read_func(&openair0, + ×tamp, + (void**)rxdata, + UE->rx_offset, + UE->lte_frame_parms.nb_antennas_rx); + if (rxs != UE->rx_offset) { + exit_fun("problem in rx"); + return &UE_thread_retval; + } + UE->rx_offset=0; + tx_enabled = 1; } + else + rt_sleep_ns(1000000); #else rt_sleep_ns(10000000); #endif - UE->rx_offset=0; - tx_enabled = 1; + } else if ((UE->rx_offset<(FRAME_LENGTH_COMPLEX_SAMPLES/2)) && (UE->rx_offset > RX_OFF_MIN) && (start_rx_stream==1) && @@ -1253,7 +1276,7 @@ void *UE_thread(void *arg) (start_rx_stream==1) && (rx_correction_timer == 0)) { // moving to the left so drop rx_off_diff samples rx_off_diff = FRAME_LENGTH_COMPLEX_SAMPLES - RX_OFF_MIN - UE->rx_offset; - LOG_D(PHY,"UE->rx_offset %d < %d, diff %d\n",UE->rx_offset,FRAME_LENGTH_COMPLEX_SAMPLES-RX_OFF_MIN,rx_off_diff);(UE->rx_offset>(FRAME_LENGTH_COMPLEX_SAMPLES/2)); + LOG_D(PHY,"UE->rx_offset %d < %d, diff %d\n",UE->rx_offset,FRAME_LENGTH_COMPLEX_SAMPLES-RX_OFF_MIN,rx_off_diff); rx_correction_timer = 5; } @@ -1326,7 +1349,7 @@ void *UE_thread(void *arg) attr.size = sizeof(attr); attr.sched_flags = 0; attr.sched_nice = 0; - attr.sched_priority = sched_get_priority_max(SCHED_DEADLINE); + attr.sched_priority = 0; // This creates a .25 ms reservation attr.sched_policy = SCHED_DEADLINE; @@ -1756,7 +1779,7 @@ int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, if (phy_vars_ue[CC_id]) { frame_parms = &(phy_vars_ue[CC_id]->lte_frame_parms); } else { - printf("phy_vars_eNB[%d] not initialized\n", CC_id); + printf("phy_vars_UE[%d] not initialized\n", CC_id); return(-1); } -- GitLab