Now that I can see and run the code, a few things jump out. + POSIX priorities -- lower numerically ==> more important + You did &Thread_Id to calls after created. The & isn't supposed to be there. + &policy should be the second argument to pthread_getschedparam. + Pay attention to compiler warnings. :) + Benchmark time is initialized IMMEDIATELY BEFORE the single operation under test. We try to avoid including anything.
I have attached a new version of init.c with comments hacked in and changes. The big thing I tried to put in a comment block is that the way this test is structured, it includes the hidden start up time for the first time test_thread(0 runs. I tried to write up notes on how to modify the test to avoid that. For convenience, I would add a helper routine like this: void set_thread_priority( id, new_priority ) and call it. It will greatly simplify the code. I hope I didn't fall into the inverse priority range trap in those instructions.... WARNING: POSIX priorities run INVERSE from the internal priorities but in gdb if you print: p _Per_CPU_Information.per_cpu.executing->current_priority You will see the internal priority (NOT POSIX priority) of the currently running thread. 1 is most important and 255 is the IDLE task. So the numbers you pick are important to switch back and forth between the tasks. I think the test is pretty close in spite of all that I wrong. I stepped through the code attached and it is doing the right thing EXCEPT including the thread hidden start time. :) Benchmark programs are hard to get right but fun to write. --joel On 11/24/2013 11:50 AM, Joel Sherrill wrote: > Sorry to be lazy/stupid but how to I download just > the diff to see what's going on? I am not that > github literate. > > --joel > > On 11/24/2013 11:28 AM, Chirayu Desai wrote: >> Hello everyone. >> >> I am Chirayu Desai, a high school student, currently participating in >> Google Code-In 2013 >> >> I have currently working on the task [0], but I'm having some trouble >> trying to get my code[1] to work. >> >> The task is to create a POSIX timing test psxtmthread05. >> The test case is: pthread_setschedparam() - lower own priority. >> I managed to write up something [2], but it doesn't work. >> The GDB output is: >> >> (gdb) r >> Starting program: >> /home/cdesai/rtems/b-sis/sparc-rtems4.11/c/sis/testsuites/psxtmtests/psxtmthread05/psxtmthread05.exe >> >> >> >> *** POSIX TIME TEST PSXTMTHREAD05 *** >> getschedparam: 3 >> Original priority: 5 >> Lowered priority: 4 >> setschedparam: 3 >> pthread_setschedparam - lower own priority 2226 >> *** END OF POSIX TIME TEST PSXTMTHREAD05 *** >> [Inferior 1 (process 42000) exited normally] >> >> [0]: >> http://www.google-melange.com/gci/task/view/google/gci2013/6383096106582016 >> [1]: https://github.com/chirayudesai/rtems/tree/psxtmthread05 >> [2]: >> https://github.com/chirayudesai/rtems/commit/890cebf084ca2a3815e3049a766276ddcdb0188a >> >> P.S. This is my first post to this list, so excuse me for any mistakes. >> >> Regards, >> Chirayu Desai > > > -- Joel Sherrill, Ph.D. Director of Research & Development joel.sherr...@oarcorp.com On-Line Applications Research Ask me about RTEMS: a free RTOS Huntsville AL 35805 Support Available (256) 722-9985
/* * COPYRIGHT (c) 1989-2012. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <timesys.h> #include <pthread.h> #include <rtems/timerdrv.h> #include "test_support.h" /* forward declarations to avoid warnings */ void *POSIX_Init(void *argument); void benchmark_pthread_create(void); void benchmark_pthread_setschedparam(void); void *test_thread(void *argument); void benchmark_pthread_setschedparam(void) { int status; int policy; pthread_t thread_ID; struct sched_param param; param.sched_priority = 5; //XXX: Magic value? // JOEL - no.. just an arbtrary priority with numbers above and below it status = pthread_create(&thread_ID, NULL, test_thread, NULL); rtems_test_assert( status == 0 ); // Thread creation works // Not sure if I should use SCHED_FIFO status = pthread_getschedparam(thread_ID, &policy, ¶m); printf("getschedparam: %d\n", status); // Fails with ESRCH, I don't get why though. rtems_test_assert( status == 0 ); // JOEL at POSIX priority 2, internal 253, IDLE=255 (near low end) printf("Original priority: %d\n", param.sched_priority); param.sched_priority = 4; // JOEL printf("Lowered priority: %d\n", param.sched_priority); // Ditto, for SCHED_FIFO //JOEL ONLY BEFORE THE SINGLE OPERATION BEING TIMED!! benchmark_timer_initialize(); status = pthread_setschedparam(thread_ID, SCHED_FIFO, ¶m); printf("setschedparam: %d\n", status); // Ditto, ESRCH rtems_test_assert( status == 0 ); } void *test_thread( void *argument ) { long end_time; // XXX we are including thread start time. Need to do something // XXX that let's it run and voluntarily return. Line // + test_thread created at 6 // + POSIX_Init lowers itself to : and switches to test_thread // + test_thread runs and lowers itself to 4 and switches to POSIX_Init // + start timer in POSIX_Init // + POSIX_Init lowers itself to 5 and switches to test_thread // XXX moved end_time = benchmark_timer_read(); put_time( "pthread_setschedparam - lower own priority", end_time, 1, /* Only executed once */ 0, 0 ); puts( "*** END OF POSIX TIME TEST PSXTMTHREAD05 ***" ); rtems_test_exit(0); //Empty thread used in pthread_create(). return NULL; } void *POSIX_Init( void *argument ) { puts( "\n\n*** POSIX TIME TEST PSXTMTHREAD05 ***" ); benchmark_pthread_setschedparam(); rtems_test_assert( 1 ); return NULL; } /* configuration information */ #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER #define CONFIGURE_MAXIMUM_POSIX_THREADS 2 #define CONFIGURE_POSIX_INIT_THREAD_TABLE #define CONFIGURE_INIT #include <rtems/confdefs.h> /* end of file */
_______________________________________________ rtems-devel mailing list rtems-devel@rtems.org http://www.rtems.org/mailman/listinfo/rtems-devel