rt_wrapper.h 3.55 KB
Newer Older
1
/*******************************************************************************
2
    OpenAirInterface
3
    Copyright(c) 1999 - 2014 Eurecom
4

5 6 7 8
    OpenAirInterface is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
9 10


11 12 13 14
    OpenAirInterface is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
15

16
    You should have received a copy of the GNU General Public License
17 18
    along with OpenAirInterface.The full GNU General Public License is
    included in this distribution in the file called "COPYING". If not,
19
    see <http://www.gnu.org/licenses/>.
20

21 22 23
   Contact Information
   OpenAirInterface Admin: openair_admin@eurecom.fr
   OpenAirInterface Tech : openair_tech@eurecom.fr
24
   OpenAirInterface Dev  : openair4g-devel@lists.eurecom.fr
25

26
   Address      : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.
27

28
 *******************************************************************************/
29 30

/*! \file rt_wrapper.h
31 32
* \brief provides a wrapper for the timing function for real-time opeartions depending on weather RTAI is used or not. It also implements an API for the SCHED_DEADLINE kernel scheduler.
* \author F. Kaltenberger and Navid Nikaein
33 34 35
* \date 2013
* \version 0.1
* \company Eurecom
36
* \email: florian.kaltenberger@eurecom.fr, navid.nikaein@eurecom.fr
37
* \note
38
* \warning This code will be removed when a legacy libc API becomes available.
39 40
*/

41 42 43

void set_latency_target(void);

44 45 46
#ifndef RTAI
#include <time.h>
#include <errno.h>
47 48 49
#include <stdint.h>
#include <sys/stat.h>
#include <fcntl.h>
50
#include <pthread.h>
51 52
#include <linux/kernel.h>
#include <linux/types.h>
53 54
#include <syscall.h>
#include <math.h>
55 56 57 58 59 60 61 62 63 64 65

#define RTIME long long int

#define rt_printk printf

RTIME rt_get_time_ns (void);

int rt_sleep_ns (RTIME x);

void check_clock(void);

66 67 68 69 70
int fill_modeled_runtime_table(uint16_t runtime_phy_rx[29][6],uint16_t runtime_phy_tx[29][6]);

double get_runtime_tx(int tx_subframe, uint16_t runtime_phy_tx[29][6],uint32_t mcs, int N_RB_DL,double cpuf,int nb_tx_antenna);

double get_runtime_rx(int rx_subframe, uint16_t runtime_phy_rx[29][6], uint32_t mcs, int N_RB_DL,double cpuf,int nb_rx_antenna);
71 72 73 74
/**
 * see https://www.kernel.org/doc/Documentation/scheduler/sched-deadline.txt  or
 * http://www.blaess.fr/christophe/2014/04/05/utiliser-un-appel-systeme-inconnu-de-la-libc/
 */
laurent's avatar
laurent committed
75
#ifdef DEADLINE_SCHEDULER
76 77 78

#define gettid() syscall(__NR_gettid)

79
#define SCHED_DEADLINE  6
80

81
/* XXX use the proper syscall numbers */
82
#ifdef __x86_64__
83 84
#define __NR_sched_setattr   314
#define __NR_sched_getattr   315
85 86 87
#endif

#ifdef __i386__
88 89
#define __NR_sched_setattr   351
#define __NR_sched_getattr   352
90 91 92 93
#endif

struct sched_attr {
  __u32 size;
94

95 96
  __u32 sched_policy;
  __u64 sched_flags;
97

98 99
  /* SCHED_NORMAL, SCHED_BATCH */
  __s32 sched_nice;
100

101 102
  /* SCHED_FIFO, SCHED_RR */
  __u32 sched_priority;
103

104 105 106 107 108 109 110 111 112 113
  /* SCHED_DEADLINE (nsec) */
  __u64 sched_runtime;
  __u64 sched_deadline;
  __u64 sched_period;
};

int sched_setattr(pid_t pid, const struct sched_attr *attr, unsigned int flags);

int sched_getattr(pid_t pid,struct sched_attr *attr,unsigned int size, unsigned int flags);

114
#endif
115

116 117
#define gettid() syscall(__NR_gettid) // for gettid

118
#else
Anne Ambe's avatar
 
Anne Ambe committed
119
#include <rtai_hal.h>
120 121 122 123 124 125 126
#include <rtai_lxrt.h>
#include <rtai_sem.h>
#include <rtai_msg.h>

int rt_sleep_ns(RTIME x);

#endif