<font size=2 face="sans-serif">Thank you for your reply!</font>
<br>
<br><font size=2 face="sans-serif">To Kuan-Hsun Chen:</font>
<br><font size=2 face="sans-serif">This is my test eviroment and test case:</font>
<br><font size=2 face="sans-serif">Test eviroment:</font>
<table border width=100%>
<tr valign=top>
<td width=100%><font size=2 face="sans-serif">rtems-bsp: arm/xilinx_zynq_a9_qemu</font>
<br><font size=2 face="sans-serif">rtems version: 5.1</font></table>
<br>
<br><font size=2 face="sans-serif">Test case:</font>
<table border width=100%>
<tr valign=top>
<td width=100%><font size=2 face="sans-serif">#include <rtems.h></font>
<br><font size=2 face="sans-serif">#include <stdlib.h></font>
<br><font size=2 face="sans-serif">#include <stdio.h></font>
<br>
<br><font size=2 face="sans-serif">rtems_id Task[3];</font>
<br>
<br><font size=2 face="sans-serif">static void taskRunner(rtems_task_argument
arg)</font>
<br><font size=2 face="sans-serif">{</font>
<br><font size=2 face="sans-serif">    while(1)</font>
<br><font size=2 face="sans-serif">    {</font>
<br><font size=2 face="sans-serif">        if (arg
== 2)</font>
<br><font size=2 face="sans-serif">        {</font>
<br><font size=2 face="sans-serif">           
rtems_task_wake_after(1);</font>
<br><font size=2 face="sans-serif">        }</font>
<br><font size=2 face="sans-serif">        printk("task
TST%d running\n",arg);</font>
<br><font size=2 face="sans-serif">    }</font>
<br><font size=2 face="sans-serif">}</font>
<br>
<br><font size=2 face="sans-serif">rtems_task Init(</font>
<br><font size=2 face="sans-serif">        rtems_task_argument
ignored</font>
<br><font size=2 face="sans-serif">        )</font>
<br><font size=2 face="sans-serif">{</font>
<br><font size=2 face="sans-serif">    rtems_status_code ret
= rtems_task_create(rtems_build_name('T', 'S', 'T', '0'), 128, RTEMS_MINIMUM_STACK_SIZE,</font>
<br><font size=2 face="sans-serif">           
     RTEMS_TIMESLICE | RTEMS_PREEMPT  , RTEMS_LOCAL,
&Task[0]);</font>
<br><font size=2 face="sans-serif">    ret = rtems_task_create(rtems_build_name('T',
'S', 'T', '1'), 128, RTEMS_MINIMUM_STACK_SIZE,</font>
<br><font size=2 face="sans-serif">           
     RTEMS_TIMESLICE | RTEMS_PREEMPT , RTEMS_LOCAL, &Task[1]);</font>
<br><font size=2 face="sans-serif">    ret = rtems_task_create(rtems_build_name('T',
'S', 'T', '2'), 2, RTEMS_MINIMUM_STACK_SIZE,</font>
<br><font size=2 face="sans-serif">           
    RTEMS_TIMESLICE | RTEMS_PREEMPT , RTEMS_LOCAL, &Task[2]);</font>
<br>
<br><font size=2 face="sans-serif">    ret = rtems_task_start(Task[0],
taskRunner,0);</font>
<br><font size=2 face="sans-serif">    ret = rtems_task_start(Task[1],
taskRunner,1);</font>
<br><font size=2 face="sans-serif">    ret = rtems_task_start(Task[2],
taskRunner,2);</font>
<br>
<br><font size=2 face="sans-serif">    rtems_task_exit();</font>
<br><font size=2 face="sans-serif">}</font></table>
<br>
<br><font size=2 face="sans-serif">To </font><tt><font size=2>Gedare Bloom</font></tt><font size=2 face="sans-serif">:</font>
<br><font size=2 face="sans-serif">It works</font><tt><font size=2> only
when pthread_setschedparam</font></tt><font size=2 face="sans-serif">()
with </font><font size=2>SCHED_RR</font><font size=2 face="sans-serif">
was called after rtems_task_start().</font>
<br><font size=2 face="sans-serif">And when call rtems_task_mode() or rtems_task_restart(),
the same problem will appears again, seems that </font><font size=2>SCHED_RR</font><font size=2 face="sans-serif">
flag was cleaned away.</font>
<br>
<br><font size=2 face="sans-serif">Regards</font>
<br><font size=2 face="sans-serif">Wang</font>
<br>
<br><tt><font size=2>"Gedare Bloom" <gedare@rtems.org>
2021/06/10 22:24:51:<br>
<br>
> On Thu, Jun 10, 2021 at 4:10 AM Kuan-Hsun Chen <c0066c@gmail.com>
wrote:<br>
> ><br>
> > Hello,<br>
> ><br>
> > If that is the case, I think we should probably first agree on,
<br>
> what is the preferred behavior under the circumstance. I think <br>
> picking heir tasks always in the same order is a proper design, but
<br>
> the preemption should not corrupt the "fair" time slicing
in my <br>
> opinion (so follow what you observe). From what I can find in the
<br>
> documents or source code, e.g.,<br>
> ><br>
> > </font></tt><a href="https://docs.rtems.org/branches/master/c-user/task/"><tt><font size=2>https://docs.rtems.org/branches/master/c-user/task/</font></tt></a><tt><font size=2><br>
> background.html?highlight=slice#task-priority (the latest version)<br>
> > </font></tt><a href="https://docs.rtems.org/releases/rtemsdocs-4.6.2/share/rtems/html/"><tt><font size=2>https://docs.rtems.org/releases/rtemsdocs-4.6.2/share/rtems/html/</font></tt></a><tt><font size=2><br>
> c_user/c_user00303.html (old version)<br>
> > </font></tt><a href=https://github.com/RTEMS/rtems/blob/master/cpukit/include/rtems/><tt><font size=2>https://github.com/RTEMS/rtems/blob/master/cpukit/include/rtems/</font></tt></a><tt><font size=2><br>
> rtems/tasks.h<br>
> ><br>
> > There is no definition or clarification about the problem you
<br>
> mentioned. To answer some of your questions:<br>
> ><br>
> > I think there is no WHY, but this probably can be patched if
we <br>
> deem it as a problem.<br>
> > Timeslicing in RTOS usually follows a round-robin manner according<br>
> to an given order. To have a determinate behavior, I think it makes
<br>
> sense that it always pick Task B as heir task.<br>
> ><br>
> > Could you provide your testing code so that we can repeat the
same<br>
> scenario? I would like to give a try as well.<br>
> ><br>
> > Best regards,<br>
> > Kuan-Hsun<br>
> ><br>
> ><br>
> > On Thu, Jun 10, 2021 at 11:25 AM <wangqiang3@sugon.com>
wrote:<br>
> >><br>
> >> Description of the issue:<br>
> >> I created three tasks, Task A, Task B and Task C. All tasks
are <br>
> based on RTEMS_TIMESLICE | RTEMS_PREEMPT , Task A has a higher <br>
> priority than other tasks, Task B has the same priority as Task C.<br>
> >> Tasks B and C loop forever, Task A sleeps 1 TICK on an endless
<br>
> loop. When I test, I find that task C is not scheduled.<br>
> >><br>
> >> Hope result:<br>
> >> I was expecting tasks A, B, and C to be scheduled. Task A
can <br>
> preempt task B and C. Tasks B and C can switch to each other when
<br>
> the time slice runs out.<br>
> >><br>
> >> Actual result:<br>
> >> When task A preempts task B and run out its timeslice, then
<br>
> switch to task B, task B's timeslice will reset to <br>
> _Watchdog_Ticks_per_timeslice.<br>
> >> While the task B is still running, Task A preempts task B
again. <br>
> Task A will pick up task B as heir task and reset task B's timeslice.<br>
> >> This will cause task C never be scheduled.<br>
> >><br>
> >> My doubts :<br>
> >> 1. Why must reset the time slice every time when switch tasks.<br>
> Because THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE is set.<br>
> <br>
> >> 2. Why the scheduler only pick up Task B as heir task?<br>
> The timeslice never exhausts, and the task never yields.<br>
> <br>
> >> 3. Can I comment the following code in _Thread_Do_dispatch()?
Is <br>
> there any problem if I change it this way?<br>
> >>     if ( heir->budget_algorithm == <br>
> THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )<br>
> >>         heir->cpu_time_budget = <br>
> rtems_configuration_get_ticks_per_timeslice();<br>
> <br>
> No, this breaks THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE<br>
> <br>
> >> 4. I found that only in POSIX can I use the algorithm <br>
> THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE , RTEMS classics api
<br>
> only can use THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE.<br>
> >>    Can I use THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE
in <br>
> RTEMS classics api.nd rtems_task_mode.<br>
> >> 5. Can anyone give some suggestions to solve the problem?
thanks!<br>
> <br>
> Classic and POSIX APIs can be mixed. It is a poorly documented benefit<br>
> of RTEMS. I think in this case, you should be able to use<br>
> pthread_setschedparam(...) with passing policy == SCHED_RR to get
the<br>
> behavior you seek. You have to use posix priorities in the sched_param<br>
> argument. though, or else your thread will have its priority changed.<br>
> Pass the task_id instead of pthread_t as the first argument, and the<br>
> rest should work itself out. Do let us know if that works or it<br>
> doesn't work/you have more questions.<br>
> <br>
> Gedare<br>
> <br>
> >> _______________________________________________<br>
> >> users mailing list<br>
> >> users@rtems.org<br>
> >> </font></tt><a href=http://lists.rtems.org/mailman/listinfo/users><tt><font size=2>http://lists.rtems.org/mailman/listinfo/users</font></tt></a><tt><font size=2><br>
> >><br>
> >> --<br>
> >> Diese Mail wurde mobil geschrieben. Etwaige Rechtschreibfehler
<br>
> sind volle Absicht und als großzügiges Geschenk zu verstehen.<br>
> >><br>
> ><br>
> > _______________________________________________<br>
> > users mailing list<br>
> > users@rtems.org<br>
> > </font></tt><a href=http://lists.rtems.org/mailman/listinfo/users><tt><font size=2>http://lists.rtems.org/mailman/listinfo/users</font></tt></a><tt><font size=2><br>
</font></tt>