Thread question
Joel Sherrill <joel@OARcorp.com>
joel.sherrill at OARcorp.com
Mon Dec 13 17:10:51 UTC 2004
Kenneth Peters wrote:
> At 10:23 AM 12/13/2004 -0600, Joel Sherrill <joel at OARcorp.com> wrote:
>
>> Steve Holle wrote:
>>
>>> At 05:05 PM 12/10/2004, Angelo Fraietta wrote:
>>>
>>>> Steve Holle wrote:
>>>>
>>>>> If I disable task 1A, 1B keeps running even with the streaming
>>>>> audio running.
>>>>>
>>>>> I assumes that since 1A and 1B where set up to timeslice that
>>>>> whatever time was left 1A and 1B would get serviced. That is
>>>>> obviously a false assumption.
>>>>
>>>>
>>>>
>>>> I am pretty sure that if a higher priority thread takes control at
>>>> any stage, the thread that was switched out will get switched back
>>>> in; however, it's timeslices will start again at zero. It is
>>>> possible in that case for one thread to get starved because the
>>>> thread of equal priority keeps getting switched back with it's
>>>> timeslice count set back to the start
>>>
>>>
>>> I'm not sure I understand this. Why should it's timeslice restart?
>>> That seems counter-intuitive. That would explain the symptoms we are
>>> seeing but I'm not sure I understand the purpose and how to use
>>> timeslicing if this is the case.
>>
>>
>> THe way timeslicing is defined in the Classic API, it is just a limit on
>> how long a thread can run without giving up the processor. If it ever
>> gives up the CPU, it will have its timeslice reset when it runs again.
>>
>> POSIX has a slightly different definition of timeslice quantum
>> handling. It is not reset until it is actually exhausted.
>>
>> A quick hack to try the POSIX version is to change the taskcreate.c
>> call to _Thread_initialize to use EXHAUST_TIMESLICE not RESET_TIMESLICE.
>> There has been a wishlist for a while to be able to specify which
>> algorithm to use. Maybe you have finally got a case where it matters. :)
>>
>> --joel
>
>
> FYI, I've been using a hacked version of rtems_task_mode() to set these
> parameters after creating classic tasks (but before starting them
> executing). It has worked fine for me. See diffs against 4.5.0
> taskmode.c below.
Does this address the situation he is describing?
> I did it this way because I did not want to hack the OS itself (for
> administrative reasons we need to use an "oficial release" as much as
> possible), so I made my own copy of taskmode.c to build into my own code
> and changed the name to reveal the guilty.
I don't really have a problem with this feature and think it already has
a PR. If a patch were to show up against the CVS source with:
+ a modified task create
+ a modified task mode
+ updated documentation
Something tells me it would get merged. :)
> Ken Peters
>
> 12c12
> < * $Id: taskmode.c,v 1.2 1999/11/17 17:50:27 joel Exp $
> ---
> > * $Id: electra_rtems_taskmode.c,v 1.3 2004/09/16 18:06:06 kenp Exp $
> 30a31,32
> > #include "../include/electra_task_control.h"
> >
> 32a35,43
> > * electra_rtems_task_mode
> > * Copied from rtems-4.5.0 "taskmode.c" and modified by Ken Peters
> 03 Oct 2003
> > * to allow changing a task's budget_algorithm for timeslicing to
> > * not reset the task's timeslice every time the task is dispatched.
> > * That functionality is supported by the RTEMS POSIX interface,
> but not
> > * the classic interface.
> > * Also set the task's "Start.budget_algorithm", so if the task is
> restarted
> > * it keeps the selected timeslicing method.
> > *
> 48c59
> < rtems_status_code rtems_task_mode(
> ---
> > rtems_status_code electra_rtems_task_mode(
> 51c62,64
> < rtems_mode *previous_mode_set
> ---
> > rtems_mode *previous_mode_set,
> > boolean use_timeslice_exhaustion,
> > boolean *previous_use_timeslice_exhaustion
> 76a90,94
> > if ( executing->budget_algorithm ==
> THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE )
> > *previous_use_timeslice_exhaustion = TRUE;
> > else
> > *previous_use_timeslice_exhaustion = FALSE;
> >
> 85,87c103,115
> < if ( _Modes_Is_timeslice(mode_set) )
> < executing->budget_algorithm =
> THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
> < else
> ---
> > if ( _Modes_Is_timeslice(mode_set) ) {
> > if ( use_timeslice_exhaustion ) {
> > executing->budget_algorithm
> > = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
> > executing->Start.budget_algorithm
> > = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
> > } else {
> > executing->budget_algorithm
> > = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
> > executing->Start.budget_algorithm
> > = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
> > }
> > } else {
> 88a117
> > }
>
>
--
Joel Sherrill, Ph.D. Director of Research & Development
joel at OARcorp.com On-Line Applications Research
Ask me about RTEMS: a free RTOS Huntsville AL 35805
Support Available (256) 722-9985
More information about the users
mailing list