RTEMS CPU Kit with SuperCore  4.10.99.0
rtems/score/schedulercbs.h
Go to the documentation of this file.
00001 
00010 /*
00011  *  Copryight (c) 2011 Petr Benes.
00012  *  Copyright (C) 2011 On-Line Applications Research Corporation (OAR).
00013  *
00014  *  The license and distribution terms for this file may be
00015  *  found in the file LICENSE in this distribution or at
00016  *  http://www.rtems.com/license/LICENSE.
00017  */
00018 
00019 #ifndef _RTEMS_SCORE_SCHEDULERCBS_H
00020 #define _RTEMS_SCORE_SCHEDULERCBS_H
00021 
00022 #include <rtems/score/chain.h>
00023 #include <rtems/score/priority.h>
00024 #include <rtems/score/scheduler.h>
00025 #include <rtems/score/rbtree.h>
00026 #include <rtems/score/scheduleredf.h>
00027 #include <rtems/rtems/signal.h>
00028 #include <rtems/rtems/timer.h>
00029 #include <rtems/score/thread.h>
00030 
00031 #ifdef __cplusplus
00032 extern "C" {
00033 #endif
00034 
00048 #define SCHEDULER_CBS_ENTRY_POINTS \
00049   { \
00050     _Scheduler_EDF_Initialize,       /* initialize entry point */ \
00051     _Scheduler_EDF_Schedule,         /* schedule entry point */ \
00052     _Scheduler_EDF_Yield,            /* yield entry point */ \
00053     _Scheduler_EDF_Block,            /* block entry point */ \
00054     _Scheduler_CBS_Unblock,          /* unblock entry point */ \
00055     _Scheduler_CBS_Allocate,         /* allocate entry point */ \
00056     _Scheduler_EDF_Free,             /* free entry point */ \
00057     _Scheduler_EDF_Update,           /* update entry point */ \
00058     _Scheduler_EDF_Enqueue,          /* enqueue entry point */ \
00059     _Scheduler_EDF_Enqueue_first,    /* enqueue_first entry point */ \
00060     _Scheduler_EDF_Extract,          /* extract entry point */ \
00061     _Scheduler_EDF_Priority_compare, /* compares two priorities */ \
00062     _Scheduler_CBS_Release_job,      /* new period of task */ \
00063     _Scheduler_default_Tick,         /* tick entry point */ \
00064     _Scheduler_default_Start_idle    /* start idle entry point */ \
00065   }
00066 
00067 /* Return values for CBS server. */
00068 #define SCHEDULER_CBS_OK                        0
00069 #define SCHEDULER_CBS_ERROR_GENERIC            -16
00070 #define SCHEDULER_CBS_ERROR_NO_MEMORY          -17
00071 #define SCHEDULER_CBS_ERROR_INVALID_PARAMETER  -18
00072 #define SCHEDULER_CBS_ERROR_UNAUTHORIZED       -19
00073 #define SCHEDULER_CBS_ERROR_UNIMPLEMENTED      -20
00074 #define SCHEDULER_CBS_ERROR_MISSING_COMPONENT  -21
00075 #define SCHEDULER_CBS_ERROR_INCONSISTENT_STATE -22
00076 #define SCHEDULER_CBS_ERROR_SYSTEM_OVERLOAD    -23
00077 #define SCHEDULER_CBS_ERROR_INTERNAL_ERROR     -24
00078 #define SCHEDULER_CBS_ERROR_NOT_FOUND          -25
00079 #define SCHEDULER_CBS_ERROR_FULL               -26
00080 #define SCHEDULER_CBS_ERROR_EMPTY              -27
00081 #define SCHEDULER_CBS_ERROR_NOSERVER           SCHEDULER_CBS_ERROR_NOT_FOUND
00082 
00084 extern uint32_t _Scheduler_CBS_Maximum_servers;
00085 
00087 typedef uint32_t Scheduler_CBS_Server_id;
00088 
00090 typedef void (*Scheduler_CBS_Budget_overrun)(
00091     Scheduler_CBS_Server_id server_id
00092 );
00093 
00097 typedef struct {
00099   time_t deadline;
00101   time_t budget;
00102 } Scheduler_CBS_Parameters;
00103 
00107 typedef struct {
00113   rtems_id                 task_id;
00115   Scheduler_CBS_Parameters parameters;
00117   Scheduler_CBS_Budget_overrun  cbs_budget_overrun;
00118 } Scheduler_CBS_Server;
00119 
00123 typedef struct {
00125   Scheduler_EDF_Per_thread      edf_per_thread;
00127   Scheduler_CBS_Server         *cbs_server;
00128 } Scheduler_CBS_Per_thread;
00129 
00130 
00135 extern Scheduler_CBS_Server **_Scheduler_CBS_Server_list;
00136 
00150 void _Scheduler_CBS_Unblock(
00151   Thread_Control    *the_thread
00152 );
00153 
00166 void _Scheduler_CBS_Release_job (
00167   Thread_Control  *the_thread,
00168   uint32_t         length
00169 );
00170 
00178 int _Scheduler_CBS_Initialize(void);
00179 
00187 int _Scheduler_CBS_Attach_thread (
00188   Scheduler_CBS_Server_id server_id,
00189   rtems_id                task_id
00190 );
00191 
00199 int _Scheduler_CBS_Detach_thread (
00200   Scheduler_CBS_Server_id server_id,
00201   rtems_id                task_id
00202 );
00203 
00211 int _Scheduler_CBS_Cleanup (void);
00212 
00220 int _Scheduler_CBS_Create_server (
00221   Scheduler_CBS_Parameters     *params,
00222   Scheduler_CBS_Budget_overrun  budget_overrun_callback,
00223   rtems_id                     *server_id
00224 );
00225 
00235 int _Scheduler_CBS_Destroy_server (
00236   Scheduler_CBS_Server_id server_id
00237 );
00238 
00247 int _Scheduler_CBS_Get_approved_budget (
00248   Scheduler_CBS_Server_id  server_id,
00249   time_t                  *approved_budget
00250 );
00251 
00259 int _Scheduler_CBS_Get_remaining_budget (
00260   Scheduler_CBS_Server_id  server_id,
00261   time_t                  *remaining_budget
00262 );
00263 
00275 int _Scheduler_CBS_Get_execution_time (
00276   Scheduler_CBS_Server_id   server_id,
00277   time_t                   *exec_time,
00278   time_t                   *abs_time
00279 );
00280 
00288 int _Scheduler_CBS_Get_parameters (
00289   Scheduler_CBS_Server_id   server_id,
00290   Scheduler_CBS_Parameters *params
00291 );
00292 
00301 int _Scheduler_CBS_Get_server_id (
00302   rtems_id                 task_id,
00303   Scheduler_CBS_Server_id *server_id
00304 );
00305 
00316 int _Scheduler_CBS_Set_parameters (
00317   Scheduler_CBS_Server_id   server_id,
00318   Scheduler_CBS_Parameters *parameters
00319 );
00320 
00326 void _Scheduler_CBS_Budget_callout(
00327   Thread_Control *the_thread
00328 );
00329 
00338 void *_Scheduler_CBS_Allocate(
00339   Thread_Control      *the_thread
00340 );
00341 #ifdef __cplusplus
00342 }
00343 #endif
00344 
00347 #endif
00348 /* end of include file */