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:
Andreas Eversberg 2018-05-20 16:30:35 +02:00
parent 4e2ad7dae1
commit ce4a540745
3 changed files with 37 additions and 7 deletions

View File

@ -197,7 +197,7 @@ Transmit PAL 'FUBK' test image on TV channel 21.
# osmotv --sdr-soapy \
--sdr-tx-gain 60 \
--sdr-bandwidth 60000000 \
-r 13750000 \
-s 13750000 \
-c 21 \
tx-fubk

View File

@ -68,7 +68,7 @@ const char *mncc_name = "";
static int send_patterns = 1;
static int release_on_disconnect = 1;
int loopback = 0;
int rt_prio = 0;
int rt_prio = 1;
const char *write_tx_wave = NULL;
const char *write_rx_wave = NULL;
const char *read_tx_wave = NULL;

View File

@ -25,6 +25,7 @@ enum paging_signal;
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sched.h>
#include <errno.h>
#include <math.h>
#include "../libsample/sample.h"
@ -47,6 +48,7 @@ enum paging_signal;
void *sender_head = NULL;
int use_sdr = 0;
int num_kanal = 1; /* only one channel used for debugging */
int rt_prio = 1;
void *get_sender_by_empfangsfrequenz() { return NULL; }
@ -58,7 +60,7 @@ static double circle_radius = 6.7;
static int color_bar = 0;
static int grid_only = 0;
static const char *station_id = "Jolly Roger";
static int __attribute__((__unused__)) latency = 30;
static int __attribute__((__unused__)) latency = 200;
static double samplerate = 10e6;
static const char *wave_file = NULL;
@ -94,10 +96,12 @@ void print_help(const char *arg0)
printf(" -c --channel <channel>\n");
printf(" Or give channel number.\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(" -w --wave-file <filename>\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(" -F --fbas 1 | 0\n");
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('f', "frequency", 1);
option_add('c', "channel", 1);
option_add('r', "samplerate", 1);
option_add('s', "samplerate", 1);
option_add('w', "wave-file", 1);
option_add('r', "realtime", 1);
option_add('F', "fbas", 1);
option_add('T', "tone", 1);
option_add('R', "circle-radius", 1);
@ -162,12 +167,15 @@ static int handle_options(int short_option, int argi, char **argv)
return -EINVAL;
}
break;
case 'r':
case 's':
samplerate = atof(argv[argi]);
break;
case 'w':
wave_file = strdup(argv[argi]);
break;
case 'r':
rt_prio = atoi(argv[argi]);
break;
case 'F':
fbas = atoi(argv[argi]);
break;
@ -198,7 +206,7 @@ static int handle_options(int short_option, int argi, char **argv)
"--sdr-tx-gain", "50",
"--sdr-lo-offset", "-3000000",
"--sdr-bandwidth", "60000000",
"-r", "13750000",
"-s", "13750000",
};
int argc_lime = sizeof(argv_lime) / sizeof (*argv_lime);
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);
}
/* 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];
tx_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:
/* 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(buff);
if (sdr)