Ticket #1906: cbs_scheduler4.diff
File cbs_scheduler4.diff, 43.0 KB (added by Petr Benes, on 09/14/11 at 19:38:21) |
---|
-
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 15 15 include_rtems_HEADERS += include/rtems/init.h 16 16 include_rtems_HEADERS += include/rtems/io.h 17 17 include_rtems_HEADERS += include/rtems/mptables.h 18 include_rtems_HEADERS += include/rtems/cbs.h 18 19 include_rtems_HEADERS += include/rtems/rbtree.h 19 20 include_rtems_HEADERS += include/rtems/sptables.h 20 21 … … EXTRA_DIST = include/rtems/README 22 23 23 24 include_rtems_HEADERS += inline/rtems/chain.inl 24 25 include_rtems_HEADERS += inline/rtems/extension.inl 26 include_rtems_HEADERS += inline/rtems/cbs.inl 25 27 include_rtems_HEADERS += inline/rtems/rbtree.inl 26 28 27 29 ## 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 = 574 574 * CONFIGURE_SCHEDULER_SIMPLE - Light-weight Priority Scheduler 575 575 * CONFIGURE_SCHEDULER_SIMPLE_SMP - Simple SMP Priority Scheduler 576 576 * CONFIGURE_SCHEDULER_EDF - EDF Scheduler 577 * CONFIGURE_SCHEDULER_CBS - CBS Scheduler 577 578 * 578 579 * If no configuration is specified by the application, then 579 580 * CONFIGURE_SCHEDULER_PRIORITY is assumed to be the default. … … rtems_fs_init_functions_t rtems_fs_init_helper = 600 601 !defined(CONFIGURE_SCHEDULER_PRIORITY) && \ 601 602 !defined(CONFIGURE_SCHEDULER_SIMPLE) && \ 602 603 !defined(CONFIGURE_SCHEDULER_SIMPLE_SMP) && \ 603 !defined(CONFIGURE_SCHEDULER_EDF) 604 !defined(CONFIGURE_SCHEDULER_EDF) && \ 605 !defined(CONFIGURE_SCHEDULER_CBS) 604 606 #if defined(RTEMS_SMP) && defined(CONFIGURE_SMP_APPLICATION) 605 607 #define CONFIGURE_SCHEDULER_SIMPLE_SMP 606 608 #else … … rtems_fs_init_functions_t rtems_fs_init_helper = 676 678 _Configure_From_workspace(sizeof(Scheduler_EDF_Per_thread))) 677 679 #endif 678 680 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 679 706 #if defined(CONFIGURE_SCHEDULER_USER) 680 707 #define CONFIGURE_SCHEDULER_ENTRY_POINTS \ 681 708 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 27 extern "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. */ 50 typedef Scheduler_CBS_Budget_overrun rtems_cbs_budget_overrun; 51 52 /** Server id. */ 53 typedef Scheduler_CBS_Server_id rtems_cbs_server_id; 54 55 /** Server parameters. */ 56 typedef 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 */ 33 RTEMS_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 */ 45 RTEMS_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 */ 57 RTEMS_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 */ 77 RTEMS_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 */ 92 RTEMS_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 */ 107 RTEMS_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 */ 122 RTEMS_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 */ 137 RTEMS_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 */ 152 RTEMS_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 */ 167 RTEMS_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 */ 183 RTEMS_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 */ 199 RTEMS_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 40 40 include_rtems_score_HEADERS += include/rtems/score/prioritybitmap.h 41 41 include_rtems_score_HEADERS += include/rtems/score/rbtree.h 42 42 include_rtems_score_HEADERS += include/rtems/score/scheduler.h 43 include_rtems_score_HEADERS += include/rtems/score/schedulercbs.h 43 44 include_rtems_score_HEADERS += include/rtems/score/scheduleredf.h 44 45 include_rtems_score_HEADERS += include/rtems/score/schedulerpriority.h 45 46 include_rtems_score_HEADERS += include/rtems/score/schedulersimple.h … … libscore_a_SOURCES += src/scheduleredf.c \ 238 239 src/scheduleredfupdate.c \ 239 240 src/scheduleredfyield.c 240 241 242 ## SCHEDULERCBS_C_FILES 243 libscore_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 241 258 ## PROTECTED_HEAP_C_FILES 242 259 libscore_a_SOURCES += src/pheapallocate.c \ 243 260 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 32 extern "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. */ 82 extern uint32_t _Scheduler_CBS_Maximum_servers; 83 84 /** Server id. */ 85 typedef uint32_t Scheduler_CBS_Server_id; 86 87 /** Callback function invoked when a budget overrun of a task occurs. */ 88 typedef void (*Scheduler_CBS_Budget_overrun)( 89 Scheduler_CBS_Server_id server_id 90 ); 91 92 /** 93 * This structure handles server parameters. 94 */ 95 typedef 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 */ 105 typedef 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 */ 121 typedef 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 */ 133 Scheduler_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 */ 149 void _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 165 void _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 */ 177 int _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 */ 186 int _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 */ 198 int _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 */ 210 int _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 */ 219 int _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 */ 232 int _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 */ 244 int _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 */ 256 int _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 */ 268 int _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 */ 281 int _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 */ 294 int _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 */ 306 int _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 */ 316 Thread_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 22 Thread_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 48 int _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 22 int _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 21 int _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 21 int _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 21 int _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 21 int _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 21 int _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 21 int _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 21 int _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 21 int _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 21 int _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 21 void _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 21 int _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 20 void _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 }