All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Hubert Talbot" <Hubert.Talbot@domain.hid>
To: rpm@xenomai.org
Cc: xenomai@xenomai.org
Subject: [Xenomai-help] Rép. : Re:  T_RRB
Date: Mon, 11 Feb 2008 15:53:48 -0500	[thread overview]
Message-ID: <47B06F8C0200000100192434@domain.hid> (raw)
In-Reply-To: <47B093D8.2050605@domain.hid>

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.



  parent reply	other threads:[~2008-02-11 20:53 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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   ` Hubert Talbot [this message]
2008-02-11 22:51     ` [Xenomai-help] Rép. : T_RRB Philippe Gerum

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=47B06F8C0200000100192434@domain.hid \
    --to=hubert.talbot@domain.hid \
    --cc=rpm@xenomai.org \
    --cc=xenomai@xenomai.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.