Rtems id question

Manuel Pedro Coutinho manuelpedrocoutinho at hotmail.com
Mon Apr 18 15:23:07 UTC 2005



>From: "Joel Sherrill <joel at OARcorp.com>" <joel.sherrill at OARcorp.com>
>Reply-To: joel.sherrill at OARcorp.com
>To: Manuel Pedro Coutinho <manuelpedrocoutinho at hotmail.com>
>CC: rtems-users at rtems.com
>Subject: Re: Rtems id question
>Date: Mon, 18 Apr 2005 08:54:28 -0500
>
>Manuel Pedro Coutinho wrote:
>>
>>Hi
>>
>>I'm trying to use the partition and rate monotonic managers on different 
>>tasks and I can't make them work properly
>>
>>If I do (for the rate monotonic example)
>>
>>Init(...)
>>{
>>  /* Task Start */
>>  status = rtems_task_create( rtems_build_name( 'T', 'A', '1', ' ' ),   
>>10,
>>                    RTEMS_MINIMUM_STACK_SIZE , RTEMS_DEFAULT_MODES,
>>                    RTEMS_FLOATING_POINT | RTEMS_GLOBAL, &id1);
>>
>>  status = rtems_task_create( rtems_build_name( 'T', 'A', '2', ' ' ),   
>>20,
>>              RTEMS_MINIMUM_STACK_SIZE , RTEMS_DEFAULT_MODES,
>>                   RTEMS_FLOATING_POINT | RTEMS_GLOBAL, &id2);
>>
>>  status = rtems_task_create( rtems_build_name( 'T', 'A', '3', ' ' ),   
>>30,
>>              RTEMS_MINIMUM_STACK_SIZE , RTEMS_DEFAULT_MODES,
>>                   RTEMS_FLOATING_POINT | RTEMS_GLOBAL, &id3);
>>
>>  /* Rate monotonic Create*/
>>  rtems_rate_monotonic_create(rtems_build_name( 'R' , 'T' , 'A' , 
>>'1'),&period1);
>>  rtems_rate_monotonic_create(rtems_build_name( 'R' , 'T' , 'A' , 
>>'2'),&period2);
>>  rtems_rate_monotonic_create(rtems_build_name( 'R' , 'T' , 'A' , 
>>'3'),&period3);
>>
>>  /* Rate monotonic start */
>>  rtems_rate_monotonic_period(periodo1,100);
>>  rtems_rate_monotonic_period(periodo2,200);
>>  rtems_rate_monotonic_period(periodo3,300);
>>
>>   /* Task Start */
>>   status = rtems_task_start( id3, Task3 , 0 );
>>   status = rtems_task_start( id2, Task2 , 0 );
>>   status = rtems_task_start( id1, Task1 , 0 );
>>   ...
>>}
>>
>>
>>
>>and then on each task do something like:
>>
>>
>>
>>rtems_task Task1(rtems_task_argument arg)
>>{
>>  rtems_rate_monotonic_period_status status;
>>  rtems_id period1;
>>  rtems_status_code stat;
>>
>>  stat = rtems_rate_monotonic_ident( rtems_build_name('R' , 'T' , 'A' , 
>>'1' ) , &period1);
>>  if( stat != RTEMS_SUCCESSFUL )
>>     fatal_error("error\n");
>>
>>  while(1)
>>  {
>>           /* PERFORM TASK1 */
>>           .....
>>
>>
>>           /* Wait for end of period */
>>           if(rtems_rate_monotonic_period(period1,100) == RTEMS_TIMEOUT)
>>     fatal_error("error!");
>>  }
>>}
>>
>>
>>This task can't increment the tick count and stays blocked in the 
>>rate_monotonic_period, but
>>the RTEMS functions don't return error. The system.h is defined as follows
>>
>>
>>
>>#define CONFIGURE_MAXIMUM_TASKS                        10
>>#define CONFIGURE_MICROSECONDS_PER_TICK           100000/2
>>#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
>>#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
>>#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
>>#define CONFIGURE_MAXIMUM_PERIODS                     30
>>#define CONFIGURE_INIT
>>#define CONFIGURE_INIT_TASK_PRIORITY                  1
>>#include <confdefs.h>
>>
>>
>>if the rate monotonic is built on each task seperatly, the system works so 
>>I guess this isn't a problem of bad configuration.
>>Also, if instead of each searching for the rate monotonic name, it uses 
>>its global id variable, the result is the same: the tick variable doesn't 
>>change.
>
>The periods are supposed to be started in the task that uses them.
>There is bookkeeping assocated with a task if I remember right and
>by starting it in another task, you may be messing that up.
>
>>A similar error comes when I use the partition: It's created during driver 
>>initialization and when used on a task (using its global id), the 
>>partition_get function doesn't return an error but something "stupid" 
>>happens: I do the following
>>
>>  rtems_partition_get( partition_id, &pointer );
>>  pointer->some_field = 10;
>>
>>and when I print the pointer->some_field, it always returns 255, no matter 
>>of what I try to put there! (by the way, the pointer->some_field is an 
>>unsigned char)
>
>Are you sure the managers are in the executable?
>
>Are you declaring the appropriate variables as global?  If they are on the 
>stack, they are private to a task and will disappear entirely when 
>something falls otu of scope.
>

(First of all, I apologize for sending this mail twice to joel sherrill)

The managers are indeed in the executable (at least the application Makefile 
has Managers = all)
Has to declaring the variables as global... I'm sorry for the dumb question, 
but one has to do more than the following:

rtems_id   global_id;

Init(...)
{
...
}

I thought that the problem was somehow related to the the task beeing 
declared as global or local...

Thanks again!
Manuel Coutinho





>>Can anyone tell me what I'm doing wrong? I'm sure this must be something 
>>very simple to workout, but I can't manage to figure this one out!
>>
>>Many Thanks
>>Manuel Coutinho
>>
>>_________________________________________________________________
>>MSN Hotmail, o maior webmail do Brasil. http://www.hotmail.com
>>
>
>
>--
>Joel Sherrill, Ph.D.             Director of Research & Development
>joel at OARcorp.com                 On-Line Applications Research
>Ask me about RTEMS: a free RTOS  Huntsville AL 35805
>    Support Available             (256) 722-9985
>

_________________________________________________________________
MSN Hotmail, o maior webmail do Brasil. http://www.hotmail.com




More information about the users mailing list