Clarification on Rate montonic

domenico.dileo at unina.it domenico.dileo at unina.it
Wed Jun 6 15:58:40 UTC 2012


Dear Gedare and all other interested users,
in the init there is a quite stupid bug,
  the for loop includes also the lines

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 );

which shouldn't be there.
anyway thank  you

Quoting Gedare Bloom <gedare at rtems.org>:

> 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
>>
>
>



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