source: rtems/cpukit/score/src/schedulercbsunblock.c @ 82db8e56

4.115
Last change on this file since 82db8e56 was 82db8e56, checked in by Joel Sherrill <joel.sherrill@…>, on 09/15/11 at 15:49:32

2011-09-15 Petr Benes <benesp16@…>

PR 1906/cpukit

  • sapi/Makefile.am, sapi/preinstall.am, sapi/include/confdefs.h, score/Makefile.am, score/preinstall.am: Add the CBS (Constant Bandwidth Server) scheduler. This is a complex scheduling policy built atop of the EDF scheduler. Unlike other schedulers, this one provides a user API and handles not only deadlines of tasks but also claimed budget per period. The main aim of the scheduler is isolation of tasks so that each task is guaranteed to meet all deadlines regardless of how other tasks behave.
  • sapi/include/rtems/cbs.h, sapi/inline/rtems/cbs.inl, score/include/rtems/score/schedulercbs.h, score/src/schedulercbs.c, score/src/schedulercbsattachthread.c, score/src/schedulercbscleanup.c, score/src/schedulercbscreateserver.c, score/src/schedulercbsdestroyserver.c, score/src/schedulercbsdetachthread.c, score/src/schedulercbsgetapprovedbudget.c, score/src/schedulercbsgetexecutiontime.c, score/src/schedulercbsgetparameters.c, score/src/schedulercbsgetremainingbudget.c, score/src/schedulercbsgetserverid.c, score/src/schedulercbsreleasejob.c, score/src/schedulercbssetparameters.c, score/src/schedulercbsunblock.c: New files.
  • Property mode set to 100644
File size: 2.5 KB
Line 
1/*
2 *  Copyright (C) 2011 Petr Benes.
3 *  Copyright (C) 2011 On-Line Applications Research Corporation (OAR).
4 *
5 *  The license and distribution terms for this file may be
6 *  found in the file LICENSE in this distribution or at
7 *  http://www.rtems.com/license/LICENSE.
8 *
9 *  $Id$
10 */
11
12#if HAVE_CONFIG_H
13#include "config.h"
14#endif
15
16#include <rtems/system.h>
17#include <rtems/score/scheduler.h>
18#include <rtems/score/schedulercbs.h>
19
20void _Scheduler_CBS_Unblock(
21  Thread_Control    *the_thread
22)
23{
24  Scheduler_CBS_Per_thread *sched_info;
25  Scheduler_CBS_Server *serv_info;
26  Priority_Control new_priority;
27
28  _Scheduler_EDF_Enqueue(the_thread);
29  /* TODO: flash critical section? */
30
31  sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
32  serv_info = (Scheduler_CBS_Server *) sched_info->cbs_server;
33
34  /*
35   * Late unblock rule for deadline-driven tasks. The remaining time to
36   * deadline must be sufficient to serve the remaining computation time
37   * without increased utilization of this task. It might cause a deadline
38   * miss of another task.
39   */
40  if (serv_info) {
41    time_t deadline = serv_info->parameters.deadline;
42    time_t budget = serv_info->parameters.budget;
43    time_t deadline_left = the_thread->cpu_time_budget;
44    time_t budget_left = the_thread->real_priority -
45                           _Watchdog_Ticks_since_boot;
46
47    if ( deadline*budget_left > budget*deadline_left ) {
48      /* Put late unblocked task to background until the end of period. */
49      new_priority = the_thread->Start.initial_priority;
50      if ( the_thread->real_priority != new_priority )
51        the_thread->real_priority = new_priority;
52      if ( the_thread->current_priority != new_priority )
53        _Thread_Change_priority(the_thread, new_priority, true);
54    }
55  }
56
57  /*
58   *  If the thread that was unblocked is more important than the heir,
59   *  then we have a new heir.  This may or may not result in a
60   *  context switch.
61   *
62   *  Normal case:
63   *    If the current thread is preemptible, then we need to do
64   *    a context switch.
65   *  Pseudo-ISR case:
66   *    Even if the thread isn't preemptible, if the new heir is
67   *    a pseudo-ISR system task, we need to do a context switch.
68   */
69  if ( _Scheduler_Is_priority_higher_than( the_thread->current_priority,
70       _Thread_Heir->current_priority)) {
71    _Thread_Heir = the_thread;
72    if ( _Thread_Executing->is_preemptible ||
73         the_thread->current_priority == 0 )
74      _Thread_Dispatch_necessary = true;
75  }
76}
Note: See TracBrowser for help on using the repository browser.