FIFO and Round Robin

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

FIFO and Round Robin

Jump to solution
9,615 Views
M_ttferrari
Contributor III

Hi, I have a doubt about tasks in fifo and round robind mode.

 

The MQXUG says that FIFO and Round Robin mode can work together, so if you want to create a task in round robin mode, you need to set MQX_HAS_TIME_SLICE. Well, If I do it, how can I create a task to work in FIFO mode having MQX_HAS_TIME_SLICE setted?

 

I'm a bit confused...

 

Thank you

1 Solution
3,825 Views
JuroV
NXP Employee
NXP Employee

FIFO: First task in, First task out... Means that as you insert task to the queue, they are in the order processed (the time a task will run is INFINITE, or the task itself can give up CPU time). Every task is defaultly inserted in FIFO queue.

Round-Robin: The same as FIFO, but the time is NOT INFINITE: the time is restricted by NUMBER OF TICKS dedicated for the task. The task running in Round-Robin has MQX_TIME_SLICE_TASK flag set and also, number of ticks).

View solution in original post

0 Kudos
Reply
9 Replies
3,825 Views
PetrL
NXP Employee
NXP Employee

Hi, FIFO and Round Robin can work together on one processor, they cannot both set for the one task.

 

 

Basically those tasks which have TIME_SLICE  flag setted are time sliced with other task on given priority.

 

The priority based sheduling is still working for all tasks - that means the higher prio task will be executed if needed.

 

PetrL

0 Kudos
Reply
3,825 Views
M_ttferrari
Contributor III

Hi PetrL

 

I know that, but I don't know how I tell to TASK_TEMPLATE that one task has time slice and another one has a FIFO schedule mode independly of priorities. Because when MQX_HAS_TIME_SLICE is setted, the last elements of TESK_TEMPLATE correspond to time slice of the task... then if you put 0 in this element, the scheduler will give a minimum task time when I want that this task work in FIFO mode not in Round Robin. Is this correct doesn't it?

 

Thanks.

 

Matt 

0 Kudos
Reply
3,825 Views
JuroV
NXP Employee
NXP Employee

Partially you are right. The scheduler works like this (steps):

1) Only ready queue with highest priority (queue of ready tasks with highest priorities) is considered to be run (ignore other= lower priority tasks)

2.1) Iif current task has time slice, then:

2.1.1) if current task's time slice has counted down, then reschedule to the next task - scheduling is DONE

2.2) Schedule the current task - scheduling is DONE

 

If the kernel was not compiled with MQX_HAS_TIME_SLICE, then remove point 2.1 Note that setting time slice 0 for a task having time slice flag set has no meaning...

0 Kudos
Reply
3,825 Views
M_ttferrari
Contributor III

Hi JuroV. 

 

I understand about how the scheduler handles the ready task. My question is, how do I declare a task to work in FIFO mode having MQX_HAS_TIME_SLICE setted?

 

Thanks for your anwers

0 Kudos
Reply
3,825 Views
JuroV
NXP Employee
NXP Employee

Just do not insert flag MQX_TIME_SLICE_TASK to the task template.

0 Kudos
Reply
3,825 Views
M_ttferrari
Contributor III

Thank you JuroV, Now the answer looks obvious but I didn't understand it

0 Kudos
Reply
3,826 Views
JuroV
NXP Employee
NXP Employee

FIFO: First task in, First task out... Means that as you insert task to the queue, they are in the order processed (the time a task will run is INFINITE, or the task itself can give up CPU time). Every task is defaultly inserted in FIFO queue.

Round-Robin: The same as FIFO, but the time is NOT INFINITE: the time is restricted by NUMBER OF TICKS dedicated for the task. The task running in Round-Robin has MQX_TIME_SLICE_TASK flag set and also, number of ticks).

0 Kudos
Reply
3,825 Views
jambriz
Contributor I

Hi JuroV

I understand your response.

 

I have a question related with RR

 

I'm using MQX 3.7

In my main.c have

 

TASK_TEMPLATE_STRUCT MQX_template_list[] =
{
/* Task number, Entry point, Stack, Pri, String, Auto? */
{MAIN_TASK, Main_task, 2000, 9, "main", MQX_AUTO_START_TASK | MQX_TIME_SLICE_TASK, 0L, 2 },
{SECOND_TASK, Second_task, 2000, 9, "second", MQX_AUTO_START_TASK | MQX_TIME_SLICE_TASK, 0l, 2},
{0, 0, 0, 0, 0, 0, }
};

 

In mqx.h said:

/*
** Tasks with this attribute will use the time slice
** scheduler within the kernel
*/
#if MQX_HAS_TIME_SLICE
#define MQX_TIME_SLICE_TASK (0x04)
#endif

 

I checked the file small_ram_config.h

And I saw:

 

#ifndef MQX_HAS_TIME_SLICE
#define MQX_HAS_TIME_SLICE 0
#endif

 

I changed the value, for 1

 

#ifndef MQX_HAS_TIME_SLICE
#define MQX_HAS_TIME_SLICE 1
#endif

 

But In CodeWarrior when I saw this code

#if MQX_HAS_TIME_SLICE
#define MQX_TIME_SLICE_TASK (0x04)
#endif

 

it looks like desactivated

:smileysad:

 

I suppose that the flag: MQX_HAS_TIME_SLICE doesn't udated by MQX, 

am I correct?

 

When I execute this program ( that has the 2 task )

 

void Main_task(uint_32 initial_data)
{
int a;
for(a=0; a< 32000 ; a++)
{
printf("hola\t");
}

 

void Second_task(uint_32 initial_data)

{
int a;
for(a=0; a< 32000 ; a++)
{
printf("adios\t");
}
}

 

Execute the program like a FIFO , it doesn't execute like Round Robin

:smileysad:

 

What are the correct modifications in the config files for change to RR scheduling?

 

best regards

jam

 

0 Kudos
Reply
3,825 Views
wenxue
NXP Employee
NXP Employee

Hi,

I meet the same question with you. Now I have addressed it. The step is:

1)  open   <mqx_install_dir>/build/<board>/uv4/build_libs.uvmpw

1)  add    #define MQX_HAS_TIME_SLICE      1    in user_config.h

搜狗截图20141011153141.png

2)  Bebuild the MQX libraries(Please note that: you should Batch build)

搜狗截图20141011153332.png

3) Rebuild your application.