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
#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; }
_______________________________________________ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core