Clarification on Rate montonic

Gedare Bloom gedare at rtems.org
Wed Jun 6 15:07:11 UTC 2012


I don't see TA1 starting. You'll have to dig into that problem. I see
nothing immediately obvious.

On Wed, Jun 6, 2012 at 5:05 AM,  <domenico.dileo at unina.it> wrote:
> Dear Sebastian and Gedare,
>
> thank you for your comments.
> I updated the code according to your suggestions
> (at least I hope so). The cods is at the end of this message (with an
> execution log as well).
> In the init function 2 tasks, TA0 and TA1 are crated.
> TA0 starts a periodic task,PER0, similarly TA1.
> PER0 has period 6000 ticks and sleeps for 4000 ticks
> PER1 has period 4000 ticks and sleeps for 2000 ticks
>
>  I observer the following behavior:
> TA0 and TA1 both created.
> TA0 starts PER0.
> PER0 executes (I choose to execute the task for 10 times)
> Then everything stops.
>
> Conversely, what I would like to see that
> PR0 and PR1 are alternatively scheduled.
> Can you help me out to understand where I'm mistaken?
> Thank you in advance
>
> ******************************************************
> init.c
> ******************************************************
> int index = 0;
>  for ( index; index < 2 ; index++ ) {
>      task_names[ index ] =  rtems_build_name( 'T', 'A', '0'+index, ' ' );
>      status = rtems_task_create(
>      task_names[ index ],
>      Priorities[ index ],
>      RTEMS_MINIMUM_STACK_SIZE,
>      RTEMS_DEFAULT_MODES,
>      RTEMS_DEFAULT_ATTRIBUTES,
>      &task_id[ index ]
>    );
>    if(status == RTEMS_SUCCESSFUL){
>        printf(" Task %s created with id %d \n",
> rtems_object_get_name(task_id[index],NAME_LENGTH, task_name),
> task_id[index]);
>                }else{
>                printf("Failed to create task %s  with status %i \n",
> task_name[index], status);
>  }
> }
>
>  rtems_rate_monotonic_reset_all_statistics();
>  for ( index = 0 ; index < 2 ; index++ ) {
>    status = rtems_task_start( task_id[ index ], periodic_task, index );
>    if(status == RTEMS_SUCCESSFUL){
>        printf(" Task %s started \n",
> rtems_object_get_name(task_id[index],NAME_LENGTH, task_name));
>                }else{
>                printf("Failed to start task %s  with status %d \n",
> task_name[index], status);
>  }
>
> //wake up init after 20 seconds
>  status = rtems_task_wake_after(ticks_per_second*60);
>
>
>  // delete init task after starting the three working tasks
>  rtems_rate_monotonic_report_statistics();
>  status = rtems_task_delete( RTEMS_SELF );
>  rtems_shutdown_executive(result);
>  }
> }
>
> *************************************************************
> tasks.c
> *************************************************************
> rtems_task periodic_task(
>  rtems_task_argument argument
> )
> {
>  rtems_name rm_name;
>  rtems_id rm_id;
>
>  rtems_time_of_day time;
>  rtems_status_code status;
>  rtems_interval interval;
>  uint32_t          ticks_since_boot;
>  uint32_t          count;
>  char rm_name_buffer[NAME_LENGTH];
>  count = 0;
>
>        rm_name = rtems_build_name( 'P', 'R', '0'+argument, ' ' );
>        status = rtems_rate_monotonic_create(rm_name, &rm_id);
>        if(status == RTEMS_SUCCESSFUL){
>        printf("Periodic Task %s created with id %d \n",
> rtems_object_get_name(rm_id,NAME_LENGTH, rm_name_buffer), rm_id);
>                }else{
>                printf("Failed to create task %s  with status %i \n",
> rm_name, status);
>
>        }
>
> while( count < 10 ) {
>    count++;
>    status = rtems_clock_get_tod( &time );
>    if(status != RTEMS_SUCCESSFUL){
>        printf("\n FAILED TO GET TIME OF THE DAY \n");
>    }
>
>  printf("\n\n %s - is running \n",
> rtems_object_get_name(rm_id,NAME_LENGTH,rm_name_buffer));
>
>  print_time( " - current time - ", &time, "\n" );
>  ticks_since_boot = rtems_clock_get_ticks_since_boot();
>  printf(" - Ticks since boot: %" PRIu32 "\n", ticks_since_boot);
>  status = rtems_rate_monotonic_period(rm_id,Periods[argument]);
>        if(status == RTEMS_TIMEOUT){
>                rtems_rate_monotonic_delete(rm_id);
>        }
>  printf("\n Iteraction %d \n", count);
> status = rtems_task_wake_after(wake[argument]);
>
> }
>
> status = rtems_task_delete( RTEMS_SELF );
> }
>
> **************************************
> Execution
> **************************************
> Ticks per second in your system: 2000
>
> Ticks since boot: 306
>
>
>
>  Task TA0  created with id 167837698
>
>  Task TA1  created with id 167837699
>
>  Task TA0  started
>
> Periodic Task PR0  created with id 1107361793
>
>
>
>
>
>
>  PR0  - is running
>
>  - current time - 00:00:00   05/05/2012
>
>  - Ticks since boot: 306
>
>
>
>  Iteraction 1
>
>
>
>
>
>  PR0  - is running
>
>  - current time - 00:00:02   05/05/2012
>
>  - Ticks since boot: 4393
>
>
>
>  Iteraction 2
>
>
>
>
>
>  PR0  - is running
>
>  - current time - 00:00:05   05/05/2012
>
>  - Ticks since boot: 10395
>
>
>
>  Iteraction 3
>
>
>
>
>
>  PR0  - is running
>
>  - current time - 00:00:08   05/05/2012
>
>  - Ticks since boot: 16420
>
>
>
>  Iteraction 4
>
>
>
>
>
>  PR0  - is running
>
>  - current time - 00:00:11   05/05/2012
>
>  - Ticks since boot: 22411
>
>
>
>  Iteraction 5
>
>
>
>
>
>  PR0  - is running
>
>  - current time - 00:00:14   05/05/2012
>
>  - Ticks since boot: 28421
>
>
>
>  Iteraction 6
>
>
>
>
>
>  PR0  - is running
>
>  - current time - 00:00:17   05/05/2012
>
>  - Ticks since boot: 34419
>
>
>
>  Iteraction 7
>
>
>
>
>
>  PR0  - is running
>
>  - current time - 00:00:20   05/05/2012
>
>  - Ticks since boot: 40411
>
>
>
>  Iteraction 8
>
>
>
>
>
>  PR0  - is running
>
>  - current time - 00:00:23   05/05/2012
>
>  - Ticks since boot: 46421
>
>
>
>  Iteraction 9
>
>
>
>
>
>  PR0  - is running
>
>  - current time - 00:00:26   05/05/2012
>
>  - Ticks since boot: 52414
>
>
>
>  Iteraction 10
>
>
> Period information by period
>
> --- CPU times are in seconds ---
>
> --- Wall times are in seconds ---
>
>   ID     OWNER COUNT MISSED          CPU TIME                  WALL TIME
>
>                                    MIN/MAX/AVG                MIN/MAX/AVG
>
> 0x42010001          9      0 0.053411/0.079910/0.069353
> 2.053487/2.080012/2.069391
>
>
>
> Quoting Gedare Bloom <gedare at rtems.org>:
>
>> Hi,
>>
>> Your code has a couple of bugs. See for example sp20 for how to
>> structure a typical RM application. One problem I see is that your
>> init task calls the periodic_task() function directly. Instead you
>> should be setting up a normal rtems_task_create/rtems_task_start with
>> periodic_task as the entry point, and periodic_task would: create an
>> rm timer, self-suspend so that all periodic tasks release
>> simultaneously (critical instant), and execute the periodic loops.
>> Init should either suspend indefinitely/delete itself or can be used
>> to stop the application similarly to how you have set it up with
>> wake_after.
>>
>> -Gedare
>>
>>
>> On Mon, Jun 4, 2012 at 5:29 PM,  <domenico.dileo at unina.it> wrote:
>>>
>>> Hello,
>>> With the code hereafter, I run two periodic tasks (PER0 and PER1)
>>> and scheduled them with the rate monotonic.
>>> Also, a log of the excution follows the code.
>>> PER0 has period 6000 ticks, while PER1 215.
>>> Questions:
>>> a) Since PER0 's pariod >> PER1's period should be PER1
>>> the first to be scheduled?
>>> According to the log, PER0 is the first one
>>> b) how should I modify the code in order to have
>>> PER1 scheduled before PER0?
>>> Of course if I swap periodic_task(task_id[0], 6000);
>>> with periodic_task(task_id[0], 215) I can observer
>>> PER1 scheuled before PER0.
>>> It seems that the first task to be scheduled
>>> is the first to execute (with the call to the function
>>> rtems_rata_monotonic_period).
>>> Thank you in advance,
>>>
>>> ****************************************************
>>> init.c code
>>> ****************************************************
>>>
>>> ...
>>>
>>>  int i = 0;
>>>  int l = 1;
>>>  for(i; i< 3; i++){
>>>        task_names[ i ] = rtems_build_name( 'P', 'R', '0'+i , ' ' );
>>>        status = rtems_rate_monotonic_create(task_names[i], &task_id[i]);
>>>        if(status == RTEMS_SUCCESSFUL){
>>>        printf("Task %s created with id %d \n",
>>> rtems_object_get_name(task_id[i],sizeof(task_names[i]),task_name),
>>> task_id[i]);
>>>                }else{
>>>                printf("Failed to create task %s  with status %i \n",
>>> rtems_object_get_name(task_id[i],NAME_LENGTH,task_name), status);
>>>        }
>>>
>>>
>>>  }
>>> //rtems_rate_monotonic_reset_all_statistics();
>>>
>>> //for(i = 0; i < 3; i++)
>>> periodic_task(task_id[0], 6000);
>>> periodic_task(task_id[1], 215);
>>>
>>>
>>> //wake up init after 5 seconds
>>>  status = rtems_task_wake_after(ticks_per_second*10);
>>>
>>>  // delete init task after starting the three working tasks
>>>   rtems_rate_monotonic_report_statistics();
>>> int j = 0;
>>> for(j; j<=3;j++){
>>>        rtems_rate_monotonic_delete(task_id[j]);
>>> }
>>>  status = rtems_task_delete( RTEMS_SELF );
>>>  rtems_shutdown_executive(result);
>>> }
>>>
>>> **********************************************
>>> tasks.c
>>> **********************************************
>>>
>>> rtems_task periodic_task(
>>>  rtems_id task_id,
>>>  rtems_interval period
>>> )
>>> {
>>>  rtems_time_of_day time;
>>>  rtems_status_code status;
>>>  rtems_interval interval;
>>>  uint32_t          ticks_since_boot;
>>>  uint32_t          count;
>>>  char task_name[NAME_LENGTH];
>>>  count = 0;
>>>  //task_id = rtems_task_self();
>>>  while( count < 10 ) {
>>>    count++;
>>>    status = rtems_clock_get_tod( &time );
>>>    if(status != RTEMS_SUCCESSFUL){
>>>        printf("\n FAILED TO GET TIME OF THE DAY \n");
>>>    }
>>>
>>>  printf("\n\n %s - is running \n",
>>> rtems_object_get_name(task_id,NAME_LENGTH,task_name));
>>>  print_time( " - current time - ", &time, "\n" );
>>>  ticks_since_boot = rtems_clock_get_ticks_since_boot();
>>>  printf(" - Ticks since boot: %" PRIu32 "\n", ticks_since_boot);
>>>  status = rtems_rate_monotonic_period(task_id,period);
>>>        if(status == RTEMS_TIMEOUT){
>>>                rtems_rate_monotonic_delete(task_id);
>>>        }
>>>
>>>  }
>>> }
>>> ****************************************************************
>>> LOG
>>> ****************************************************************
>>>
>>> Task PR0 created with id 1107361793
>>>
>>> Task PR1 created with id 1107361794
>>>
>>> Task PR2 created with id 1107361795
>>>
>>>
>>>
>>>
>>>
>>>  PR0  - is running
>>>
>>>  - current time - 00:00:00   05/05/2012
>>>
>>>  - Ticks since boot: 0
>>>
>>>
>>>
>>>
>>>
>>>  PR0  - is running
>>>
>>>  - current time - 00:00:00   05/05/2012
>>>
>>>  - Ticks since boot: 0
>>>
>>>
>>>
>>>
>>>
>>>  PR0  - is running
>>>
>>>  - current time - 00:00:03   05/05/2012
>>>
>>>  - Ticks since boot: 6076
>>>
>>>
>>>
>>>
>>>
>>>  PR0  - is running
>>>
>>>  - current time - 00:00:06   05/05/2012
>>>
>>>  - Ticks since boot: 12055
>>>
>>>
>>>
>>>
>>>
>>>  PR0  - is running
>>>
>>>  - current time - 00:00:09   05/05/2012
>>>
>>>  - Ticks since boot: 18087
>>>
>>>
>>>
>>>
>>>
>>>  PR0  - is running
>>>
>>>  - current time - 00:00:12   05/05/2012
>>>
>>>  - Ticks since boot: 24068
>>>
>>>
>>>
>>>
>>>
>>>  PR0  - is running
>>>
>>>  - current time - 00:00:15   05/05/2012
>>>
>>>  - Ticks since boot: 30099
>>>
>>>
>>>
>>>
>>>
>>>  PR0  - is running
>>>
>>>  - current time - 00:00:18   05/05/2012
>>>
>>>  - Ticks since boot: 36098
>>>
>>>
>>>
>>>
>>>
>>>  PR0  - is running
>>>
>>>  - current time - 00:00:21   05/05/2012
>>>
>>>  - Ticks since boot: 42071
>>>
>>>
>>>
>>>
>>>
>>>  PR0  - is running
>>>
>>>  - current time - 00:00:24   05/05/2012
>>>
>>>  - Ticks since boot: 48072
>>>
>>>
>>>
>>>
>>>
>>>  PR1  - is running
>>>
>>>  - current time - 00:00:27   05/05/2012
>>>
>>>  - Ticks since boot: 54096
>>>
>>>
>>>
>>>
>>>
>>>  PR1  - is running
>>>
>>>  - current time - 00:00:27   05/05/2012
>>>
>>>  - Ticks since boot: 54200
>>>
>>>
>>>
>>>
>>>
>>>  PR1  - is running
>>>
>>>  - current time - 00:00:27   05/05/2012
>>>
>>>  - Ticks since boot: 54423
>>>
>>>
>>>
>>>
>>>
>>>  PR1  - is running
>>>
>>>  - current time - 00:00:27   05/05/2012
>>>
>>>  - Ticks since boot: 54655
>>>
>>>
>>>
>>>
>>>
>>>  PR1  - is running
>>>
>>>  - current time - 00:00:27   05/05/2012
>>>
>>>  - Ticks since boot: 54840
>>>
>>>
>>>
>>>
>>>
>>>  PR1  - is running
>>>
>>>  - current time - 00:00:27   05/05/2012
>>>
>>>  - Ticks since boot: 55104
>>>
>>>
>>>
>>>
>>>
>>>  PR1  - is running
>>>
>>>  - current time - 00:00:27   05/05/2012
>>>
>>>  - Ticks since boot: 55271
>>>
>>>
>>>
>>>
>>>
>>>  PR1  - is running
>>>
>>>  - current time - 00:00:27   05/05/2012
>>>
>>>  - Ticks since boot: 55526
>>>
>>>
>>>
>>>
>>>
>>>  PR1  - is running
>>>
>>>  - current time - 00:00:27   05/05/2012
>>>
>>>  - Ticks since boot: 55712
>>>
>>>
>>>
>>>
>>>
>>>  PR1  - is running
>>>
>>>  - current time - 00:00:27   05/05/2012
>>>
>>>  - Ticks since boot: 55937
>>>
>>> Period information by period
>>>
>>> --- CPU times are in seconds ---
>>>
>>> --- Wall times are in seconds ---
>>>
>>>   ID     OWNER COUNT MISSED          CPU TIME                  WALL TIME
>>>
>>>                                    MIN/MAX/AVG                MIN/MAX/AVG
>>>
>>> 0x42010001 UI1      9      0 0.000000/0.065991/0.047860
>>> 0.000000/0.066002/0.047885
>>>
>>> 0x42010002 UI1      9      0 0.044008/0.078422/0.058316
>>> 0.044010/0.078501/0.058371
>>>
>>> 0x42010003 UI1      0      0
>>>
>>>
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> rtems-users mailing list
>>> rtems-users at rtems.org
>>> http://www.rtems.org/mailman/listinfo/rtems-users
>>
>>
>>
>
>
>
> Domenico Di Leo, PhD student, Universit? degli Studi di Napoli Federico II
> Ph:     +39 081 676770
> Fax:    +39 081 676574
> Web: http://wpage.unina.it/domenico.dileo
>




More information about the users mailing list