All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai-core] xenomai-forge: round-robin scheduling in pSOS skin
@ 2012-03-08 14:30 Ronny Meeus
  2012-03-15 19:49 ` Ronny Meeus
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Ronny Meeus @ 2012-03-08 14:30 UTC (permalink / raw)
  To: Xenomai-core

[-- Attachment #1: Type: text/plain, Size: 1751 bytes --]

Hello

I'm are using the xenomai-forge pSOS skin (Mercury).
My application is running on a P4040 (Freescale PPC with 4 cores).
Some code snippets are put in this mail but the complete testcode is
also attached.

I have a test task that just consumes the CPU:

int run_test = 1;
static void perform_work(u_long counter,u_long b,u_long c,u_long d)
{
  int i;
  while (run_test) {
    for (i=0;i<100000;i++);
    (*(unsigned long*)counter)++;
  }
  while (1) tm_wkafter(1000);
}

If I create 2 instances of this task with the T_SLICE option set:

    t_create("WORK",10,0,0,0,&tid);
    t_start(tid,T_TSLICE, perform_work, args);


I see that only 1 task is consuming CPU.

# taskset 1 ./roundrobin.exe &
#    0"000.543| [main] SCHED_RT priorities => [1 .. 99]
   0"000.656| [main] SCHED_RT.99 reserved for IRQ emulation
   0"000.692| [main] SCHED_RT.98 reserved for scheduler-lock emulation
0 -> 6602
1 -> 0

If I adapt the code so that I call in my init the threadobj_start_rr
function, I see that the load is equally distributed over the 2
threads:

# taskset 1 ./roundrobin.exe &
#    0"000.557| [main] SCHED_RT priorities => [1 .. 99]
   0"000.672| [main] SCHED_RT.99 reserved for IRQ emulation
   0"000.708| [main] SCHED_RT.98 reserved for scheduler-lock emulation
0 -> 3290
1 -> 3291

Here are the questions:
- why is the threadobj_start_rr function not called from the context
of the init of the psos layer.
- why is the roundrobin implemented in this way? If the tasks would be
mapped on the SCHED_RR instead of the SCHED_FF the Linux scheduler
would take care of this.
On the other hand, once the threadobj_start_rr function is called from
my init, and I create the tasks in T_NOTSLICE mode, the time-slicing
is still done.

Thanks.

---
Ronny

[-- Attachment #2: roundrobin.c --]
[-- Type: text/x-csrc, Size: 1003 bytes --]

#include <stdio.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <psos/psos.h>

int run_test = 1;
static void perform_work(u_long counter,u_long b,u_long c,u_long d)
{
  int i;
  while (run_test) {
    for (i=0;i<100000;i++);
    (*(unsigned long*)counter)++;
  }
  while (1) tm_wkafter(1000);
}

static unsigned long counter[2];

static void test()
{
  u_long tid,args[4] = {0,0,0,0};
  int i;

  for (i=0;i<2;i++) {
    args[0] = (u_long)&(counter[i]);
    t_create("WORK",10,0,0,0,&tid);
    t_start(tid,T_TSLICE, perform_work, args);
  }
  tm_wkafter(10000);
  run_test = 0;

  for (i=0;i<2;i++) {
    printf("%i -> %lu\n",i,counter[i]);
  }
  while (1) tm_wkafter(1000);
}

int main(int argc,char *argv[], char**envp)
{
  u_long oldprio;
  struct timespec quantum;

  mlockall(MCL_CURRENT | MCL_FUTURE);
  copperplate_init(argc,argv);

  quantum.tv_sec = 0;
  quantum.tv_nsec = 5 * 1000 * 1000; // use 5ms
  threadobj_start_rr(&quantum);
  t_setpri(0,50,&oldprio);
  test();
  return 0;
}


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-03-27 11:38 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-03-08 14:30 [Xenomai-core] xenomai-forge: round-robin scheduling in pSOS skin Ronny Meeus
2012-03-15 19:49 ` Ronny Meeus
2012-03-16  0:08   ` Gilles Chanteperdrix
2012-03-17 10:42 ` Philippe Gerum
     [not found]   ` <CAMJ=MEe4oXvtaR29RBueXzoUYrmpt0GpCbqb-uW9j0fTksnC_g@domain.hid>
2012-03-27 11:38     ` [Xenomai-help] " Ronny Meeus
2012-03-17 16:36 ` 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.