Notice: We have migrated to GitLab launching 2024-05-01 see here: https://gitlab.rtems.org/

Ticket #1906: cbs_scheduler4.diff

File cbs_scheduler4.diff, 43.0 KB (added by Petr Benes, on 09/14/11 at 19:38:21)

CBS scheduler implementation - version 2

  • cpukit/sapi/Makefile.am

    diff --git a/cpukit/sapi/Makefile.am b/cpukit/sapi/Makefile.am
    index 416b29e..bd14e79 100644
    a b include_rtems_HEADERS += include/rtems/fatal.h 
    1515include_rtems_HEADERS += include/rtems/init.h
    1616include_rtems_HEADERS += include/rtems/io.h
    1717include_rtems_HEADERS += include/rtems/mptables.h
     18include_rtems_HEADERS += include/rtems/cbs.h
    1819include_rtems_HEADERS += include/rtems/rbtree.h
    1920include_rtems_HEADERS += include/rtems/sptables.h
    2021
    EXTRA_DIST = include/rtems/README 
    2223
    2324include_rtems_HEADERS += inline/rtems/chain.inl
    2425include_rtems_HEADERS += inline/rtems/extension.inl
     26include_rtems_HEADERS += inline/rtems/cbs.inl
    2527include_rtems_HEADERS += inline/rtems/rbtree.inl
    2628
    2729## src
  • cpukit/sapi/include/confdefs.h

    diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h
    index d85a553..5796909 100644
    a b rtems_fs_init_functions_t rtems_fs_init_helper = 
    574574 *  CONFIGURE_SCHEDULER_SIMPLE     - Light-weight Priority Scheduler
    575575 *  CONFIGURE_SCHEDULER_SIMPLE_SMP - Simple SMP Priority Scheduler
    576576 *  CONFIGURE_SCHEDULER_EDF        - EDF Scheduler
     577 *  CONFIGURE_SCHEDULER_CBS        - CBS Scheduler
    577578 *
    578579 * If no configuration is specified by the application, then
    579580 * CONFIGURE_SCHEDULER_PRIORITY is assumed to be the default.
    rtems_fs_init_functions_t rtems_fs_init_helper = 
    600601    !defined(CONFIGURE_SCHEDULER_PRIORITY) && \
    601602    !defined(CONFIGURE_SCHEDULER_SIMPLE) && \
    602603    !defined(CONFIGURE_SCHEDULER_SIMPLE_SMP) && \
    603     !defined(CONFIGURE_SCHEDULER_EDF)
     604    !defined(CONFIGURE_SCHEDULER_EDF) && \
     605    !defined(CONFIGURE_SCHEDULER_CBS)
    604606  #if defined(RTEMS_SMP) && defined(CONFIGURE_SMP_APPLICATION)
    605607    #define CONFIGURE_SCHEDULER_SIMPLE_SMP
    606608  #else
    rtems_fs_init_functions_t rtems_fs_init_helper = 
    676678    _Configure_From_workspace(sizeof(Scheduler_EDF_Per_thread)))
    677679#endif
    678680
     681/*
     682 * If the CBS Scheduler is selected, then configure for it.
     683 */
     684#if defined(CONFIGURE_SCHEDULER_CBS)
     685  #include <rtems/score/schedulercbs.h>
     686  #define CONFIGURE_SCHEDULER_ENTRY_POINTS SCHEDULER_CBS_ENTRY_POINTS
     687
     688  #ifndef CONFIGURE_CBS_MAXIMUM_SERVERS
     689    #define CONFIGURE_CBS_MAXIMUM_SERVERS CONFIGURE_MAXIMUM_TASKS
     690  #endif
     691
     692  #ifdef CONFIGURE_INIT
     693    uint32_t _Scheduler_CBS_Maximum_servers = CONFIGURE_CBS_MAXIMUM_SERVERS;
     694  #endif
     695
     696  /**
     697   * define the memory used by the CBS scheduler
     698   */
     699  #define CONFIGURE_MEMORY_FOR_SCHEDULER ( \
     700    _Configure_From_workspace((sizeof(Scheduler_CBS_Server) + \
     701        sizeof(Scheduler_CBS_Server*)) * CONFIGURE_CBS_MAXIMUM_SERVERS))
     702  #define CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER ( \
     703    _Configure_From_workspace(sizeof(Scheduler_CBS_Per_thread)))
     704#endif
     705
    679706#if defined(CONFIGURE_SCHEDULER_USER)
    680707  #define CONFIGURE_SCHEDULER_ENTRY_POINTS \
    681708          CONFIGURE_SCHEDULER_USER_ENTRY_POINTS
  • new file cpukit/sapi/include/rtems/cbs.h

    diff --git a/cpukit/sapi/include/rtems/cbs.h b/cpukit/sapi/include/rtems/cbs.h
    new file mode 100644
    index 0000000..d016e5c
    - +  
     1/**
     2 * @file rtems/cbs.h
     3 *
     4 *  This include file contains all the constants and structures associated
     5 *  with the CBS library in RTEMS.
     6 */
     7
     8/*
     9 *  Copyright (C) 2011 Petr Benes.
     10 *  Copyright (C) 2011 On-Line Applications Research Corporation (OAR).
     11 *
     12 *  The license and distribution terms for this file may be
     13 *  found in the file LICENSE in this distribution or at
     14 *  http://www.rtems.com/license/LICENSE.
     15 *
     16 *  $Id$
     17 */
     18
     19#ifndef CONFIGURE_SCHEDULER_CBS
     20  #error "cbs.h available only with CONFIGURE_SCHEDULER_CBS"
     21#endif
     22
     23#ifndef _RTEMS_CBS_H
     24#define _RTEMS_CBS_H
     25
     26#ifdef __cplusplus
     27extern "C" {
     28#endif
     29
     30#include <stdint.h>
     31#include <rtems/score/schedulercbs.h>
     32
     33/* Return codes. */
     34#define RTEMS_CBS_OK                       SCHEDULER_CBS_OK
     35#define RTEMS_CBS_ERROR_GENERIC            SCHEDULER_CBS_ERROR_GENERIC
     36#define RTEMS_CBS_ERROR_NO_MEMORY          SCHEDULER_CBS_ERROR_NO_MEMORY
     37#define RTEMS_CBS_ERROR_INVALID_PARAMETER  SCHEDULER_CBS_ERROR_INVALID_PARAM
     38#define RTEMS_CBS_ERROR_UNAUTHORIZED       SCHEDULER_CBS_ERROR_UNAUTHORIZED
     39#define RTEMS_CBS_ERROR_UNIMPLEMENTED      SCHEDULER_CBS_ERROR_UNIMPLEMENTED
     40#define RTEMS_CBS_ERROR_MISSING_COMPONENT  SCHEDULER_CBS_ERROR_MISSING_COMPONENT
     41#define RTEMS_CBS_ERROR_INCONSISTENT_STATE SCHEDULER_CBS_ERROR_INCONSISTENT_STATE
     42#define RTEMS_CBS_ERROR_SYSTEM_OVERLOAD    SCHEDULER_CBS_ERROR_SYSTEM_OVERLOAD
     43#define RTEMS_CBS_ERROR_INTERNAL_ERROR     SCHEDULER_CBS_ERROR_INTERNAL_ERROR
     44#define RTEMS_CBS_ERROR_NOT_FOUND          SCHEDULER_CBS_ERROR_NOT_FOUND
     45#define RTEMS_CBS_ERROR_FULL               SCHEDULER_CBS_ERROR_FULL
     46#define RTEMS_CBS_ERROR_EMPTY              SCHEDULER_CBS_ERROR_EMPTY
     47#define RTEMS_CBS_ERROR_NOSERVER           SCHEDULER_CBS_ERROR_NOSERVER
     48
     49/** Callback function invoked when a budget overrun of a task occurs. */
     50typedef Scheduler_CBS_Budget_overrun rtems_cbs_budget_overrun;
     51
     52/** Server id. */
     53typedef Scheduler_CBS_Server_id rtems_cbs_server_id;
     54
     55/** Server parameters. */
     56typedef Scheduler_CBS_Parameters rtems_cbs_parameters;
     57
     58#include <rtems/cbs.inl>
     59
     60#ifdef __cplusplus
     61}
     62#endif
     63
     64#endif
     65/* end of include file */
  • new file cpukit/sapi/inline/rtems/cbs.inl

    diff --git a/cpukit/sapi/inline/rtems/cbs.inl b/cpukit/sapi/inline/rtems/cbs.inl
    new file mode 100644
    index 0000000..451d8cb
    - +  
     1/**
     2 * @file cbs.inl
     3 *
     4 *  This include file contains all the constants and structures associated
     5 *  with the CBS library.
     6 *
     7 */
     8
     9/*
     10 *  Copyright (C) 2011 Petr Benes.
     11 *  Copyright (C) 2011 On-Line Applications Research Corporation (OAR).
     12 *
     13 *  The license and distribution terms for this file may be
     14 *  found in the file LICENSE in this distribution or at
     15 *  http://www.rtems.com/license/LICENSE.
     16 *
     17 *  $Id$
     18 */
     19
     20#ifndef _RTEMS_CBS_H
     21# error "Never use <rtems/cbs.inl> directly; include <rtems/cbs.h> instead."
     22#endif
     23
     24#include <rtems/score/schedulercbs.h>
     25
     26/**
     27 *  @brief rtems cbs init
     28 *
     29 *  Initializes the CBS library.
     30 *
     31 *  @return status code.
     32 */
     33RTEMS_INLINE_ROUTINE int rtems_cbs_initialize ( void )
     34{
     35  return _Scheduler_CBS_Initialize();
     36}
     37
     38/**
     39 *  @brief rtems cbs cleanup
     40 *
     41 *  Cleanup resources associated to the CBS Library.
     42 *
     43 *  @return status code.
     44 */
     45RTEMS_INLINE_ROUTINE int rtems_cbs_cleanup ( void )
     46{
     47  return _Scheduler_CBS_Cleanup();
     48}
     49
     50/**
     51 *  @brief rtems cbs create server
     52 *
     53 *  Create a new server with specified parameters.
     54 *
     55 *  @return status code.
     56 */
     57RTEMS_INLINE_ROUTINE int rtems_cbs_create_server (
     58  rtems_cbs_parameters     *params,
     59  rtems_cbs_budget_overrun  budget_overrun_callback,
     60  rtems_cbs_server_id      *server_id
     61)
     62{
     63  return _Scheduler_CBS_Create_server(
     64             params,
     65             budget_overrun_callback,
     66             server_id
     67         );
     68}
     69
     70/**
     71 *  @brief rtems cbs attach thread
     72 *
     73 *  Attach a task to an already existing server.
     74 *
     75 *  @return status code.
     76 */
     77RTEMS_INLINE_ROUTINE int rtems_cbs_attach_thread (
     78  rtems_cbs_server_id server_id,
     79  rtems_id            task_id
     80)
     81{
     82  return _Scheduler_CBS_Attach_thread( server_id, task_id );
     83}
     84
     85/**
     86 *  @brief rtems cbs detach thread
     87 *
     88 *  Detach from the CBS Server.
     89 *
     90 *  @return status code.
     91 */
     92RTEMS_INLINE_ROUTINE int rtems_cbs_detach_thread (
     93  rtems_cbs_server_id server_id,
     94  rtems_id            task_id
     95)
     96{
     97  return _Scheduler_CBS_Detach_thread( server_id, task_id );
     98}
     99
     100/**
     101 *  @brief rtems cbs destroy server
     102 *
     103 *  Detach all tasks from a server and destroy it.
     104 *
     105 *  @return status code.
     106 */
     107RTEMS_INLINE_ROUTINE int rtems_cbs_destroy_server (
     108  rtems_cbs_server_id server_id
     109)
     110{
     111  return _Scheduler_CBS_Destroy_server( server_id );
     112}
     113
     114/**
     115 *  @brief rtems cbs get server id
     116 *
     117 *  Get a thread server id, or RTEMS_CBS_E_NOT_FOUND if it is not
     118 *  attached to any server.
     119 *
     120 *  @return status code.
     121 */
     122RTEMS_INLINE_ROUTINE int rtems_cbs_get_server_id (
     123  rtems_id             task_id,
     124  rtems_cbs_server_id *server_id
     125)
     126{
     127  return _Scheduler_CBS_Get_server_id( task_id, server_id );
     128}
     129
     130/**
     131 *  @brief rtems cbs get parameters
     132 *
     133 *  Retrieve CBS scheduling parameters.
     134 *
     135 *  @return status code.
     136 */
     137RTEMS_INLINE_ROUTINE int rtems_cbs_get_parameters (
     138  rtems_cbs_server_id   server_id,
     139  rtems_cbs_parameters *params
     140)
     141{
     142  return _Scheduler_CBS_Get_parameters( server_id, params );
     143}
     144
     145/**
     146 *  @brief rtems cbs set parameters
     147 *
     148 *  Change CBS scheduling parameters.
     149 *
     150 *  @return status code.
     151 */
     152RTEMS_INLINE_ROUTINE int rtems_cbs_set_parameters (
     153  rtems_cbs_server_id   server_id,
     154  rtems_cbs_parameters *params
     155)
     156{
     157  return _Scheduler_CBS_Set_parameters( server_id, params );
     158}
     159
     160/**
     161 *  @brief rtems cbs get execution time
     162 *
     163 *  Retrieve time info relative to the current server.
     164 *
     165 *  @return status code.
     166 */
     167RTEMS_INLINE_ROUTINE int rtems_cbs_get_execution_time (
     168  rtems_cbs_server_id    server_id,
     169  time_t                *exec_time,
     170  time_t                *abs_time
     171)
     172{
     173  return _Scheduler_CBS_Get_execution_time( server_id, exec_time, abs_time );
     174}
     175
     176/**
     177 *  @brief rtems cbs get remaining budget
     178 *
     179 *  Retrieve remaining budget for the current server instance.
     180 *
     181 *  @return status code.
     182 */
     183RTEMS_INLINE_ROUTINE int rtems_cbs_get_remaining_budget (
     184  rtems_cbs_server_id  server_id,
     185  time_t              *remaining_budget
     186)
     187{
     188  return _Scheduler_CBS_Get_remaining_budget( server_id, remaining_budget );
     189}
     190
     191/**
     192 *  @brief rtems cbs get approved budget
     193 *
     194 *  Retrieve the budget that has been approved for the subsequent
     195 *  server instances.
     196 *
     197 *  @return status code.
     198 */
     199RTEMS_INLINE_ROUTINE int rtems_cbs_get_approved_budget (
     200  rtems_cbs_server_id  server_id,
     201  time_t              *appr_budget
     202)
     203{
     204  return _Scheduler_CBS_Get_approved_budget( server_id, appr_budget );
     205}
  • cpukit/score/Makefile.am

    diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am
    index 2339218..0235b24 100644
    a b include_rtems_score_HEADERS += include/rtems/score/priority.h 
    4040include_rtems_score_HEADERS += include/rtems/score/prioritybitmap.h
    4141include_rtems_score_HEADERS += include/rtems/score/rbtree.h
    4242include_rtems_score_HEADERS += include/rtems/score/scheduler.h
     43include_rtems_score_HEADERS += include/rtems/score/schedulercbs.h
    4344include_rtems_score_HEADERS += include/rtems/score/scheduleredf.h
    4445include_rtems_score_HEADERS += include/rtems/score/schedulerpriority.h
    4546include_rtems_score_HEADERS += include/rtems/score/schedulersimple.h
    libscore_a_SOURCES += src/scheduleredf.c \ 
    238239    src/scheduleredfupdate.c \
    239240    src/scheduleredfyield.c
    240241
     242## SCHEDULERCBS_C_FILES
     243libscore_a_SOURCES += src/schedulercbs.c \
     244    src/schedulercbsattachthread.c \
     245    src/schedulercbscleanup.c \
     246    src/schedulercbscreateserver.c \
     247    src/schedulercbsdestroyserver.c \
     248    src/schedulercbsdetachthread.c \
     249    src/schedulercbsgetapprovedbudget.c \
     250    src/schedulercbsgetexecutiontime.c \
     251    src/schedulercbsgetparameters.c \
     252    src/schedulercbsgetremainingbudget.c \
     253    src/schedulercbsgetserverid.c \
     254    src/schedulercbssetparameters.c \
     255    src/schedulercbsreleasejob.c \
     256    src/schedulercbsunblock.c
     257
    241258## PROTECTED_HEAP_C_FILES
    242259libscore_a_SOURCES += src/pheapallocate.c \
    243260    src/pheapextend.c src/pheapfree.c src/pheapgetsize.c \
  • new file cpukit/score/include/rtems/score/schedulercbs.h

    diff --git a/cpukit/score/include/rtems/score/schedulercbs.h b/cpukit/score/include/rtems/score/schedulercbs.h
    new file mode 100644
    index 0000000..4431e73
    - +  
     1/**
     2 *  @file  rtems/score/schedulercbs.h
     3 *
     4 *  This include file contains all the constants and structures associated
     5 *  with the manipulation of threads for the CBS scheduler.
     6 */
     7
     8/*
     9 *  Copryight (c) 2011 Petr Benes.
     10 *  Copyright (C) 2011 On-Line Applications Research Corporation (OAR).
     11 *
     12 *  The license and distribution terms for this file may be
     13 *  found in the file LICENSE in this distribution or at
     14 *  http://www.rtems.com/license/LICENSE.
     15 *
     16 *  $Id$
     17 */
     18
     19#ifndef _RTEMS_SCORE_SCHEDULERCBS_H
     20#define _RTEMS_SCORE_SCHEDULERCBS_H
     21
     22#include <rtems/score/chain.h>
     23#include <rtems/score/priority.h>
     24#include <rtems/score/scheduler.h>
     25#include <rtems/score/rbtree.h>
     26#include <rtems/score/scheduleredf.h>
     27#include <rtems/rtems/signal.h>
     28#include <rtems/rtems/timer.h>
     29#include <rtems/score/thread.h>
     30
     31#ifdef __cplusplus
     32extern "C" {
     33#endif
     34
     35/**
     36 *  @addtogroup ScoreScheduler
     37 *
     38 */
     39/**@{*/
     40
     41/**
     42 *  Entry points for the Constant Bandwidth Server Scheduler.
     43 *
     44 *  @note: The CBS scheduler is an enhancement of EDF scheduler,
     45 *         therefor some routines are similar.
     46 */
     47#define SCHEDULER_CBS_ENTRY_POINTS \
     48  { \
     49    _Scheduler_EDF_Initialize,       /* initialize entry point */ \
     50    _Scheduler_EDF_Schedule,         /* schedule entry point */ \
     51    _Scheduler_EDF_Yield,            /* yield entry point */ \
     52    _Scheduler_EDF_Block,            /* block entry point */ \
     53    _Scheduler_CBS_Unblock,          /* unblock entry point */ \
     54    _Scheduler_EDF_Allocate,         /* allocate entry point */ \
     55    _Scheduler_EDF_Free,             /* free entry point */ \
     56    _Scheduler_EDF_Update,           /* update entry point */ \
     57    _Scheduler_EDF_Enqueue,          /* enqueue entry point */ \
     58    _Scheduler_EDF_Enqueue_first,    /* enqueue_first entry point */ \
     59    _Scheduler_EDF_Extract,          /* extract entry point */ \
     60    _Scheduler_EDF_Priority_compare, /* compares two priorities */ \
     61    _Scheduler_CBS_Release_job,      /* new period of task */ \
     62    _Scheduler_priority_Tick         /* tick entry point */ \
     63  }
     64
     65/* Return values for CBS server. */
     66#define SCHEDULER_CBS_OK                        0
     67#define SCHEDULER_CBS_ERROR_GENERIC            -16
     68#define SCHEDULER_CBS_ERROR_NO_MEMORY          -17
     69#define SCHEDULER_CBS_ERROR_INVALID_PARAMETER  -18
     70#define SCHEDULER_CBS_ERROR_UNAUTHORIZED       -19
     71#define SCHEDULER_CBS_ERROR_UNIMPLEMENTED      -20
     72#define SCHEDULER_CBS_ERROR_MISSING_COMPONENT  -21
     73#define SCHEDULER_CBS_ERROR_INCONSISTENT_STATE -22
     74#define SCHEDULER_CBS_ERROR_SYSTEM_OVERLOAD    -23
     75#define SCHEDULER_CBS_ERROR_INTERNAL_ERROR     -24
     76#define SCHEDULER_CBS_ERROR_NOT_FOUND          -25
     77#define SCHEDULER_CBS_ERROR_FULL               -26
     78#define SCHEDULER_CBS_ERROR_EMPTY              -27
     79#define SCHEDULER_CBS_ERROR_NOSERVER           SCHEDULER_CBS_ERROR_NOT_FOUND
     80
     81/** Maximum number of simultaneous servers. */
     82extern uint32_t _Scheduler_CBS_Maximum_servers;
     83
     84/** Server id. */
     85typedef uint32_t Scheduler_CBS_Server_id;
     86
     87/** Callback function invoked when a budget overrun of a task occurs. */
     88typedef void (*Scheduler_CBS_Budget_overrun)(
     89    Scheduler_CBS_Server_id server_id
     90);
     91
     92/**
     93 * This structure handles server parameters.
     94 */
     95typedef struct {
     96  /** Relative deadline of the server. */
     97  time_t deadline;
     98  /** Budget (computation time) of the server. */
     99  time_t budget;
     100} Scheduler_CBS_Parameters;
     101
     102/**
     103 * This structure represents a time server.
     104 */
     105typedef struct {
     106  /**
     107   * Task id.
     108   *
     109   * @note: The current implementation of CBS handles only one task per server.
     110   */
     111  rtems_id                 task_id;
     112  /** Server paramenters. */
     113  Scheduler_CBS_Parameters parameters;
     114  /** Callback function invoked when a budget overrun occurs. */
     115  Scheduler_CBS_Budget_overrun  cbs_budget_overrun;
     116} Scheduler_CBS_Server;
     117
     118/**
     119 * This structure handles CBS specific data of a thread.
     120 */
     121typedef struct {
     122  /** EDF scheduler specific data of a task. */
     123  Scheduler_EDF_Per_thread      edf_per_thread;
     124  /** CBS server specific data of a task. */
     125  Scheduler_CBS_Server         *cbs_server;
     126} Scheduler_CBS_Per_thread;
     127
     128
     129/**
     130 * List of servers. The @a Scheduler_CBS_Server is the index to the array
     131 * of pointers to @a _Scheduler_CBS_Server_list.
     132 */
     133Scheduler_CBS_Server **_Scheduler_CBS_Server_list;
     134
     135/**
     136 *  @brief Scheduler CBS Unblock
     137 *
     138 *  This routine adds @a the_thread to the scheduling decision, that is,
     139 *  adds it to the ready queue and updates any appropriate scheduling
     140 *  variables, for example the heir thread.
     141 *
     142 *  It is checked whether the remaining budget is sufficient. If not, the
     143 *  thread continues as a new job in order to protect concurrent threads.
     144 *
     145 *  @note This has to be asessed as missed deadline of the current job.
     146 *
     147 *  @param[in] the_thread will be unblocked.
     148 */
     149void _Scheduler_CBS_Unblock(
     150  Thread_Control    *the_thread
     151);
     152
     153/**
     154 *  @brief Scheduler CBS Release job
     155 *
     156 *  This routine is called when a new job of task is released.
     157 *  It is called only from Rate Monotonic manager in the beginning
     158 *  of new period. Deadline has to be shifted and budget replenished.
     159 *
     160 *  @param[in] the_thread is the owner of the job.
     161 *  @param[in] length of the new job from now. If equal to 0,
     162 *             the job was cancelled or deleted.
     163 */
     164
     165void _Scheduler_CBS_Release_job (
     166  Thread_Control  *the_thread,
     167  uint32_t         length
     168);
     169
     170/**
     171 *  @brief _Scheduler_CBS_Initialize
     172 *
     173 *  Initializes the CBS library.
     174 *
     175 *  @return status code.
     176 */
     177int _Scheduler_CBS_Initialize(void);
     178
     179/**
     180 *  @brief _Scheduler_CBS_Attach_thread
     181 *
     182 *  Attach a task to an already existing server.
     183 *
     184 *  @return status code.
     185 */
     186int _Scheduler_CBS_Attach_thread (
     187  Scheduler_CBS_Server_id server_id,
     188  rtems_id                task_id
     189);
     190
     191/**
     192 *  @brief _Scheduler_CBS_Detach_thread
     193 *
     194 *  Detach from the CBS Server.
     195 *
     196 *  @return status code.
     197 */
     198int _Scheduler_CBS_Detach_thread (
     199  Scheduler_CBS_Server_id server_id,
     200  rtems_id                task_id
     201);
     202
     203/**
     204 *  @brief _Scheduler_CBS_Cleanup
     205 *
     206 *  Cleanup resources associated to the CBS Library.
     207 *
     208 *  @return status code.
     209 */
     210int _Scheduler_CBS_Cleanup (void);
     211
     212/**
     213 *  @brief _Scheduler_CBS_Create_server
     214 *
     215 *  Create a new server with specified parameters.
     216 *
     217 *  @return status code.
     218 */
     219int _Scheduler_CBS_Create_server (
     220  Scheduler_CBS_Parameters     *params,
     221  Scheduler_CBS_Budget_overrun  budget_overrun_callback,
     222  rtems_id                     *server_id
     223);
     224
     225/**
     226 *  @brief _Scheduler_CBS_Destroy_server
     227 *
     228 *  Detach all tasks from a server and destroy it.
     229 *
     230 *  @return status code.
     231 */
     232int _Scheduler_CBS_Destroy_server (
     233  Scheduler_CBS_Server_id server_id
     234);
     235
     236/**
     237 *  @brief _Scheduler_CBS_Get_approved_budget
     238 *
     239 *  Retrieve the budget that has been approved for the subsequent
     240 *  server instances.
     241 *
     242 *  @return status code.
     243 */
     244int _Scheduler_CBS_Get_approved_budget (
     245  Scheduler_CBS_Server_id  server_id,
     246  time_t                  *approved_budget
     247);
     248
     249/**
     250 *  @brief _Scheduler_CBS_Get_remaining_budget
     251 *
     252 *  Retrieve remaining budget for the current server instance.
     253 *
     254 *  @return status code.
     255 */
     256int _Scheduler_CBS_Get_remaining_budget (
     257  Scheduler_CBS_Server_id  server_id,
     258  time_t                  *remaining_budget
     259);
     260
     261/**
     262 *  @brief _Scheduler_CBS_Get_execution_time
     263 *
     264 *  Retrieve time info relative to the current server.
     265 *
     266 *  @return status code.
     267 */
     268int _Scheduler_CBS_Get_execution_time (
     269  Scheduler_CBS_Server_id   server_id,
     270  time_t                   *exec_time,
     271  time_t                   *abs_time
     272);
     273
     274/**
     275 *  @brief _Scheduler_CBS_Get_parameters
     276 *
     277 *  Retrieve CBS scheduling parameters.
     278 *
     279 *  @return status code.
     280 */
     281int _Scheduler_CBS_Get_parameters (
     282  Scheduler_CBS_Server_id   server_id,
     283  Scheduler_CBS_Parameters *params
     284);
     285
     286/**
     287 *  @brief _Scheduler_CBS_Get_server_id
     288 *
     289 *  Get a thread server id, or SCHEDULER_CBS_ERROR_NOT_FOUND if it is not
     290 *  attached to any server.
     291 *
     292 *  @return status code.
     293 */
     294int _Scheduler_CBS_Get_server_id (
     295  rtems_id                 task_id,
     296  Scheduler_CBS_Server_id *server_id
     297);
     298
     299/**
     300 *  @brief _Scheduler_CBS_Set_parameters
     301 *
     302 *  Change CBS scheduling parameters.
     303 *
     304 *  @return status code.
     305 */
     306int _Scheduler_CBS_Set_parameters (
     307  Scheduler_CBS_Server_id   server_id,
     308  Scheduler_CBS_Parameters *parameters
     309);
     310
     311/**
     312 *  @brief Scheduler CBS Budget overrun
     313 *
     314 *  This routine is invoked when a limited time quantum is exceeded.
     315 */
     316Thread_CPU_budget_algorithm_callout _Scheduler_CBS_Budget_callout(
     317  Thread_Control *the_thread
     318);
     319
     320#ifdef __cplusplus
     321}
     322#endif
     323
     324/**@}*/
     325
     326#endif
     327/* end of include file */
  • new file cpukit/score/src/schedulercbs.c

    diff --git a/cpukit/score/src/schedulercbs.c b/cpukit/score/src/schedulercbs.c
    new file mode 100644
    index 0000000..4922596
    - +  
     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/config.h>
     18#include <rtems/score/scheduler.h>
     19#include <rtems/score/schedulercbs.h>
     20#include <rtems/rtems/signal.h>
     21
     22Thread_CPU_budget_algorithm_callout _Scheduler_CBS_Budget_callout(
     23  Thread_Control *the_thread
     24)
     25{
     26  Priority_Control          new_priority;
     27  Scheduler_CBS_Per_thread *sched_info;
     28  Scheduler_CBS_Server_id   server_id;
     29
     30  /* Put violating task to background until the end of period. */
     31  new_priority = the_thread->Start.initial_priority;
     32  if ( the_thread->real_priority != new_priority )
     33    the_thread->real_priority = new_priority;
     34  if ( the_thread->current_priority != new_priority )
     35    _Thread_Change_priority(the_thread, new_priority, true);
     36
     37  /* Invoke callback function if any. */
     38  sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
     39  if ( sched_info->cbs_server->cbs_budget_overrun ) {
     40    _Scheduler_CBS_Get_server_id(
     41        sched_info->cbs_server->task_id,
     42        &server_id
     43    );
     44    sched_info->cbs_server->cbs_budget_overrun( server_id );
     45  }
     46}
     47
     48int _Scheduler_CBS_Initialize(void)
     49{
     50  unsigned int i;
     51  _Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
     52      _Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
     53  if ( !_Scheduler_CBS_Server_list )
     54    return SCHEDULER_CBS_ERROR_NO_MEMORY;
     55  for (i = 0; i<_Scheduler_CBS_Maximum_servers; i++) {
     56    _Scheduler_CBS_Server_list[i] = NULL;
     57  }
     58  return SCHEDULER_CBS_OK;
     59}
  • new file cpukit/score/src/schedulercbsattachthread.c

    diff --git a/cpukit/score/src/schedulercbsattachthread.c b/cpukit/score/src/schedulercbsattachthread.c
    new file mode 100644
    index 0000000..12add77
    - +  
     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/config.h>
     18#include <rtems/score/scheduler.h>
     19#include <rtems/score/schedulercbs.h>
     20#include <rtems/rtems/object.h>
     21
     22int _Scheduler_CBS_Attach_thread (
     23  Scheduler_CBS_Server_id server_id,
     24  rtems_id                task_id
     25)
     26{
     27  Objects_Locations location;
     28  Thread_Control *the_thread;
     29  Scheduler_CBS_Per_thread *sched_info;
     30
     31  if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
     32    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
     33
     34  the_thread = _Thread_Get(task_id, &location);
     35  /* The routine _Thread_Get may disable dispatch and not enable again. */
     36  if ( the_thread )
     37    _Thread_Enable_dispatch();
     38  if ( !the_thread )
     39    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
     40
     41  sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
     42
     43  /* Thread is already attached to a server. */
     44  if ( sched_info->cbs_server )
     45    return SCHEDULER_CBS_ERROR_FULL;
     46
     47  /* Server is not valid. */
     48  if ( !_Scheduler_CBS_Server_list[server_id] )
     49    return SCHEDULER_CBS_ERROR_NOSERVER;
     50
     51  /* Server is already attached to a thread. */
     52  if ( _Scheduler_CBS_Server_list[server_id]->task_id != -1 )
     53    return SCHEDULER_CBS_ERROR_FULL;
     54
     55  _Scheduler_CBS_Server_list[server_id]->task_id = task_id;
     56  sched_info->cbs_server = (void *) _Scheduler_CBS_Server_list[server_id];
     57
     58  the_thread->budget_callout   = &_Scheduler_CBS_Budget_callout;
     59  the_thread->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
     60  the_thread->is_preemptible   = true;
     61
     62  return SCHEDULER_CBS_OK;
     63}
  • new file cpukit/score/src/schedulercbscleanup.c

    diff --git a/cpukit/score/src/schedulercbscleanup.c b/cpukit/score/src/schedulercbscleanup.c
    new file mode 100644
    index 0000000..c6c0b94
    - +  
     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/config.h>
     18#include <rtems/score/scheduler.h>
     19#include <rtems/score/schedulercbs.h>
     20
     21int _Scheduler_CBS_Cleanup (void)
     22{
     23  unsigned int i;
     24
     25  for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
     26    if ( _Scheduler_CBS_Server_list[ i ] )
     27      _Scheduler_CBS_Destroy_server( i );
     28  }
     29  _Workspace_Free( _Scheduler_CBS_Server_list );
     30  return SCHEDULER_CBS_OK;
     31}
  • new file cpukit/score/src/schedulercbscreateserver.c

    diff --git a/cpukit/score/src/schedulercbscreateserver.c b/cpukit/score/src/schedulercbscreateserver.c
    new file mode 100644
    index 0000000..c604423
    - +  
     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/config.h>
     18#include <rtems/score/scheduler.h>
     19#include <rtems/score/schedulercbs.h>
     20
     21int _Scheduler_CBS_Create_server (
     22  Scheduler_CBS_Parameters     *params,
     23  Scheduler_CBS_Budget_overrun  budget_overrun_callback,
     24  rtems_id                     *server_id
     25)
     26{
     27  unsigned int i;
     28  Scheduler_CBS_Server *the_server;
     29
     30  if ( params->budget <= 0 ||
     31       params->deadline <= 0 ||
     32       params->budget >= SCHEDULER_EDF_PRIO_MSB ||
     33       params->deadline >= SCHEDULER_EDF_PRIO_MSB )
     34    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
     35
     36  for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
     37    if ( !_Scheduler_CBS_Server_list[i] )
     38      break;
     39  }
     40
     41  if ( i == _Scheduler_CBS_Maximum_servers )
     42    return SCHEDULER_CBS_ERROR_FULL;
     43
     44  *server_id = i;
     45  _Scheduler_CBS_Server_list[*server_id] = (Scheduler_CBS_Server *)
     46    _Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
     47  the_server = _Scheduler_CBS_Server_list[*server_id];
     48  if ( !the_server )
     49    return SCHEDULER_CBS_ERROR_NO_MEMORY;
     50
     51  the_server->parameters = *params;
     52  the_server->task_id = -1;
     53  the_server->cbs_budget_overrun = budget_overrun_callback;
     54  return SCHEDULER_CBS_OK;
     55}
  • new file cpukit/score/src/schedulercbsdestroyserver.c

    diff --git a/cpukit/score/src/schedulercbsdestroyserver.c b/cpukit/score/src/schedulercbsdestroyserver.c
    new file mode 100644
    index 0000000..85867cf
    - +  
     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/config.h>
     18#include <rtems/score/scheduler.h>
     19#include <rtems/score/schedulercbs.h>
     20
     21int _Scheduler_CBS_Destroy_server (
     22  Scheduler_CBS_Server_id server_id
     23)
     24{
     25  int ret = SCHEDULER_CBS_OK;
     26  rtems_id tid;
     27
     28  if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
     29    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
     30
     31  if ( !_Scheduler_CBS_Server_list[server_id] )
     32    return SCHEDULER_CBS_ERROR_NOSERVER;
     33
     34  if ( (tid = _Scheduler_CBS_Server_list[server_id]->task_id) != -1 )
     35    ret = _Scheduler_CBS_Detach_thread ( server_id, tid );
     36
     37  _Workspace_Free( _Scheduler_CBS_Server_list[server_id] );
     38  _Scheduler_CBS_Server_list[server_id] = NULL;
     39  return ret;
     40}
  • new file cpukit/score/src/schedulercbsdetachthread.c

    diff --git a/cpukit/score/src/schedulercbsdetachthread.c b/cpukit/score/src/schedulercbsdetachthread.c
    new file mode 100644
    index 0000000..65aa88d
    - +  
     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/config.h>
     18#include <rtems/score/scheduler.h>
     19#include <rtems/score/schedulercbs.h>
     20
     21int _Scheduler_CBS_Detach_thread (
     22  Scheduler_CBS_Server_id server_id,
     23  rtems_id                task_id
     24)
     25{
     26  Objects_Locations location;
     27  Thread_Control *the_thread;
     28  Scheduler_CBS_Per_thread *sched_info;
     29
     30  the_thread = _Thread_Get(task_id, &location);
     31  /* The routine _Thread_Get may disable dispatch and not enable again. */
     32  if ( the_thread ) {
     33    _Thread_Enable_dispatch();
     34    sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
     35  }
     36
     37  if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
     38    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
     39  if ( !the_thread )
     40    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
     41  /* Server is not valid. */
     42  if ( !_Scheduler_CBS_Server_list[server_id] )
     43    return SCHEDULER_CBS_ERROR_NOSERVER;
     44  /* Thread and server are not attached. */
     45  if ( _Scheduler_CBS_Server_list[server_id]->task_id != task_id )
     46    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
     47
     48  _Scheduler_CBS_Server_list[server_id]->task_id = -1;
     49  sched_info->cbs_server = NULL;
     50
     51  the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
     52  the_thread->budget_callout   = the_thread->Start.budget_callout;
     53  the_thread->is_preemptible   = the_thread->Start.is_preemptible;
     54
     55  return SCHEDULER_CBS_OK;
     56}
  • new file cpukit/score/src/schedulercbsgetapprovedbudget.c

    diff --git a/cpukit/score/src/schedulercbsgetapprovedbudget.c b/cpukit/score/src/schedulercbsgetapprovedbudget.c
    new file mode 100644
    index 0000000..14db130
    - +  
     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/config.h>
     18#include <rtems/score/scheduler.h>
     19#include <rtems/score/schedulercbs.h>
     20
     21int _Scheduler_CBS_Get_approved_budget (
     22  Scheduler_CBS_Server_id  server_id,
     23  time_t                  *approved_budget
     24)
     25{
     26  if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
     27    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
     28  if ( !_Scheduler_CBS_Server_list[server_id] )
     29    return SCHEDULER_CBS_ERROR_NOSERVER;
     30
     31  *approved_budget = _Scheduler_CBS_Server_list[server_id]->parameters.budget;
     32  return SCHEDULER_CBS_OK;
     33}
  • new file cpukit/score/src/schedulercbsgetexecutiontime.c

    diff --git a/cpukit/score/src/schedulercbsgetexecutiontime.c b/cpukit/score/src/schedulercbsgetexecutiontime.c
    new file mode 100644
    index 0000000..b8d92ad
    - +  
     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/config.h>
     18#include <rtems/score/scheduler.h>
     19#include <rtems/score/schedulercbs.h>
     20
     21int _Scheduler_CBS_Get_execution_time (
     22  Scheduler_CBS_Server_id   server_id,
     23  time_t                   *exec_time,
     24  time_t                   *abs_time
     25)
     26{
     27  Objects_Locations location;
     28  Thread_Control *the_thread;
     29
     30  if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
     31    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
     32  if ( !_Scheduler_CBS_Server_list[server_id] )
     33    return SCHEDULER_CBS_ERROR_NOSERVER;
     34  if ( !_Scheduler_CBS_Server_list[server_id]->task_id ) {
     35    *exec_time = 0;
     36    return SCHEDULER_CBS_OK;
     37  }
     38
     39  the_thread = _Thread_Get(
     40                 _Scheduler_CBS_Server_list[server_id]->task_id,
     41                 &location
     42               );
     43  /* The routine _Thread_Get may disable dispatch and not enable again. */
     44  if ( the_thread ) {
     45    _Thread_Enable_dispatch();
     46    *exec_time = _Scheduler_CBS_Server_list[server_id]->parameters.budget -
     47      the_thread->cpu_time_budget;
     48  }
     49  else {
     50    *exec_time = _Scheduler_CBS_Server_list[server_id]->parameters.budget;
     51  }
     52  return SCHEDULER_CBS_OK;
     53}
  • new file cpukit/score/src/schedulercbsgetparameters.c

    diff --git a/cpukit/score/src/schedulercbsgetparameters.c b/cpukit/score/src/schedulercbsgetparameters.c
    new file mode 100644
    index 0000000..450afd0
    - +  
     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/config.h>
     18#include <rtems/score/scheduler.h>
     19#include <rtems/score/schedulercbs.h>
     20
     21int _Scheduler_CBS_Get_parameters (
     22  Scheduler_CBS_Server_id   server_id,
     23  Scheduler_CBS_Parameters *params
     24)
     25{
     26  if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
     27    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
     28  if ( !_Scheduler_CBS_Server_list[server_id] )
     29    return SCHEDULER_CBS_ERROR_NOSERVER;
     30
     31  *params = _Scheduler_CBS_Server_list[server_id]->parameters;
     32  return SCHEDULER_CBS_OK;
     33}
  • new file cpukit/score/src/schedulercbsgetremainingbudget.c

    diff --git a/cpukit/score/src/schedulercbsgetremainingbudget.c b/cpukit/score/src/schedulercbsgetremainingbudget.c
    new file mode 100644
    index 0000000..664c7e1
    - +  
     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/config.h>
     18#include <rtems/score/scheduler.h>
     19#include <rtems/score/schedulercbs.h>
     20
     21int _Scheduler_CBS_Get_remaining_budget (
     22  Scheduler_CBS_Server_id  server_id,
     23  time_t                  *remaining_budget
     24)
     25{
     26  Objects_Locations location;
     27  Thread_Control *the_thread;
     28
     29  if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
     30    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
     31  if ( !_Scheduler_CBS_Server_list[server_id] )
     32    return SCHEDULER_CBS_ERROR_NOSERVER;
     33  if ( _Scheduler_CBS_Server_list[server_id]->task_id == -1 ) {
     34    *remaining_budget = _Scheduler_CBS_Server_list[server_id]->parameters.budget;
     35    return SCHEDULER_CBS_OK;
     36  }
     37
     38  the_thread = _Thread_Get(
     39                 _Scheduler_CBS_Server_list[server_id]->task_id,
     40                 &location
     41               );
     42  /* The routine _Thread_Get may disable dispatch and not enable again. */
     43  if ( the_thread ) {
     44    _Thread_Enable_dispatch();
     45    *remaining_budget = the_thread->cpu_time_budget;
     46  }
     47  else {
     48    *remaining_budget = 0;
     49  }
     50
     51  return SCHEDULER_CBS_OK;
     52}
  • new file cpukit/score/src/schedulercbsgetserverid.c

    diff --git a/cpukit/score/src/schedulercbsgetserverid.c b/cpukit/score/src/schedulercbsgetserverid.c
    new file mode 100644
    index 0000000..1460b0c
    - +  
     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/config.h>
     18#include <rtems/score/scheduler.h>
     19#include <rtems/score/schedulercbs.h>
     20
     21int _Scheduler_CBS_Get_server_id (
     22  rtems_id                 task_id,
     23  Scheduler_CBS_Server_id *server_id
     24)
     25{
     26  unsigned int i;
     27  for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
     28    if ( _Scheduler_CBS_Server_list[i] &&
     29         _Scheduler_CBS_Server_list[i]->task_id == task_id ) {
     30      *server_id = i;
     31      return SCHEDULER_CBS_OK;
     32    }
     33  }
     34  return SCHEDULER_CBS_ERROR_NOSERVER;
     35}
  • new file cpukit/score/src/schedulercbsreleasejob.c

    diff --git a/cpukit/score/src/schedulercbsreleasejob.c b/cpukit/score/src/schedulercbsreleasejob.c
    new file mode 100644
    index 0000000..c64b60f
    - +  
     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/config.h>
     18#include <rtems/score/scheduler.h>
     19#include <rtems/score/schedulercbs.h>
     20
     21void _Scheduler_CBS_Release_job(
     22  Thread_Control    *the_thread,
     23  uint32_t           deadline
     24)
     25{
     26  Priority_Control new_priority;
     27  Scheduler_CBS_Per_thread *sched_info =
     28    (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
     29  Scheduler_CBS_Server *serv_info =
     30    (Scheduler_CBS_Server *) sched_info->cbs_server;
     31
     32  if (deadline) {
     33    /* Initializing or shifting deadline. */
     34    if (serv_info && serv_info->parameters.budget)
     35      new_priority = (_Watchdog_Ticks_since_boot + serv_info->parameters.deadline)
     36        & ~SCHEDULER_EDF_PRIO_MSB;
     37    else
     38      new_priority = (_Watchdog_Ticks_since_boot + deadline)
     39        & ~SCHEDULER_EDF_PRIO_MSB;
     40  }
     41  else {
     42    /* Switch back to background priority. */
     43    new_priority = the_thread->Start.initial_priority;
     44  }
     45
     46  /* Budget replenishment for the next job. */
     47  if (serv_info && serv_info->parameters.budget)
     48    the_thread->cpu_time_budget = serv_info->parameters.budget;
     49
     50  the_thread->real_priority = new_priority;
     51  _Thread_Change_priority(the_thread, new_priority, true);
     52}
  • new file cpukit/score/src/schedulercbssetparameters.c

    diff --git a/cpukit/score/src/schedulercbssetparameters.c b/cpukit/score/src/schedulercbssetparameters.c
    new file mode 100644
    index 0000000..4268110
    - +  
     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/config.h>
     18#include <rtems/score/scheduler.h>
     19#include <rtems/score/schedulercbs.h>
     20
     21int _Scheduler_CBS_Set_parameters (
     22  Scheduler_CBS_Server_id   server_id,
     23  Scheduler_CBS_Parameters *params
     24)
     25{
     26  if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
     27    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
     28
     29  if ( params->budget <= 0 ||
     30       params->deadline <= 0 ||
     31       params->budget >= SCHEDULER_EDF_PRIO_MSB ||
     32       params->deadline >= SCHEDULER_EDF_PRIO_MSB )
     33    return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
     34
     35  if ( !_Scheduler_CBS_Server_list[server_id] )
     36    return SCHEDULER_CBS_ERROR_NOSERVER;
     37
     38  _Scheduler_CBS_Server_list[server_id]->parameters = *params;
     39  return SCHEDULER_CBS_OK;
     40}
  • new file cpukit/score/src/schedulercbsunblock.c

    diff --git a/cpukit/score/src/schedulercbsunblock.c b/cpukit/score/src/schedulercbsunblock.c
    new file mode 100644
    index 0000000..0f417d8
    - +  
     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}