8 #include <native/task.h>
9 #include <native/timer.h>
10 #include <native/sem.h>
17 RT_TASK demo_task
[NTASKS
];
20 // set new baseperiod for the clock :
21 // - clock only increments counter when a base period is passed
22 // - the unit of the clock counter is called a jiffie, which in fact
23 // represents that a baseperiod is passed
24 // e.g. If 10 baseperiods are passed, the clock gives an increase
26 #define BASEPERIOD 1e6 // baseperiod in ns.
28 // when base period is set, all times in the api are expressed in jiffies
29 #define EXECTIME 200 // execution time in jiffies
30 #define SPINTIME 10 // spin time in jiffies
34 RTIME starttime
, runtime
;
37 RT_TASK_INFO curtaskinfo
;
39 curtask
=rt_task_self();
41 rt_task_set_mode(0,T_RRB
,NULL
);
42 rt_task_slice(curtask
,EXECTIME
/SPINTIME
);
44 rt_printf("Task : %d\n",num
);
46 rt_sem_p(&mysync
,TM_INFINITE
);
48 // let the task run RUNTIME(=200) jiffies in steps of SPINTIME(=20) jiffies
50 while(runtime
< EXECTIME
) {
51 rt_timer_spin(SPINTIME
*BASEPERIOD
); // spin cpu doing nothing
52 // note: rt_timer_spin function does not accept jiffies only nanoseconds
53 // deviates from timing conventions throughout the Xenomai API
55 runtime
= runtime
+ SPINTIME
;
57 rt_printf("Running Task : %d at time : %d\n",num
,runtime
);
59 rt_printf("End Task : %d\n",num
);
68 // semaphore to sync task startup on
69 rt_sem_create(&mysync
,"MySemaphore",0,S_FIFO
);
71 // change to period mode because round robin does not work
73 rt_timer_set_mode(BASEPERIOD
);// set tick period
74 for(i
=0; i
< NTASKS
; i
++) {
75 rt_printf("start task : %d\n",i
);
76 sprintf(str
,"task%d",i
);
77 rt_task_create(&demo_task
[i
], str
, 0, 50, 0);
78 rt_task_start(&demo_task
[i
], &demo
, &i
);
80 // Set the latest task priority higher
81 rt_task_set_priority(&demo_task
[3],80);
83 rt_printf("wake up all tasks\n");
84 rt_sem_broadcast(&mysync
);
88 /* Avoids memory swapping for this program */
89 mlockall(MCL_CURRENT
|MCL_FUTURE
);
91 /* Perform auto-init of rt_print buffers if the task doesn't do so */
92 rt_print_auto_init(1);
95 int main(int argc
, char* argv
[])
97 printf("\nType CTRL-C to end this program\n\n" );
99 // code to set things to run xenomai
105 // wait for CTRL-c is typed to end the program