Added 10 a b real time result
[des2015.git] / natanael / ex10 / ex10d1.c
1 #include <stdio.h>
2 #include <signal.h>
3 #include <unistd.h>
4 #include <sys/mman.h>
5 #include <native/intr.h>
6 #include <sys/io.h>
7 #include <native/task.h>
8
9 const RTIME period = 100000;
10 const int nsamples = 10000;
11
12 RT_TASK task;
13 RTIME write_time;
14 RTIME time_diff[10000];
15
16 RT_INTR intr;
17 #define PARPORT_IRQ 7
18 unsigned char byte;
19
20 void enable_interupt()
21 {
22 ioperm(0x37A, 1, 1);
23 byte = inb(0x37A);
24 byte = byte | 0x10; /* hex 10 = 00010000 */
25 outb(byte, 0x37A);
26
27 // enable port D0
28 ioperm(0x378, 1, 1);
29 byte = inb(0x378);
30 byte = byte | 0x10; /* hex 10 = 00010000 */
31 outb(byte, 0x378);
32 }
33
34 void disable_interupt()
35 {
36 byte = inb(0x37A);
37 byte = byte & 0xEF; /* hex EF = binary 11101111 */
38 outb(byte, 0x37A);
39 }
40
41 void write_RTIMES(char * filename, unsigned int number_of_values,
42 RTIME *time_values){
43 unsigned int n=0;
44 FILE *file;
45 file = fopen(filename,"w");
46 while (n<number_of_values) {
47 fprintf(file,"%u,%llu\n",n,time_values[n]);
48 n++;
49 }
50 fclose(file);
51 rt_printf("File saved\n");
52 }
53
54 void send_parallel_port_intrp()
55 {
56 outb(inb(0x378) & 0xEF, 0x378);
57 outb(inb(0x378) | 0x10, 0x378); /* enable interrupt */
58 }
59
60 void do_task(void *arg)
61 {
62 int i;
63
64 rt_task_set_periodic(NULL, TM_NOW, period);
65
66 for(i=0; i<nsamples; i++)
67 {
68 write_time = rt_timer_read();
69
70 send_parallel_port_intrp();
71
72 rt_intr_wait(&intr,TM_INFINITE);
73
74 time_diff[i] = rt_timer_read() - write_time;
75
76 rt_task_wait_period(NULL);
77 }
78 write_RTIMES("time_diff_d.csv",nsamples,time_diff);
79 }
80
81 //startup code
82 void startup()
83 {
84 rt_intr_create(&intr, NULL, PARPORT_IRQ, I_PROPAGATE);
85 enable_interupt();
86
87 rt_task_create(&task, NULL,0,50,0);
88 rt_task_start(&task, &do_task, NULL);
89 }
90
91 void init_xenomai() {
92 /* Avoids memory swapping for this program */
93 mlockall(MCL_CURRENT|MCL_FUTURE);
94
95 /* Perform auto-init of rt_print buffers if the task doesn't do so */
96 rt_print_auto_init(1);
97 }
98 int main(int argc, char* argv[])
99 {
100 printf("\nType CTRL-C to end this program\n\n" );
101
102 // code to set things to run xenomai
103 init_xenomai();
104
105 //startup code
106 startup();
107
108 // wait for CTRL-c is typed to end the program
109 pause();
110
111 disable_interupt();
112 }