Commit b7f1142f authored by Laurent THOMAS's avatar Laurent THOMAS

improve function that map ro to ssb in the UE: make dynamic smaller memory...

improve function that map ro to ssb in the UE: make dynamic smaller memory allocation than array[max][max][.... Saves about 100MB of memory and avoid real time glitch of milli seconds of memset(110MB)
parent c599e172
...@@ -430,7 +430,7 @@ typedef struct prach_occasion_info { ...@@ -430,7 +430,7 @@ typedef struct prach_occasion_info {
// PRACH occasion slot details // PRACH occasion slot details
// A PRACH occasion slot is a series of PRACH occasions in time (symbols) and frequency // A PRACH occasion slot is a series of PRACH occasions in time (symbols) and frequency
typedef struct prach_occasion_slot { typedef struct prach_occasion_slot {
prach_occasion_info_t prach_occasion[MAX_TDM][MAX_FDM]; // Starting symbol of each PRACH occasions in a slot prach_occasion_info_t *prach_occasion; // Starting symbol of each PRACH occasions in a slot
uint8_t nb_of_prach_occasion_in_time; uint8_t nb_of_prach_occasion_in_time;
uint8_t nb_of_prach_occasion_in_freq; uint8_t nb_of_prach_occasion_in_freq;
} prach_occasion_slot_t; } prach_occasion_slot_t;
......
...@@ -422,15 +422,14 @@ typedef struct prach_association_pattern { ...@@ -422,15 +422,14 @@ typedef struct prach_association_pattern {
// SSB details // SSB details
typedef struct ssb_info { typedef struct ssb_info {
bool transmitted; // True if the SSB index is transmitted according to the SSB positions map configuration
prach_occasion_info_t *mapped_ro[MAX_NB_RO_PER_SSB_IN_ASSOCIATION_PATTERN]; // List of mapped RACH Occasions to this SSB index prach_occasion_info_t *mapped_ro[MAX_NB_RO_PER_SSB_IN_ASSOCIATION_PATTERN]; // List of mapped RACH Occasions to this SSB index
uint32_t nb_mapped_ro; // Total number of mapped ROs to this SSB index uint32_t nb_mapped_ro; // Total number of mapped ROs to this SSB index
} ssb_info_t; } ssb_info_t;
// List of all the possible SSBs and their details // List of all the possible SSBs and their details
typedef struct ssb_list_info { typedef struct ssb_list_info {
ssb_info_t tx_ssb[MAX_NB_SSB]; ssb_info_t *tx_ssb;
uint8_t nb_tx_ssb; int nb_tx_ssb;
} ssb_list_info_t; } ssb_list_info_t;
typedef struct nr_lcordered_info_s { typedef struct nr_lcordered_info_s {
......
...@@ -69,10 +69,8 @@ void nr_ue_init_mac(NR_UE_MAC_INST_t *mac) ...@@ -69,10 +69,8 @@ void nr_ue_init_mac(NR_UE_MAC_INST_t *mac)
memset(&mac->ssb_measurements, 0, sizeof(mac->ssb_measurements)); memset(&mac->ssb_measurements, 0, sizeof(mac->ssb_measurements));
memset(&mac->ul_time_alignment, 0, sizeof(mac->ul_time_alignment)); memset(&mac->ul_time_alignment, 0, sizeof(mac->ul_time_alignment));
for (int i = 0; i < MAX_NUM_BWP_UE; i++) { memset(mac->ssb_list, 0, sizeof(mac->ssb_list));
memset(&mac->ssb_list[i], 0, sizeof(mac->ssb_list[i])); memset(mac->prach_assoc_pattern, 0, sizeof(mac->prach_assoc_pattern));
memset(&mac->prach_assoc_pattern[i], 0, sizeof(mac->prach_assoc_pattern[i]));
}
for (int k = 0; k < NR_MAX_HARQ_PROCESSES; k++) { for (int k = 0; k < NR_MAX_HARQ_PROCESSES; k++) {
mac->ul_harq_info[k].last_ndi = -1; // initialize to invalid value mac->ul_harq_info[k].last_ndi = -1; // initialize to invalid value
mac->dl_harq_info[k].last_ndi = -1; // initialize to invalid value mac->dl_harq_info[k].last_ndi = -1; // initialize to invalid value
...@@ -186,6 +184,14 @@ void reset_mac_inst(NR_UE_MAC_INST_t *nr_mac) ...@@ -186,6 +184,14 @@ void reset_mac_inst(NR_UE_MAC_INST_t *nr_mac)
// release, if any, Temporary C-RNTI // release, if any, Temporary C-RNTI
nr_mac->ra.t_crnti = 0; nr_mac->ra.t_crnti = 0;
// free RACH structs
for (int i = 0; i < MAX_NUM_BWP_UE; i++) {
free(nr_mac->ssb_list[i].tx_ssb);
for (int j = 0; j < MAX_NB_PRACH_CONF_PERIOD_IN_ASSOCIATION_PATTERN_PERIOD; j++)
for (int k = 0; k < MAX_NB_FRAME_IN_PRACH_CONF_PERIOD; k++)
for (int l = 0; l < MAX_NB_SLOT_IN_FRAME; l++)
free(nr_mac->prach_assoc_pattern[i].prach_conf_period_list[j].prach_occasion_slot_map[k][l].prach_occasion);
}
// reset BFI_COUNTER // reset BFI_COUNTER
// TODO beam failure procedure not implemented // TODO beam failure procedure not implemented
......
...@@ -436,15 +436,10 @@ bool monitior_dci_for_other_SI(NR_UE_MAC_INST_t *mac, ...@@ -436,15 +436,10 @@ bool monitior_dci_for_other_SI(NR_UE_MAC_INST_t *mac,
for (int i = 0; i < duration; i++) { for (int i = 0; i < duration; i++) {
if (((frame * slots_per_frame + slot - offset - i) % period) == 0) { if (((frame * slots_per_frame + slot - offset - i) % period) == 0) {
int N = mac->ssb_list[bwp_id].nb_tx_ssb; int N = mac->ssb_list[bwp_id].nb_tx_ssb;
int K = 0; // k_th transmitted SSB
for (int i = 0; i < mac->mib_ssb; i++) {
if(mac->ssb_list[bwp_id].tx_ssb[i].transmitted)
K++;
}
// numbering current frame and slot in terms of monitoring occasions in window // numbering current frame and slot in terms of monitoring occasions in window
int current_monitor_occasion = ((abs_slot - mac->si_window_start) % period) + int current_monitor_occasion = ((abs_slot - mac->si_window_start) % period) +
(duration * (abs_slot - mac->si_window_start) / period); (duration * (abs_slot - mac->si_window_start) / period);
if (current_monitor_occasion % N == K) if (current_monitor_occasion < N)
return true; return true;
else else
return false; return false;
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment