10 #include <sys/mman.h> /* this provides mlockall() */
15 #include "appl_utils.h"
17 int appl_base_task_prio;
19 int create_rt_task(pthread_t *thread, int prio, void *(*start_routine) (void *), void *arg)
24 struct sched_param schparam;
26 if (pthread_attr_init(&attr) != 0) {
27 fprintf(stderr, "pthread_attr_init failed\n");
31 if (pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) != 0) {
32 fprintf(stderr, "pthread_attr_setinheritsched failed\n");
36 if (pthread_attr_setschedpolicy(&attr, SCHED_FIFO) != 0) {
37 fprintf(stderr, "pthread_attr_setschedpolicy SCHED_FIFO failed\n");
41 schparam.sched_priority = prio;
43 if (pthread_attr_setschedparam(&attr, &schparam) != 0) {
44 fprintf(stderr, "pthread_attr_setschedparam failed\n");
48 ret = pthread_create(thread, &attr, start_routine, arg);
50 pthread_attr_destroy(&attr);
55 int sample_period_setup(sample_period_t *sper, unsigned long pernsec)
57 sper->period_nsec = pernsec;
58 clock_gettime(CLOCK_MONOTONIC, &sper->period_time);
62 int sample_period_wait_next(sample_period_t *sper)
64 sper->period_time.tv_nsec += sper->period_nsec;
65 if (sper->period_time.tv_nsec > 1000*1000*1000) {
66 sper->period_time.tv_nsec -= 1000*1000*1000;
67 sper->period_time.tv_sec += 1;
69 #if !defined(__rtems__)
70 return clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &sper->period_time, NULL);
72 return nanosleep(&sper->period_time, NULL);
76 void appl_sig_handler(int sig)
82 int appl_setup_environment(const char *argv0)
84 struct sigaction sigact;
85 int fifo_min_prio = sched_get_priority_min(SCHED_FIFO);
86 int fifo_max_prio = sched_get_priority_max(SCHED_FIFO);
88 appl_base_task_prio = fifo_max_prio - 20;
89 if (appl_base_task_prio < fifo_min_prio)
90 appl_base_task_prio = fifo_min_prio;
92 #if !defined(__rtems__)
93 if (mlockall(MCL_FUTURE | MCL_CURRENT) < 0) {
94 fprintf(stderr, "%s: mlockall failed - cannot lock application in memory\n", argv0);
101 memset(&sigact, 0, sizeof(sigact));
102 sigact.sa_handler = appl_sig_handler;
103 sigaction(SIGINT, &sigact, NULL);
104 sigaction(SIGTERM, &sigact, NULL);