From 6500aa716a507a14b0fe2cf43a7b6b7a39bd94e3 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger <florian.kaltenberger@eurecom.fr> Date: Tue, 10 Feb 2015 15:43:38 +0000 Subject: [PATCH] added RTAI support for UE git-svn-id: http://svn.eurecom.fr/openair4G/trunk@6509 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- targets/RT/USER/lte-softmodem.c | 138 +++++++++++++++----------------- 1 file changed, 63 insertions(+), 75 deletions(-) diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index b4d531c44a..702f894045 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -170,19 +170,15 @@ unsigned char scope_enb_num_ue = 1; #endif //XFORMS #ifdef RTAI -static SEM *mutex; -//static CND *cond; - static long main_eNB_thread; static long main_ue_thread; -static SEM *sync_sem; // to sync rx & tx streaming - -//static int sync_thread; #else pthread_t main_eNB_thread; pthread_t main_ue_thread; + pthread_attr_t attr_dlsch_threads; pthread_attr_t attr_UE_thread; +#endif #ifndef LOWLATENCY struct sched_param sched_param_dlsch; @@ -191,7 +187,6 @@ struct sched_param sched_param_dlsch; pthread_cond_t sync_cond; pthread_mutex_t sync_mutex; int sync_var=-1; -#endif RTIME T0; @@ -378,15 +373,15 @@ void print_opp_meas(void); int transmission_mode=1; -int16_t glog_level = LOG_DEBUG; +int16_t glog_level = LOG_INFO; int16_t glog_verbosity = LOG_MED; int16_t hw_log_level = LOG_INFO; int16_t hw_log_verbosity = LOG_MED; -int16_t phy_log_level = LOG_DEBUG; +int16_t phy_log_level = LOG_INFO; int16_t phy_log_verbosity = LOG_MED; -int16_t mac_log_level = LOG_DEBUG; +int16_t mac_log_level = LOG_INFO; int16_t mac_log_verbosity = LOG_MED; -int16_t rlc_log_level = LOG_DEBUG; +int16_t rlc_log_level = LOG_INFO; int16_t rlc_log_verbosity = LOG_MED; int16_t pdcp_log_level = LOG_INFO; int16_t pdcp_log_verbosity = LOG_MED; @@ -1461,7 +1456,7 @@ static void *eNB_thread(void *arg) */ #ifdef RTAI - task = rt_task_init_schmod(nam2num("TASK0"), 0, 0, 0, SCHED_FIFO, 0xF); + task = rt_task_init_schmod(nam2num("eNBmain"), 0, 0, 0, SCHED_FIFO, 0xF); #else #ifdef LOWLATENCY attr.size = sizeof(attr); @@ -1513,15 +1508,11 @@ static void *eNB_thread(void *arg) timing_info.n_samples = 0; printf("waiting for sync (eNB_thread)\n"); -#ifdef RTAI - rt_sem_wait(sync_sem); -#else pthread_mutex_lock(&sync_mutex); while (sync_var<0) pthread_cond_wait(&sync_cond, &sync_mutex); pthread_mutex_unlock(&sync_mutex); -#endif - // printf("starting eNB thread @ %llu\n",get_usrp_time(&openair0)); + printf("starting eNB thread\n"); while (!oai_exit) { start_meas(&softmodem_stats_mt); @@ -1836,20 +1827,23 @@ static void *UE_thread_synch(void *arg) { int current_offset = 0; sync_mode_t sync_mode = pss; +#ifdef RTAI + RT_TASK *task = rt_task_init_schmod(nam2num("UEsync"), 0, 0, 0, SCHED_FIFO, 0xF); + if (task==NULL) { + LOG_E(PHY,"[SCHED][UE] Problem starting UE_sync_thread!!!!\n"); + return 0; + } +#endif + UE->is_synchronized = 0; printf("UE_thread_sync in with PHY_vars_UE %p\n",arg); printf("waiting for sync (UE_thread_synch) \n"); -#ifdef RTAI - rt_sem_wait(sync_sem); -#else - pthread_mutex_lock(&sync_mutex); printf("Locked sync_mutex, waiting (UE_sync_thread)\n"); while (sync_var<0) pthread_cond_wait(&sync_cond, &sync_mutex); pthread_mutex_unlock(&sync_mutex); printf("unlocked sync_mutex (UE_sync_thread)\n"); -#endif printf("starting UE synch thread\n"); if (UE_scan == 1) { @@ -2019,9 +2013,13 @@ break; static void *UE_thread_tx(void *arg) { +#ifdef RTAI + RT_TASK *task; +#else #ifdef LOWLATENCY struct sched_attr attr; unsigned int flags = 0; +#endif #endif int ret; @@ -2029,6 +2027,13 @@ static void *UE_thread_tx(void *arg) { UE->instance_cnt_tx=-1; +#ifdef RTAI + task = rt_task_init_schmod(nam2num("UETX"), 0, 0, 0, SCHED_FIFO, 0xF); + if (task==NULL) { + LOG_E(PHY,"[SCHED][UE] Problem starting UE_thread_TX!!!!\n"); + return 0; + } +#else #ifdef LOWLATENCY attr.size = sizeof(attr); attr.sched_flags = 0; @@ -2046,22 +2051,16 @@ static void *UE_thread_tx(void *arg) { perror("[SCHED] eNB tx thread: sched_setattr failed\n"); exit(-1); } +#endif #endif -#ifndef EXMIMO printf("waiting for sync (UE_thread_tx)\n"); -#ifdef RTAI - rt_sem_wait(sync_sem); -#else pthread_mutex_lock(&sync_mutex); printf("Locked sync_mutex, waiting (UE_thread_tx)\n"); while (sync_var<0) pthread_cond_wait(&sync_cond, &sync_mutex); pthread_mutex_unlock(&sync_mutex); printf("unlocked sync_mutex, waiting (UE_thread_tx)\n"); -#endif -#endif - printf("Starting UE TX thread\n"); mlockall(MCL_CURRENT | MCL_FUTURE); @@ -2150,13 +2149,24 @@ static void *UE_thread_rx(void *arg) { int i; int ret; +#ifdef RTAI + RT_TASK *task; +#else #ifdef LOWLATENCY struct sched_attr attr; unsigned int flags = 0; +#endif #endif UE->instance_cnt_rx=-1; +#ifdef RTAI + task = rt_task_init_schmod(nam2num("UERX"), 0, 0, 0, SCHED_FIFO, 0xF); + if (task==NULL) { + LOG_E(PHY,"[SCHED][UE] Problem starting UE_thread_RX!!!!\n"); + return 0; + } +#else #ifdef LOWLATENCY attr.size = sizeof(attr); attr.sched_flags = 0; @@ -2174,23 +2184,17 @@ static void *UE_thread_rx(void *arg) { exit(-1); } #endif - +#endif + mlockall(MCL_CURRENT | MCL_FUTURE); -#ifndef EXMIMO printf("waiting for sync (UE_thread_rx)\n"); -#ifdef RTAI - rt_sem_wait(sync_sem); -#else pthread_mutex_lock(&sync_mutex); printf("Locked sync_mutex, waiting (UE_thread_rx)\n"); while (sync_var<0) pthread_cond_wait(&sync_cond, &sync_mutex); pthread_mutex_unlock(&sync_mutex); printf("unlocked sync_mutex, waiting (UE_thread_rx)\n"); -#endif -#endif - printf("Starting UE RX thread\n"); while (!oai_exit) { @@ -2301,6 +2305,9 @@ static void *UE_thread(void *arg) { unsigned int rxs; void *rxp[2],*txp[2]; +#ifdef RTAI + RT_TASK *task; +#else /* #ifdef LOWLATENCY struct sched_attr attr; @@ -2308,20 +2315,24 @@ static void *UE_thread(void *arg) { unsigned long mask = 1; // processor 0 #endif */ +#endif printf("waiting for sync (UE_thread)\n"); -#ifdef RTAI - rt_sem_wait(sync_sem); -#else pthread_mutex_lock(&sync_mutex); printf("Locked sync_mutex, waiting (UE_thread)\n"); while (sync_var<0) pthread_cond_wait(&sync_cond, &sync_mutex); pthread_mutex_unlock(&sync_mutex); printf("unlocked sync_mutex, waiting (UE_thread)\n"); -#endif - printf("starting UE thread\n"); + +#ifdef RTAI + task = rt_task_init_schmod(nam2num("UEmain"), 0, 0, 0, SCHED_FIFO, 0xF); + if (task==NULL) { + LOG_E(PHY,"[SCHED][UE] Problem starting main UE_thread!!!!\n"); + return 0; + } +#else /* #ifdef LOWLATENCY attr.size = sizeof(attr); @@ -2349,6 +2360,8 @@ static void *UE_thread(void *arg) { } #endif */ +#endif + mlockall(MCL_CURRENT | MCL_FUTURE); T0 = rt_get_time_ns(); @@ -2529,7 +2542,7 @@ static void *UE_thread(void *arg) { } return(0); } -#endif +#endif //#ifndef EXMIMO @@ -2560,17 +2573,12 @@ static void *UE_thread(void *arg) { #endif printf("waiting for sync (UE_thread)\n"); -#ifdef RTAI - rt_sem_wait(sync_sem); -#else pthread_mutex_lock(&sync_mutex); printf("Locked sync_mutex, waiting (UE_thread)\n"); while (sync_var<0) pthread_cond_wait(&sync_cond, &sync_mutex); pthread_mutex_unlock(&sync_mutex); printf("unlocked sync_mutex, waiting (UE_thread)\n"); -#endif - printf("starting UE thread\n"); #if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME) @@ -2579,7 +2587,7 @@ static void *UE_thread(void *arg) { #endif #ifdef RTAI - task = rt_task_init_schmod(nam2num("TASK0"), 0, 0, 0, SCHED_FIFO, 0xF); + task = rt_task_init_schmod(nam2num("UEmain"), 0, 0, 0, SCHED_FIFO, 0xF); LOG_D(HW,"Started UE thread (id %p)\n",task); #endif @@ -3696,7 +3704,7 @@ int main(int argc, char **argv) { sf_bounds = sf_bounds_5; sf_bounds_tx = sf_bounds_5_tx; max_cnt = 75; - tx_delay = 5; + tx_delay = 6; #endif } else if (frame_parms[0]->N_RB_DL == 6) { @@ -3888,7 +3896,7 @@ int main(int argc, char **argv) { #ifdef RTAI // make main thread LXRT soft realtime - /* task = */ rt_task_init_schmod(nam2num("MYTASK"), 9, 0, 0, SCHED_FIFO, 0xF); + /* task = */ rt_task_init_schmod(nam2num("MAIN"), 9, 0, 0, SCHED_FIFO, 0xF); // start realtime timer and scheduler //rt_set_oneshot_mode(); @@ -3897,26 +3905,10 @@ int main(int argc, char **argv) { //now = rt_get_time() + 10*PERIOD; //rt_task_make_periodic(task, now, PERIOD); +#endif - printf("Init mutex\n"); - //mutex = rt_get_adr(nam2num("MUTEX")); - mutex = rt_sem_init(nam2num("MUTEX"), 1); - if (mutex==0) - { - printf("Error init mutex\n"); - exit(-1); - } - else - printf("mutex=%p\n",mutex); - - sync_sem = rt_typed_sem_init(nam2num("syncsem"), 0, BIN_SEM|FIFO_Q); - if(sync_sem == 0) - printf("error init sync semphore\n"); - -#else pthread_cond_init(&sync_cond,NULL); pthread_mutex_init(&sync_mutex, NULL); -#endif #if defined(ENABLE_ITTI) // Wait for eNB application initialization to be complete (eNB registration to MME) @@ -4017,7 +4009,7 @@ int main(int argc, char **argv) { rt_sleep_ns(FRAME_PERIOD/10); init_dlsch_threads(); #endif - printf("UE threads created\n"); + sleep(1); #ifdef RTAI main_ue_thread = rt_thread_create(UE_thread, NULL, 100000000); @@ -4031,6 +4023,7 @@ int main(int argc, char **argv) { LOG_D(HW,"[lte-softmodem.c] Allocate UE_thread successful\n"); } #endif + printf("UE threads created\n"); } else { @@ -4064,15 +4057,11 @@ int main(int argc, char **argv) { #endif #endif -#ifdef RTAI - rt_sem_signal(sync_sem); -#else + printf("Starting all threads\n"); pthread_mutex_lock(&sync_mutex); - printf("Sending sync ...\n"); sync_var=0; pthread_cond_broadcast(&sync_cond); pthread_mutex_unlock(&sync_mutex); -#endif // wait for end of program printf("TYPE <CTRL-C> TO TERMINATE\n"); @@ -4149,7 +4138,6 @@ int main(int argc, char **argv) { #endif #ifdef RTAI - rt_sem_delete(sync_sem); stop_rt_timer(); #else pthread_cond_destroy(&sync_cond); -- GitLab