81dc33d510e1c2aac0d495f813bd28d33d4a2e95
[des2015.git] / mart / ex07 / ex07c.c
1 #include <stdio.h>
2 #include <signal.h>
3 #include <unistd.h>
4 #include <sys/mman.h>
5
6 #include <native/task.h>
7 #include <native/timer.h>
8 #include <native/sem.h>
9
10 #include <rtdk.h>
11 #include <sys/io.h>
12
13 #define NTASKS 4
14
15 RT_TASK demo_task[NTASKS];
16 RT_SEM mysync;
17
18 // set new baseperiod for the clock :
19 // - clock only increments counter when a base period is passed
20 // - the unit of the clock counter is called a jiffie, which in fact
21 // represents that a baseperiod is passed
22 // e.g. If 10 baseperiods are passed, the clock gives an increase
23 // in 10 jiffies
24 #define BASEPERIOD 1e6 // baseperiod in ns.
25
26 // when base period is set, all times in the api are expressed in jiffies
27 #define EXECTIME 200 // execution time in jiffies
28 #define SPINTIME 10 // spin time in jiffies
29
30 void demo(void *arg)
31 {
32 rt_task_set_mode(0, T_RRB, NULL);
33 RTIME starttime;
34 RTIME runtime;
35 int num = *(int *)arg;
36 RT_TASK *curtask;
37 RT_TASK_INFO curtaskinfo;
38
39 rt_printf("Task: %d\n", num);
40
41 rt_sem_p(&mysync, TM_INFINITE);
42
43 // let the task run RUNTIME(=200) jiffies in steps of SPINTIME(=20) jiffies
44 runtime = 0;
45 while(runtime < EXECTIME) {
46 rt_timer_spin(SPINTIME*BASEPERIOD); // spin cpu doing nothing
47 // note: rt_timer_spin function does not accept jiffies only nanoseconds
48 // deviates from timing conventions throughout the Xenomai API
49
50 runtime = runtime + SPINTIME;
51
52 rt_printf("Running Task: %d at time: %d\n", num, runtime);
53 }
54 rt_printf("End Task: %d\n", num);
55 }
56
57 //startup code
58 void startup()
59 {
60 int i;
61 char str[10] ;
62
63 // semaphore to sync task startup on
64 rt_sem_create(&mysync, "MySemaphore", 0, S_FIFO);
65
66 // change to period mode because round robin does not work
67 // in one shot mode
68 rt_timer_set_mode(BASEPERIOD);// set tick period
69 for(i = 0; i < NTASKS; i++) {
70 rt_printf("start task: %d\n", i);
71 sprintf(str, "task%d", i);
72 rt_task_create(&demo_task[i], str, 0, i == 3 ? 80 : 50, 0);
73 rt_task_slice(&demo_task[i], 1);
74 rt_task_start(&demo_task[i], &demo, &i);
75 }
76 rt_printf("wake up all tasks\n");
77 rt_sem_broadcast(&mysync);
78 }
79
80 void init_xenomai() {
81 /* Avoids memory swapping for this program */
82 mlockall(MCL_CURRENT | MCL_FUTURE);
83
84 /* Perform auto-init of rt_print buffers if the task doesn't do so */
85 rt_print_auto_init(1);
86 }
87
88 int main(int argc, char* argv[])
89 {
90 printf("\nType CTRL-C to end this program\n\n" );
91
92 // code to set things to run xenomai
93 init_xenomai();
94
95 //startup code
96 startup();
97
98 // wait for CTRL-c is typed to end the program
99 pause();
100 }