Lower numbers indicate higher priority.  Init defaults to the highest
priority 1 if you don't override CONFIGURE_INIT_TASK_PRIORITY.

You are using events. Probably, the print statement comes after the
event send in your task, and the event send is causing the task to
self-suspend.  That's my best guess. (Although, you should get
something different if disabling preemption.)

If Init task is lower priority, then you should expect to get this instead:

The expected result:
[TASK 0] Starting...
[TASK 0] Computed the correct floating point result.
[TASK 1] Starting...
[TASK 1] Computed the correct integer result.
[TASK 2] Starting...
[TASK 2] Computed the correct floating point result.
[TASK 3] Starting...
[TASK 3] Computed the correct integer result.
[MAIN] Waiting for testing tasks to complete...
[MAIN] All testing tasks completed.

-Gedare

On Thu, Apr 30, 2020 at 9:30 AM Fernando Domínguez Pousa
<fdpo...@gmv.com> wrote:
>
> Yes, of course!
>
>
>
> The Init function
>
>
>
> rtems_task Init(rtems_task_argument argument)
>
> {
>
>     rtems_status_code status;
>
>     rtems_name Task_name[TASKS]; /* task names */
>
>     rtems_id Task_id[TASKS]; /* task ids */
>
>     int i;
>
>
>
>     all_OK = 1;
>
>     g_init_task_id = rtems_task_self();
>
>     for(i = 0; i < TASKS; i++)
>
>     {
>
>         // Initialize Task name
>
>         Task_name[i] = rtems_build_name('T', 'T', "0" + i / 10, "0" + i % 10);
>
>
>
>         // Create Task
>
>         status = rtems_task_create(
>
>             Task_name[i],
>
>             (rtems_task_priority) 2,
>
>             RTEMS_MINIMUM_STACK_SIZE,
>
>             RTEMS_DEFAULT_MODES,
>
>             (i%2) == 0 ? RTEMS_FLOATING_POINT : RTEMS_DEFAULT_ATTRIBUTES,
>
>             &Task_id[i]);
>
>                 if (status != RTEMS_SUCCESSFUL) {
>
>                     printf(
>
>                 "[MAIN] Failed to rtems_task_create... status:%0x\n",
>
>                 status);
>
>             rtems_task_delete(RTEMS_SELF);
>
>                 }
>
>
>
>         // Start Task
>
>         status = rtems_task_start(
>
>             Task_id[i],
>
>             (i%2) == 0 ? Task1_EntryPoint : Task2_EntryPoint,
>
>             i);
>
>     }
>
>     // To give coverage code the opportunity to work, wait for children tasks
>
>     // to die first. RTEMS events are used for synchronization.
>
>     {
>
>         printf("[MAIN] Waiting for testing tasks to complete...\n");
>
>         rtems_option options = (RTEMS_EVENT_ANY | RTEMS_WAIT);
>
>         rtems_event_set in = 0;
>
>         for (i=0; i<TASKS; i++)
>
>             in |= (RTEMS_EVENT_0 << i);
>
>         rtems_event_set out;
>
>         rtems_event_set non_completed = in;
>
>         while (non_completed) {
>
>             status = rtems_event_receive(in, options, RTEMS_NO_TIMEOUT, &out);
>
>             if ( status == RTEMS_SUCCESSFUL ) {
>
>                 non_completed &= ~out;
>
>                 printf("[MAIN] Task completed.\n");
>
>                 fflush(stdout);
>
>             }
>
>         }
>
>         printf("[MAIN] All testing tasks completed.\n");
>
>         if (!all_OK)
>
>             printf("[MAIN] Some tests failed... :-(\n");
>
>         else
>
>             printf("[MAIN] All tests passed! :-)\n");
>
>         fflush(stdout);
>
>     }
>
>     exit(0);
>
> }
>
>
>
> The system.h flags:
>
>
>
> // Comment this to skip memory checks at startup
>
> #include <rtems.h>
>
>
>
> rtems_task Init(rtems_task_argument argument);
>
> rtems_task Task1_EntryPoint(rtems_task_argument argument);
>
> rtems_task Task2_EntryPoint(rtems_task_argument argument);
>
> void task_begin(int task_no);
>
> void task_end(int task_no);
>
> #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
>
> #define CONFIGURE_MAXIMUM_TASKS           64
>
> #define CONFIGURE_TICKS_PER_TIMESLICE     100
>
> #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
>
> #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
>
>
>
> #define CONFIGURE_MAXIMUM_PROCESSORS  1
>
>
>
> #define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT
>
> #ifndef DEFINE_VARS
>
> #define GLOBAL
>
> #else
>
> #define GLOBAL extern
>
> #endif
>
>
>
> GLOBAL rtems_id g_init_task_id;
>
> GLOBAL int all_OK;
>
>
>
> #include <rtems/confdefs.h>
>
>
>
>
>
> Regards,
>
>
>
> From: Joel Sherrill [mailto:j...@rtems.org]
> Sent: 30 April 2020 17:25
> To: Fernando Domínguez Pousa <fdpo...@gmv.com>
> Cc: rtems-us...@rtems.org <users@rtems.org>
> Subject: Re: RTEMS tasks timesliced instead of running to completion. 
> TIMESLICE flag is not active!
>
>
>
>
>
> On Thu, Apr 30, 2020, 10:14 AM Fernando Domínguez Pousa <fdpo...@gmv.com> 
> wrote:
>
> Hello,
>
>
>
> I am executing a program which executes four different task with testing 
> operations. These tasks were created and launched in this way:
>
>
>
> status = rtems_task_create(Task_name[i], (rtems_task_priority) 2, 
> RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES,
>
>             (i%2) == 0 ? RTEMS_FLOATING_POINT : RTEMS_DEFAULT_ATTRIBUTES, 
> &Task_id[i]);
>
>
>
> status = rtems_task_start(Task_id[i], (i%2) == 0 ? Task1_EntryPoint : 
> Task2_EntryPoint, i);
>
>
>
> As you can see all task are created with the same priority, and launched one 
> after the other inside a for loop. They are configured in default modes, so 
> time slicing is disabled by default  (all mode bits are 0). This result would 
> be expected due to each task would run-to-completion because all tasks have 
> the same priority:
>
>
>
> The expected result:
>
> [MAIN] Waiting for testing tasks to complete...
>
> [TASK 0] Starting...
>
> [TASK 0] Computed the correct floating point result.
>
> [TASK 1] Starting...
>
> [TASK 1] Computed the correct integer result.
>
> [TASK 2] Starting...
>
> [TASK 2] Computed the correct floating point result.
>
> [TASK 3] Starting...
>
> [TASK 3] Computed the correct integer result.
>
> [MAIN] All testing tasks completed.
>
>
>
> Nevertheless, using RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_MODES | 
> RTEMS_TIMESLICE or RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT either as 
> rtems_mode, the result is always the same.
>
>
>
> The actual result:
>
> [MAIN] Waiting for testing tasks to complete...
>
> [TASK 0] Starting...
>
> [TASK 1] Starting...
>
> [TASK 2] Starting...
>
> [TASK 3] Starting...
>
> [TASK 0] Computed the correct floating point result.
>
> [TASK 1] Computed the correct integer result.
>
> [TASK 2] Computed the correct floating point result.
>
> [TASK 3] Computed the correct integer result.
>
> [MAIN] All testing tasks completed.
>
>
>
> At RTEMS API Guide:
>
>
>
> The timeslicing component is used by the RTEMS scheduler to determine how the 
> processor is allocated to tasks of equal priority. If timeslicing is enabled 
> (RTEMS_TIMESLICE), then RTEMS will limit the amount of time the task can 
> execute before the processor is allocated to another ready task of equal 
> priority.
>
>
>
> The length of the timeslice is application dependent and specified in the 
> Configuration Table. If timeslicing is disabled (RTEMS_NO_TIMESLICE), then 
> the task will be allowed to execute until a task of higher priority is made 
> ready. However I have not any task with higher priority, Init task priority 
> is lower.
>
>
>
> If RTEMS_NO_PREEMPT is selected, then the timeslicing component is ignored by 
> the scheduler.
>
>
>
> How can I execute this tasks in a run to completion fashion for same priority 
> tasks? Task 0 starts and ends, then Task1 starts and ends… etc,
>
>
>
> There are many things that could be happening. Can you post the program?
>
>
>
> Regards,
>
>
>
> Fer.
>
>
>
>
> P Please consider the environment before printing this e-mail.
>
> _______________________________________________
> users mailing list
> users@rtems.org
> http://lists.rtems.org/mailman/listinfo/users
>
>
> P Please consider the environment before printing this e-mail.
> _______________________________________________
> users mailing list
> users@rtems.org
> http://lists.rtems.org/mailman/listinfo/users
_______________________________________________
users mailing list
users@rtems.org
http://lists.rtems.org/mailman/listinfo/users

Reply via email to