Pipeline process
thread1: RX thread2: TX
This commit is contained in:
+47
-57
@@ -316,7 +316,16 @@ static void UE_synch(void *arg) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void processSlotTX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
typedef struct processingData_s {
|
||||||
|
UE_nr_rxtx_proc_t proc;
|
||||||
|
PHY_VARS_NR_UE *UE;
|
||||||
|
} processingData_t;
|
||||||
|
|
||||||
|
void processSlotTX(void *arg) {
|
||||||
|
|
||||||
|
processingData_t *rxtxD = (processingData_t *) arg;
|
||||||
|
UE_nr_rxtx_proc_t *proc = &rxtxD->proc;
|
||||||
|
PHY_VARS_NR_UE *UE = rxtxD->UE;
|
||||||
fapi_nr_config_request_t *cfg = &UE->nrUE_config;
|
fapi_nr_config_request_t *cfg = &UE->nrUE_config;
|
||||||
int tx_slot_type = nr_ue_slot_select(cfg, proc->frame_tx, proc->nr_slot_tx);
|
int tx_slot_type = nr_ue_slot_select(cfg, proc->frame_tx, proc->nr_slot_tx);
|
||||||
uint8_t gNB_id = 0;
|
uint8_t gNB_id = 0;
|
||||||
@@ -345,10 +354,14 @@ void processSlotTX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
|||||||
phy_procedures_nrUE_TX(UE,proc,0);
|
phy_procedures_nrUE_TX(UE,proc,0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ue_ta_procedures(UE, proc->nr_slot_tx, proc->frame_tx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
void processSlotRX(void *arg) {
|
||||||
|
|
||||||
|
processingData_t *rxtxD = (processingData_t *) arg;
|
||||||
|
UE_nr_rxtx_proc_t *proc = &rxtxD->proc;
|
||||||
|
PHY_VARS_NR_UE *UE = rxtxD->UE;
|
||||||
fapi_nr_config_request_t *cfg = &UE->nrUE_config;
|
fapi_nr_config_request_t *cfg = &UE->nrUE_config;
|
||||||
int rx_slot_type = nr_ue_slot_select(cfg, proc->frame_rx, proc->nr_slot_rx);
|
int rx_slot_type = nr_ue_slot_select(cfg, proc->frame_rx, proc->nr_slot_rx);
|
||||||
uint8_t gNB_id = 0;
|
uint8_t gNB_id = 0;
|
||||||
@@ -378,6 +391,13 @@ void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
notifiedFIFO_elt_t *res;
|
||||||
|
res = pullTpool(UE->txFifo,&(get_nrUE_params()->Tpool));
|
||||||
|
processingData_t *curMsg=(processingData_t *)NotifiedFifoData(res);
|
||||||
|
*curMsg = *rxtxD;
|
||||||
|
res->key = proc->nr_slot_rx;
|
||||||
|
pushTpool(&(get_nrUE_params()->Tpool), res);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -388,23 +408,17 @@ void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
|||||||
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
|
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef struct processingData_s {
|
//void UE_processing(void *arg) {
|
||||||
UE_nr_rxtx_proc_t proc;
|
// processingData_t *rxtxD = (processingData_t *) arg;
|
||||||
PHY_VARS_NR_UE *UE;
|
// UE_nr_rxtx_proc_t *proc = &rxtxD->proc;
|
||||||
} processingData_t;
|
// PHY_VARS_NR_UE *UE = rxtxD->UE;
|
||||||
|
// int slot_tx = proc->nr_slot_tx;
|
||||||
void UE_processing(void *arg) {
|
// int frame_tx = proc->frame_tx;
|
||||||
processingData_t *rxtxD = (processingData_t *) arg;
|
//
|
||||||
UE_nr_rxtx_proc_t *proc = &rxtxD->proc;
|
// processSlotRX(UE, proc);
|
||||||
PHY_VARS_NR_UE *UE = rxtxD->UE;
|
// processSlotTX(UE, proc);
|
||||||
int slot_tx = proc->nr_slot_tx;
|
//
|
||||||
int frame_tx = proc->frame_tx;
|
//}
|
||||||
|
|
||||||
processSlotRX(UE, proc);
|
|
||||||
processSlotTX(UE, proc);
|
|
||||||
ue_ta_procedures(UE, slot_tx, frame_tx);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void dummyWrite(PHY_VARS_NR_UE *UE,openair0_timestamp timestamp, int writeBlockSize) {
|
void dummyWrite(PHY_VARS_NR_UE *UE,openair0_timestamp timestamp, int writeBlockSize) {
|
||||||
void *dummy_tx[UE->frame_parms.nb_antennas_tx];
|
void *dummy_tx[UE->frame_parms.nb_antennas_tx];
|
||||||
@@ -521,19 +535,25 @@ void *UE_thread(void *arg) {
|
|||||||
AssertFatal(0== openair0_device_load(&(UE->rfdevice), &openair0_cfg[0]), "");
|
AssertFatal(0== openair0_device_load(&(UE->rfdevice), &openair0_cfg[0]), "");
|
||||||
UE->rfdevice.host_type = RAU_HOST;
|
UE->rfdevice.host_type = RAU_HOST;
|
||||||
AssertFatal(UE->rfdevice.trx_start_func(&UE->rfdevice) == 0, "Could not start the device\n");
|
AssertFatal(UE->rfdevice.trx_start_func(&UE->rfdevice) == 0, "Could not start the device\n");
|
||||||
|
|
||||||
notifiedFIFO_t nf;
|
notifiedFIFO_t nf;
|
||||||
initNotifiedFIFO(&nf);
|
initNotifiedFIFO(&nf);
|
||||||
|
|
||||||
|
notifiedFIFO_t rxFifo;
|
||||||
|
UE->rxFifo = &rxFifo;
|
||||||
|
initNotifiedFIFO(&rxFifo);
|
||||||
|
pushNotifiedFIFO_nothreadSafe(&rxFifo, newNotifiedFIFO_elt(sizeof(processingData_t), 0,&rxFifo,processSlotRX));
|
||||||
|
|
||||||
|
notifiedFIFO_t txFifo;
|
||||||
|
UE->txFifo = &txFifo;
|
||||||
|
initNotifiedFIFO(&txFifo);
|
||||||
|
pushNotifiedFIFO_nothreadSafe(&txFifo, newNotifiedFIFO_elt(sizeof(processingData_t), 0,&txFifo,processSlotTX));
|
||||||
|
|
||||||
int nbSlotProcessing=0;
|
int nbSlotProcessing=0;
|
||||||
int thread_idx=0;
|
int thread_idx=0;
|
||||||
notifiedFIFO_t freeBlocks;
|
|
||||||
initNotifiedFIFO_nothreadSafe(&freeBlocks);
|
|
||||||
NR_UE_MAC_INST_t *mac = get_mac_inst(0);
|
NR_UE_MAC_INST_t *mac = get_mac_inst(0);
|
||||||
int timing_advance = UE->timing_advance;
|
int timing_advance = UE->timing_advance;
|
||||||
|
|
||||||
for (int i=0; i<RX_NB_TH+1; i++) // RX_NB_TH working + 1 we are making to be pushed
|
|
||||||
pushNotifiedFIFO_nothreadSafe(&freeBlocks,
|
|
||||||
newNotifiedFIFO_elt(sizeof(processingData_t), 0,&nf,UE_processing));
|
|
||||||
|
|
||||||
bool syncRunning=false;
|
bool syncRunning=false;
|
||||||
const int nb_slot_frame = UE->frame_parms.slots_per_frame;
|
const int nb_slot_frame = UE->frame_parms.slots_per_frame;
|
||||||
int absolute_slot=0, decoded_frame_rx=INT_MAX, trashed_frames=0;
|
int absolute_slot=0, decoded_frame_rx=INT_MAX, trashed_frames=0;
|
||||||
@@ -602,7 +622,7 @@ void *UE_thread(void *arg) {
|
|||||||
thread_idx = absolute_slot % RX_NB_TH;
|
thread_idx = absolute_slot % RX_NB_TH;
|
||||||
int slot_nr = absolute_slot % nb_slot_frame;
|
int slot_nr = absolute_slot % nb_slot_frame;
|
||||||
notifiedFIFO_elt_t *msgToPush;
|
notifiedFIFO_elt_t *msgToPush;
|
||||||
AssertFatal((msgToPush=pullNotifiedFIFO_nothreadSafe(&freeBlocks)) != NULL,"chained list failure");
|
AssertFatal((msgToPush=pullTpool(&rxFifo,&(get_nrUE_params()->Tpool))) != NULL,"chained list failure");
|
||||||
processingData_t *curMsg=(processingData_t *)NotifiedFifoData(msgToPush);
|
processingData_t *curMsg=(processingData_t *)NotifiedFifoData(msgToPush);
|
||||||
curMsg->UE=UE;
|
curMsg->UE=UE;
|
||||||
// update thread index for received subframe
|
// update thread index for received subframe
|
||||||
@@ -672,20 +692,7 @@ void *UE_thread(void *arg) {
|
|||||||
UE->frame_parms.get_samples_slot_timestamp(slot_nr,
|
UE->frame_parms.get_samples_slot_timestamp(slot_nr,
|
||||||
&UE->frame_parms,DURATION_RX_TO_TX) - firstSymSamp;
|
&UE->frame_parms,DURATION_RX_TO_TX) - firstSymSamp;
|
||||||
|
|
||||||
notifiedFIFO_elt_t *res;
|
decoded_frame_rx=-1;
|
||||||
|
|
||||||
while (nbSlotProcessing >= RX_NB_TH) {
|
|
||||||
res=pullTpool(&nf, &(get_nrUE_params()->Tpool));
|
|
||||||
nbSlotProcessing--;
|
|
||||||
processingData_t *tmp=(processingData_t *)res->msgData;
|
|
||||||
|
|
||||||
if (tmp->proc.decoded_frame_rx != -1)
|
|
||||||
decoded_frame_rx=(((mac->mib->systemFrameNumber.buf[0] >> mac->mib->systemFrameNumber.bits_unused)<<4) | tmp->proc.decoded_frame_rx);
|
|
||||||
else
|
|
||||||
decoded_frame_rx=-1;
|
|
||||||
|
|
||||||
pushNotifiedFIFO_nothreadSafe(&freeBlocks,res);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( decoded_frame_rx>0 && decoded_frame_rx != curMsg->proc.frame_rx)
|
if ( decoded_frame_rx>0 && decoded_frame_rx != curMsg->proc.frame_rx)
|
||||||
LOG_E(PHY,"Decoded frame index (%d) is not compatible with current context (%d), UE should go back to synch mode\n",
|
LOG_E(PHY,"Decoded frame index (%d) is not compatible with current context (%d), UE should go back to synch mode\n",
|
||||||
@@ -730,23 +737,6 @@ void *UE_thread(void *arg) {
|
|||||||
msgToPush->key=slot_nr;
|
msgToPush->key=slot_nr;
|
||||||
pushTpool(&(get_nrUE_params()->Tpool), msgToPush);
|
pushTpool(&(get_nrUE_params()->Tpool), msgToPush);
|
||||||
|
|
||||||
if (IS_SOFTMODEM_RFSIM) { //getenv("RFSIMULATOR")
|
|
||||||
// FixMe: Wait previous thread is done, because race conditions seems too bad
|
|
||||||
// in case of actual RF board, the overlap between threads mitigate the issue
|
|
||||||
// We must receive one message, that proves the slot processing is done
|
|
||||||
res=pullTpool(&nf, &(get_nrUE_params()->Tpool));
|
|
||||||
nbSlotProcessing--;
|
|
||||||
processingData_t *tmp=(processingData_t *)res->msgData;
|
|
||||||
|
|
||||||
if (tmp->proc.decoded_frame_rx != -1)
|
|
||||||
decoded_frame_rx=(((mac->mib->systemFrameNumber.buf[0] >> mac->mib->systemFrameNumber.bits_unused)<<4) | tmp->proc.decoded_frame_rx);
|
|
||||||
else
|
|
||||||
decoded_frame_rx=-1;
|
|
||||||
//decoded_frame_rx=tmp->proc.decoded_frame_rx;
|
|
||||||
|
|
||||||
pushNotifiedFIFO_nothreadSafe(&freeBlocks,res);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // while !oai_exit
|
} // while !oai_exit
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
@@ -1064,6 +1064,8 @@ typedef struct {
|
|||||||
SLIST_HEAD(ral_thresholds_gen_poll_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX];
|
SLIST_HEAD(ral_thresholds_gen_poll_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX];
|
||||||
SLIST_HEAD(ral_thresholds_lte_poll_s, ral_threshold_phy_t) ral_thresholds_lte_polled[RAL_LINK_PARAM_LTE_MAX];
|
SLIST_HEAD(ral_thresholds_lte_poll_s, ral_threshold_phy_t) ral_thresholds_lte_polled[RAL_LINK_PARAM_LTE_MAX];
|
||||||
#endif
|
#endif
|
||||||
|
notifiedFIFO_t *rxFifo;
|
||||||
|
notifiedFIFO_t *txFifo;
|
||||||
|
|
||||||
int dl_stats[5];
|
int dl_stats[5];
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user