diff --git a/srsue/hdr/phy/nr/sf_worker.h b/srsue/hdr/phy/nr/sf_worker.h index 443fad74d..20782b83e 100644 --- a/srsue/hdr/phy/nr/sf_worker.h +++ b/srsue/hdr/phy/nr/sf_worker.h @@ -57,8 +57,8 @@ private: srslog::basic_logger& logger; uint32_t tti_rx = 0; - cf_t* prach_ptr = nullptr; - float prach_power = 0; + cf_t* prach_ptr = nullptr; + float prach_power = 0; }; } // namespace nr diff --git a/srsue/hdr/phy/nr/state.h b/srsue/hdr/phy/nr/state.h index 18a2bccd4..337b6ee8f 100644 --- a/srsue/hdr/phy/nr/state.h +++ b/srsue/hdr/phy/nr/state.h @@ -60,7 +60,9 @@ public: /// Physical layer higher layer configuration, provided by higher layers through configuration messages srsran::phy_cfg_nr_t cfg = {}; - uint16_t ra_rnti = 0; + /// Semaphore for aligning UL work + srsran::tti_semaphore dl_ul_semaphore; + uint32_t rar_grant_tti = 0; state() diff --git a/srsue/src/phy/nr/cc_worker.cc b/srsue/src/phy/nr/cc_worker.cc index 3a108b1d2..49f59c1ea 100644 --- a/srsue/src/phy/nr/cc_worker.cc +++ b/srsue/src/phy/nr/cc_worker.cc @@ -99,6 +99,7 @@ void cc_worker::set_tti(uint32_t tti) { dl_slot_cfg.idx = tti; ul_slot_cfg.idx = TTI_TX(tti); + logger.set_context(tti); } cf_t* cc_worker::get_rx_buffer(uint32_t antenna_idx) diff --git a/srsue/src/phy/nr/sf_worker.cc b/srsue/src/phy/nr/sf_worker.cc index a354e2c35..b24ed194b 100644 --- a/srsue/src/phy/nr/sf_worker.cc +++ b/srsue/src/phy/nr/sf_worker.cc @@ -87,6 +87,10 @@ void sf_worker::work_imp() w->work_dl(); } + // Align workers, wait for previous workers to finish DL processing before starting UL processing + phy_state->dl_ul_semaphore.wait(this); + phy_state->dl_ul_semaphore.release(); + // Check if PRACH is available if (prach_ptr != nullptr) { // PRACH is available, set buffer, transmit and return diff --git a/srsue/src/phy/nr/worker_pool.cc b/srsue/src/phy/nr/worker_pool.cc index 6cc741846..759c74c52 100644 --- a/srsue/src/phy/nr/worker_pool.cc +++ b/srsue/src/phy/nr/worker_pool.cc @@ -60,6 +60,10 @@ bool worker_pool::init(const phy_args_nr_t& args, phy_common* common, stack_inte void worker_pool::start_worker(sf_worker* w) { + // Push worker pointer for internal worker TTI synchronization + phy_state.dl_ul_semaphore.push(w); + + // Signal worker to start processing asynchronously pool.start_worker(w); }