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