* [Xenomai-help] T_RRB @ 2008-02-11 16:53 Hubert Talbot 2008-02-11 18:28 ` Philippe Gerum 0 siblings, 1 reply; 5+ messages in thread From: Hubert Talbot @ 2008-02-11 16:53 UTC (permalink / raw) To: xenomai Hi, I'm new to Xenomai. I am studying xenomai and I would like to kwow how to apply round-robin. Specifically, what to do with (do I have to?): - the kernel configuration Real-time sub-system/Timing/Enable periodic timing ? - the timer configuration rt_timer_set_mode(rt_timer_ns2ticks(???)) ? - the task configuration rt_task_set_periodic(???) ? rt_task_set_mode(0, T_RRB, 0) ? rt_task_slice(???) ? Thanks in advanced. Hubert ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Xenomai-help] T_RRB 2008-02-11 16:53 [Xenomai-help] T_RRB Hubert Talbot @ 2008-02-11 18:28 ` Philippe Gerum 2008-02-11 18:50 ` Jan Kiszka 2008-02-11 20:53 ` [Xenomai-help] Rép. : T_RRB Hubert Talbot 0 siblings, 2 replies; 5+ messages in thread From: Philippe Gerum @ 2008-02-11 18:28 UTC (permalink / raw) To: Hubert Talbot; +Cc: xenomai Hubert Talbot wrote: > Hi, > > I'm new to Xenomai. > > I am studying xenomai and I would like to kwow how to apply round-robin. > > Specifically, what to do with (do I have to?): > > - the kernel configuration > > Real-time sub-system/Timing/Enable periodic timing ? > Yes. Round-robin scheduling is only available with tick-based timing. > - the timer configuration > > rt_timer_set_mode(rt_timer_ns2ticks(???)) ? > rt_timer_set_mode(ns), to switch the default oneshot mode for the native API to tick-based. > - the task configuration > > rt_task_set_periodic(???) ? Not this one; it controls whether your task follows a periodic timeline using the rt_task_wait_period() service. It's not related to RRB. > rt_task_set_mode(0, T_RRB, 0) ? Yes, this one is needed to switch on RRB for the calling task. > rt_task_slice(???) ? > And this one allows to set the time quantum alloted to the task (in ticks). > Thanks in advanced. > > Hubert > > > > > _______________________________________________ > Xenomai-help mailing list > Xenomai-help@domain.hid > https://mail.gna.org/listinfo/xenomai-help > -- Philippe. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Xenomai-help] T_RRB 2008-02-11 18:28 ` Philippe Gerum @ 2008-02-11 18:50 ` Jan Kiszka 2008-02-11 20:53 ` [Xenomai-help] Rép. : T_RRB Hubert Talbot 1 sibling, 0 replies; 5+ messages in thread From: Jan Kiszka @ 2008-02-11 18:50 UTC (permalink / raw) To: rpm; +Cc: Hubert Talbot, xenomai Philippe Gerum wrote: > Hubert Talbot wrote: >> Hi, >> >> I'm new to Xenomai. >> >> I am studying xenomai and I would like to kwow how to apply round-robin. >> >> Specifically, what to do with (do I have to?): >> >> - the kernel configuration >> >> Real-time sub-system/Timing/Enable periodic timing ? >> > > Yes. Round-robin scheduling is only available with tick-based timing. IMHO, this should finally be implemented for one-shot timebases as well. Setting up an additional time-slice timer for such tasks shouldn't be infeasible. Well, if I happen to have the time for this, one day... :) Jan -- Siemens AG, Corporate Technology, CT SE 2 Corporate Competence Center Embedded Linux ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Xenomai-help] Rép. : Re: T_RRB 2008-02-11 18:28 ` Philippe Gerum 2008-02-11 18:50 ` Jan Kiszka @ 2008-02-11 20:53 ` Hubert Talbot 2008-02-11 22:51 ` Philippe Gerum 1 sibling, 1 reply; 5+ messages in thread From: Hubert Talbot @ 2008-02-11 20:53 UTC (permalink / raw) To: rpm; +Cc: xenomai There is something I don't understand. Does Xenomai really implement RRB? Here is my code: //**************************************************** #include <sys/mman.h> #include <native/task.h> #include <native/timer.h> #include <native/sem.h> #define NBTASK 2 #define NSEC 1 #define USEC 1000 #define MSEC 1000000 #define SEC 1000000000 RT_TASK tasks[NBTASK]; RT_SEM sem; void my_sleep(int nSec) { struct timeval tv_start, tv_current; gettimeofday(&tv_start, 0); do { // rt_task_wait_period(NULL); struct timeval; gettimeofday(&tv_current, 0); } while (tv_current.tv_sec - tv_start.tv_sec <= nSec); } void task(void *arg) { int taskID = *((int *)arg); struct timeval tv_start, tv_end; rt_task_set_mode(0, T_RRB, 0); rt_task_slice(NULL, rt_timer_ns2ticks(10 * MSEC)); rt_sem_p(&sem, TM_INFINITE); printf("task %d start...\n", taskID); gettimeofday(&tv_start, 0); // sleep(1); my_sleep(1); gettimeofday(&tv_end, 0); printf("task %d end (%d sec)\n", taskID, tv_end.tv_sec - tv_start.tv_sec); } int main(void) { int rc; int i; struct timeval tv1, tv2; mlockall(MCL_CURRENT | MCL_FUTURE); rc = rt_timer_set_mode(1 * MSEC); if (rc != 0) { printf("failed to rt_timer_set_mode: %d\n", rc); return rc; } rt_sem_create(&sem, "sem", 0, S_FIFO); for (i = 0; i < NBTASK; i++) { char szTaskID[20]; sprintf(szTaskID, "Task%02d", i); rt_task_create(&tasks[i], szTaskID, 4096, 99, T_JOINABLE); } gettimeofday(&tv1, 0); for (i = 0; i < NBTASK; i++) { RT_TASK_INFO info; rt_task_start(&tasks[i], &task, (void *)&i); } rt_sem_broadcast(&sem); for (i = 0; i < NBTASK; i++) { rt_task_join(&tasks[i]); } gettimeofday(&tv2, 0); printf("****** total time: %d (sec)\n\n", tv2.tv_sec - tv1.tv_sec); rt_sem_delete(&sem); return 0; } //**************************************************** CASE 1 --------- In the task function, if I use my_sleep() the output is: task 0 start... task 0 end (2 sec) task 1 start... task 1 end (2 sec) ****** total time: 4 (sec) ...not really RRB. CASE 2 --------- If I use sleep() the output is: task 0 start... task 1 start... task 0 end (1 sec) task 1 end (1 sec) ****** total time: 1 (sec) ...ok, RRB but why? CASE 3 --------- In my_sleep(), if I uncomment // rt_task_wait_period(NULL); The output is task 0 start... task 1 start... task 0 end (2 sec) task 1 end (2 sec) ****** total time: 2 (sec) It seems for me the the latter does not need RRB. Sould output from CASE 1 be like CASE 2 (or at least like CASE 3) ? Am I missing something? Thanks in advance Hubert >>> Philippe Gerum <rpm@xenomai.org> 2008-02-11 13:28 >>> Hubert Talbot wrote: > Hi, > > I'm new to Xenomai. > > I am studying xenomai and I would like to kwow how to apply round-robin. > > Specifically, what to do with (do I have to?): > > - the kernel configuration > > Real-time sub-system/Timing/Enable periodic timing ? > Yes. Round-robin scheduling is only available with tick-based timing. > - the timer configuration > > rt_timer_set_mode(rt_timer_ns2ticks(???)) ? > rt_timer_set_mode(ns), to switch the default oneshot mode for the native API to tick-based. > - the task configuration > > rt_task_set_periodic(???) ? Not this one; it controls whether your task follows a periodic timeline using the rt_task_wait_period() service. It's not related to RRB. > rt_task_set_mode(0, T_RRB, 0) ? Yes, this one is needed to switch on RRB for the calling task. > rt_task_slice(???) ? > And this one allows to set the time quantum alloted to the task (in ticks). > Thanks in advanced. > > Hubert > > > > > _______________________________________________ > Xenomai-help mailing list > Xenomai-help@domain.hid > https://mail.gna.org/listinfo/xenomai-help > -- Philippe. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Xenomai-help] Rép. : Re: T_RRB 2008-02-11 20:53 ` [Xenomai-help] Rép. : T_RRB Hubert Talbot @ 2008-02-11 22:51 ` Philippe Gerum 0 siblings, 0 replies; 5+ messages in thread From: Philippe Gerum @ 2008-02-11 22:51 UTC (permalink / raw) To: Hubert Talbot; +Cc: xenomai Hubert Talbot wrote: > There is something I don't understand. > > Does Xenomai really implement RRB? > Yes it does, and it even happens to work, provided it is used properly. > Here is my code: > > //**************************************************** > #include <sys/mman.h> > #include <native/task.h> > #include <native/timer.h> > #include <native/sem.h> > > #define NBTASK 2 > #define NSEC 1 > #define USEC 1000 > #define MSEC 1000000 > #define SEC 1000000000 > > RT_TASK tasks[NBTASK]; > RT_SEM sem; > > void my_sleep(int nSec) > { > struct timeval tv_start, tv_current; > > gettimeofday(&tv_start, 0); > > do > { > // rt_task_wait_period(NULL); > struct timeval; > gettimeofday(&tv_current, 0); > } while (tv_current.tv_sec - tv_start.tv_sec <= nSec); > } > Xenomai RRB will work for tasks controlled by the Xenomai scheduler. By calling gettimeofday(), your tasks switch to a runtime mode where they depend on the Linux scheduler, so there is no way for the round-robin swap to take place properly at Xenomai level. Your tasks will just run in FIFO order due to Linux scheduling. The code below will exhibit RRB scheduling controlled by the Xenomai core; the point is to use the real-time API to perform the busy-wait, and never call into any Linux service in the meantime: #include <stdio.h> #include <sys/mman.h> #include <native/task.h> #include <native/timer.h> #include <native/sem.h> #define NBTASK 2 #define NSEC 1 #define USEC 1000 #define MSEC 1000000 #define SEC 1000000000 #define PERIOD (10 * MSEC) RT_TASK tasks[NBTASK]; RT_SEM sem; static inline unsigned tick_delta(RTIME t0, RTIME t1) { return ((unsigned)(t1 - t0) * PERIOD) / SEC; } void my_sleep(int nSec) { RTIME start_ticks, wait_ticks; wait_ticks = (nSec * SEC) / PERIOD; start_ticks = rt_timer_read(); while (rt_timer_read() - start_ticks <= wait_ticks) ; } void task(void *arg) { int taskID = (int)(long)arg; RTIME start_date, end_date; rt_sem_p(&sem, TM_INFINITE); printf("task %d start...\n", taskID); rt_task_slice(NULL, rt_timer_ns2ticks(PERIOD)); rt_task_set_mode(0, T_RRB, 0); start_date = rt_timer_read(); my_sleep(1); end_date = rt_timer_read(); printf("task %d end (%u sec)\n", taskID, tick_delta(start_date, end_date)); } int main(void) { int rc; int i; RTIME tv1, tv2; mlockall(MCL_CURRENT | MCL_FUTURE); rc = rt_timer_set_mode(1 * MSEC); if (rc != 0) { printf("failed to rt_timer_set_mode: %d\n", rc); return rc; } rt_sem_create(&sem, "sem", 0, S_FIFO); for (i = 0; i < NBTASK; i++) { char szTaskID[20]; sprintf(szTaskID, "Task%02d", i); rt_task_create(&tasks[i], szTaskID, 4096, 99, T_JOINABLE); } tv1 = rt_timer_read(); for (i = 0; i < NBTASK; i++) { RT_TASK_INFO info; rt_task_start(&tasks[i], &task, (void *)(long)i); } rt_sem_broadcast(&sem); for (i = 0; i < NBTASK; i++) { rt_task_join(&tasks[i]); } tv2 = rt_timer_read(); printf("****** total time: %u (sec)\n\n", tick_delta(tv1, tv2)); rt_sem_delete(&sem); return 0; } -- Philippe. ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2008-02-11 22:51 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-02-11 16:53 [Xenomai-help] T_RRB Hubert Talbot 2008-02-11 18:28 ` Philippe Gerum 2008-02-11 18:50 ` Jan Kiszka 2008-02-11 20:53 ` [Xenomai-help] Rép. : T_RRB Hubert Talbot 2008-02-11 22:51 ` Philippe Gerum
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.