forked from cellular-infrastructure/osmocom-analog
Add real-time scheduling to osmotv and make it default for all base stations
This is required to drastically reduce the latency of the thread execution.
This commit is contained in:
parent
4e2ad7dae1
commit
ce4a540745
|
@ -197,7 +197,7 @@ Transmit PAL 'FUBK' test image on TV channel 21.
|
||||||
# osmotv --sdr-soapy \
|
# osmotv --sdr-soapy \
|
||||||
--sdr-tx-gain 60 \
|
--sdr-tx-gain 60 \
|
||||||
--sdr-bandwidth 60000000 \
|
--sdr-bandwidth 60000000 \
|
||||||
-r 13750000 \
|
-s 13750000 \
|
||||||
-c 21 \
|
-c 21 \
|
||||||
tx-fubk
|
tx-fubk
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,7 @@ const char *mncc_name = "";
|
||||||
static int send_patterns = 1;
|
static int send_patterns = 1;
|
||||||
static int release_on_disconnect = 1;
|
static int release_on_disconnect = 1;
|
||||||
int loopback = 0;
|
int loopback = 0;
|
||||||
int rt_prio = 0;
|
int rt_prio = 1;
|
||||||
const char *write_tx_wave = NULL;
|
const char *write_tx_wave = NULL;
|
||||||
const char *write_rx_wave = NULL;
|
const char *write_rx_wave = NULL;
|
||||||
const char *read_tx_wave = NULL;
|
const char *read_tx_wave = NULL;
|
||||||
|
|
|
@ -25,6 +25,7 @@ enum paging_signal;
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#include <sched.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "../libsample/sample.h"
|
#include "../libsample/sample.h"
|
||||||
|
@ -47,6 +48,7 @@ enum paging_signal;
|
||||||
void *sender_head = NULL;
|
void *sender_head = NULL;
|
||||||
int use_sdr = 0;
|
int use_sdr = 0;
|
||||||
int num_kanal = 1; /* only one channel used for debugging */
|
int num_kanal = 1; /* only one channel used for debugging */
|
||||||
|
int rt_prio = 1;
|
||||||
|
|
||||||
void *get_sender_by_empfangsfrequenz() { return NULL; }
|
void *get_sender_by_empfangsfrequenz() { return NULL; }
|
||||||
|
|
||||||
|
@ -58,7 +60,7 @@ static double circle_radius = 6.7;
|
||||||
static int color_bar = 0;
|
static int color_bar = 0;
|
||||||
static int grid_only = 0;
|
static int grid_only = 0;
|
||||||
static const char *station_id = "Jolly Roger";
|
static const char *station_id = "Jolly Roger";
|
||||||
static int __attribute__((__unused__)) latency = 30;
|
static int __attribute__((__unused__)) latency = 200;
|
||||||
static double samplerate = 10e6;
|
static double samplerate = 10e6;
|
||||||
static const char *wave_file = NULL;
|
static const char *wave_file = NULL;
|
||||||
|
|
||||||
|
@ -94,10 +96,12 @@ void print_help(const char *arg0)
|
||||||
printf(" -c --channel <channel>\n");
|
printf(" -c --channel <channel>\n");
|
||||||
printf(" Or give channel number.\n");
|
printf(" Or give channel number.\n");
|
||||||
printf(" Use 'list' to get a channel list.\n");
|
printf(" Use 'list' to get a channel list.\n");
|
||||||
printf(" -r --samplerate <frequency>\n");
|
printf(" -s --samplerate <frequency>\n");
|
||||||
printf(" Give sample rate in Hertz.\n");
|
printf(" Give sample rate in Hertz.\n");
|
||||||
printf(" -w --wave-file <filename>\n");
|
printf(" -w --wave-file <filename>\n");
|
||||||
printf(" Output to wave file instead of SDR\n");
|
printf(" Output to wave file instead of SDR\n");
|
||||||
|
printf(" -r --realtime <prio>\n");
|
||||||
|
printf(" Set prio: 0 to diable, 99 for maximum (default = %d)\n", rt_prio);
|
||||||
printf("\nsignal options:\n");
|
printf("\nsignal options:\n");
|
||||||
printf(" -F --fbas 1 | 0\n");
|
printf(" -F --fbas 1 | 0\n");
|
||||||
printf(" Turn color on or off. (default = %d)\n", fbas);
|
printf(" Turn color on or off. (default = %d)\n", fbas);
|
||||||
|
@ -128,8 +132,9 @@ static void add_options(void)
|
||||||
option_add('h', "help", 0);
|
option_add('h', "help", 0);
|
||||||
option_add('f', "frequency", 1);
|
option_add('f', "frequency", 1);
|
||||||
option_add('c', "channel", 1);
|
option_add('c', "channel", 1);
|
||||||
option_add('r', "samplerate", 1);
|
option_add('s', "samplerate", 1);
|
||||||
option_add('w', "wave-file", 1);
|
option_add('w', "wave-file", 1);
|
||||||
|
option_add('r', "realtime", 1);
|
||||||
option_add('F', "fbas", 1);
|
option_add('F', "fbas", 1);
|
||||||
option_add('T', "tone", 1);
|
option_add('T', "tone", 1);
|
||||||
option_add('R', "circle-radius", 1);
|
option_add('R', "circle-radius", 1);
|
||||||
|
@ -162,12 +167,15 @@ static int handle_options(int short_option, int argi, char **argv)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'r':
|
case 's':
|
||||||
samplerate = atof(argv[argi]);
|
samplerate = atof(argv[argi]);
|
||||||
break;
|
break;
|
||||||
case 'w':
|
case 'w':
|
||||||
wave_file = strdup(argv[argi]);
|
wave_file = strdup(argv[argi]);
|
||||||
break;
|
break;
|
||||||
|
case 'r':
|
||||||
|
rt_prio = atoi(argv[argi]);
|
||||||
|
break;
|
||||||
case 'F':
|
case 'F':
|
||||||
fbas = atoi(argv[argi]);
|
fbas = atoi(argv[argi]);
|
||||||
break;
|
break;
|
||||||
|
@ -198,7 +206,7 @@ static int handle_options(int short_option, int argi, char **argv)
|
||||||
"--sdr-tx-gain", "50",
|
"--sdr-tx-gain", "50",
|
||||||
"--sdr-lo-offset", "-3000000",
|
"--sdr-lo-offset", "-3000000",
|
||||||
"--sdr-bandwidth", "60000000",
|
"--sdr-bandwidth", "60000000",
|
||||||
"-r", "13750000",
|
"-s", "13750000",
|
||||||
};
|
};
|
||||||
int argc_lime = sizeof(argv_lime) / sizeof (*argv_lime);
|
int argc_lime = sizeof(argv_lime) / sizeof (*argv_lime);
|
||||||
return options_command_line(argc_lime, argv_lime, handle_options);
|
return options_command_line(argc_lime, argv_lime, handle_options);
|
||||||
|
@ -272,6 +280,18 @@ static void tx_bas(sample_t *sample_bas, __attribute__((__unused__)) sample_t *s
|
||||||
fm_modulate_complex(&mod, sample_tone, power_tone, samples, buff);
|
fm_modulate_complex(&mod, sample_tone, power_tone, samples, buff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* real time priority */
|
||||||
|
if (rt_prio > 0) {
|
||||||
|
struct sched_param schedp;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
memset(&schedp, 0, sizeof(schedp));
|
||||||
|
schedp.sched_priority = rt_prio;
|
||||||
|
rc = sched_setscheduler(0, SCHED_RR, &schedp);
|
||||||
|
if (rc)
|
||||||
|
fprintf(stderr, "Error setting SCHED_RR with prio %d\n", rt_prio);
|
||||||
|
}
|
||||||
|
|
||||||
double tx_frequencies[1], rx_frequencies[1];
|
double tx_frequencies[1], rx_frequencies[1];
|
||||||
tx_frequencies[0] = frequency;
|
tx_frequencies[0] = frequency;
|
||||||
rx_frequencies[0] = frequency;
|
rx_frequencies[0] = frequency;
|
||||||
|
@ -302,6 +322,16 @@ static void tx_bas(sample_t *sample_bas, __attribute__((__unused__)) sample_t *s
|
||||||
}
|
}
|
||||||
|
|
||||||
error:
|
error:
|
||||||
|
|
||||||
|
/* reset real time prio */
|
||||||
|
if (rt_prio > 0) {
|
||||||
|
struct sched_param schedp;
|
||||||
|
|
||||||
|
memset(&schedp, 0, sizeof(schedp));
|
||||||
|
schedp.sched_priority = 0;
|
||||||
|
sched_setscheduler(0, SCHED_OTHER, &schedp);
|
||||||
|
}
|
||||||
|
|
||||||
free(sendbuff);
|
free(sendbuff);
|
||||||
free(buff);
|
free(buff);
|
||||||
if (sdr)
|
if (sdr)
|
||||||
|
|
Loading…
Reference in New Issue