Add histogram for time budget printed at the exit of shm_radio
This commit is contained in:
@@ -60,6 +60,13 @@ typedef enum { ROLE_SERVER = 1, ROLE_CLIENT } role;
|
|||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
typedef struct histogram_s {
|
||||||
|
uint64_t diff[30];
|
||||||
|
int num_samples;
|
||||||
|
int min_samples;
|
||||||
|
double range;
|
||||||
|
} histogram_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int role;
|
int role;
|
||||||
char channel_name[40];
|
char channel_name[40];
|
||||||
@@ -76,8 +83,29 @@ typedef struct {
|
|||||||
uint64_t rx_early;
|
uint64_t rx_early;
|
||||||
uint64_t rx_samples_total;
|
uint64_t rx_samples_total;
|
||||||
double average_tx_budget;
|
double average_tx_budget;
|
||||||
|
histogram_t tx_histogram;
|
||||||
} shm_radio_state_t;
|
} shm_radio_state_t;
|
||||||
|
|
||||||
|
static void histogram_add(histogram_t *histogram, double diff)
|
||||||
|
{
|
||||||
|
histogram->num_samples++;
|
||||||
|
if (histogram->num_samples >= histogram->min_samples) {
|
||||||
|
int bin = min(sizeofArray(histogram->diff) - 1, max(0, (int)(diff / histogram->range * sizeofArray(histogram->diff))));
|
||||||
|
histogram->diff[bin]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void histogram_print(histogram_t *histogram)
|
||||||
|
{
|
||||||
|
LOG_I(HW, "SHM_RADIO: TX budget histogram: %d samples\n", histogram->num_samples);
|
||||||
|
float bin_size = histogram->range / sizeofArray(histogram->diff);
|
||||||
|
float bin_start = 0;
|
||||||
|
for (int i = 0; i < sizeofArray(histogram->diff); i++) {
|
||||||
|
LOG_I(HW, "Bin %d\t[%.1f - %.1fuS]:\t\t%lu\n", i, bin_start, bin_start + bin_size, histogram->diff[i]);
|
||||||
|
bin_start += bin_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void shm_radio_readconfig(shm_radio_state_t *shm_radio_state)
|
static void shm_radio_readconfig(shm_radio_state_t *shm_radio_state)
|
||||||
{
|
{
|
||||||
char *channel_name = NULL;
|
char *channel_name = NULL;
|
||||||
@@ -157,6 +185,7 @@ static int shm_radio_write(openair0_device *device,
|
|||||||
int64_t diff = timestamp - sample;
|
int64_t diff = timestamp - sample;
|
||||||
double budget = diff / (shm_radio_state->sample_rate / 1e6);
|
double budget = diff / (shm_radio_state->sample_rate / 1e6);
|
||||||
shm_radio_state->average_tx_budget = .05 * budget + .95 * shm_radio_state->average_tx_budget;
|
shm_radio_state->average_tx_budget = .05 * budget + .95 * shm_radio_state->average_tx_budget;
|
||||||
|
histogram_add(&shm_radio_state->tx_histogram, budget);
|
||||||
|
|
||||||
int ret = shm_td_iq_channel_tx(shm_radio_state->channel, timestamp, nsamps, 0, samplesVoid[0]);
|
int ret = shm_td_iq_channel_tx(shm_radio_state->channel, timestamp, nsamps, 0, samplesVoid[0]);
|
||||||
if (ret == CHANNEL_ERROR_TOO_LATE) {
|
if (ret == CHANNEL_ERROR_TOO_LATE) {
|
||||||
@@ -201,6 +230,7 @@ static void shm_radio_end(openair0_device *device)
|
|||||||
shm_radio_state->tx_early,
|
shm_radio_state->tx_early,
|
||||||
shm_radio_state->rx_early);
|
shm_radio_state->rx_early);
|
||||||
LOG_I(HW, "SHM_RADIO: Average TX budget %.3lf uS\n", shm_radio_state->average_tx_budget);
|
LOG_I(HW, "SHM_RADIO: Average TX budget %.3lf uS\n", shm_radio_state->average_tx_budget);
|
||||||
|
histogram_print(&shm_radio_state->tx_histogram);
|
||||||
shm_td_iq_channel_destroy(shm_radio_state->channel);
|
shm_td_iq_channel_destroy(shm_radio_state->channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -236,5 +266,8 @@ __attribute__((__visibility__("default"))) int device_init(openair0_device *devi
|
|||||||
device->trx_write_init = shm_radio_stub;
|
device->trx_write_init = shm_radio_stub;
|
||||||
shm_radio_state->last_received_sample = 0;
|
shm_radio_state->last_received_sample = 0;
|
||||||
shm_radio_state->sample_rate = openair0_cfg->sample_rate;
|
shm_radio_state->sample_rate = openair0_cfg->sample_rate;
|
||||||
|
shm_radio_state->tx_histogram.min_samples = 100;
|
||||||
|
// Set the histogram range to 3000uS. Anything above that is not interesting
|
||||||
|
shm_radio_state->tx_histogram.range = 3000.0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user