![]() |
|
|||
File indexing completed on 2025-05-11 08:24:13
0001 /* SPDX-License-Identifier: BSD-2-Clause */ 0002 0003 /** 0004 * @file 0005 * 0006 * @ingroup RTEMSScoreScheduler 0007 * 0008 * @brief This header file provides interfaces of the 0009 * @ref RTEMSScoreScheduler which are used by the implementation and the 0010 * @ref RTEMSImplApplConfig. 0011 */ 0012 0013 /* 0014 * Copyright (C) 2010 Gedare Bloom. 0015 * Copyright (C) 2011 On-Line Applications Research Corporation (OAR). 0016 * 0017 * Redistribution and use in source and binary forms, with or without 0018 * modification, are permitted provided that the following conditions 0019 * are met: 0020 * 1. Redistributions of source code must retain the above copyright 0021 * notice, this list of conditions and the following disclaimer. 0022 * 2. Redistributions in binary form must reproduce the above copyright 0023 * notice, this list of conditions and the following disclaimer in the 0024 * documentation and/or other materials provided with the distribution. 0025 * 0026 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 0027 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 0028 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 0029 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 0030 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 0031 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 0032 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 0033 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 0034 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 0035 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 0036 * POSSIBILITY OF SUCH DAMAGE. 0037 */ 0038 0039 #ifndef _RTEMS_SCORE_SCHEDULER_H 0040 #define _RTEMS_SCORE_SCHEDULER_H 0041 0042 #include <rtems/score/thread.h> 0043 #include <rtems/score/status.h> 0044 0045 #ifdef __cplusplus 0046 extern "C" { 0047 #endif 0048 0049 struct Per_CPU_Control; 0050 0051 /** 0052 * @addtogroup RTEMSScoreScheduler 0053 * 0054 * @{ 0055 */ 0056 0057 typedef struct _Scheduler_Control Scheduler_Control; 0058 0059 /** 0060 * @brief The scheduler operations. 0061 */ 0062 typedef struct { 0063 /** @see _Scheduler_Handler_initialization() */ 0064 void ( *initialize )( const Scheduler_Control * ); 0065 0066 /** @see _Scheduler_Schedule() */ 0067 void ( *schedule )( const Scheduler_Control *, Thread_Control *); 0068 0069 /** @see _Scheduler_Yield() */ 0070 void ( *yield )( 0071 const Scheduler_Control *, 0072 Thread_Control *, 0073 Scheduler_Node * 0074 ); 0075 0076 /** @see _Scheduler_Block() */ 0077 void ( *block )( 0078 const Scheduler_Control *, 0079 Thread_Control *, 0080 Scheduler_Node * 0081 ); 0082 0083 /** @see _Scheduler_Unblock() */ 0084 void ( *unblock )( 0085 const Scheduler_Control *, 0086 Thread_Control *, 0087 Scheduler_Node * 0088 ); 0089 0090 /** @see _Scheduler_Update_priority() */ 0091 void ( *update_priority )( 0092 const Scheduler_Control *, 0093 Thread_Control *, 0094 Scheduler_Node * 0095 ); 0096 0097 /** @see _Scheduler_Map_priority() */ 0098 Priority_Control ( *map_priority )( 0099 const Scheduler_Control *, 0100 Priority_Control 0101 ); 0102 0103 /** @see _Scheduler_Unmap_priority() */ 0104 Priority_Control ( *unmap_priority )( 0105 const Scheduler_Control *, 0106 Priority_Control 0107 ); 0108 0109 #if defined(RTEMS_SMP) 0110 /** 0111 * @brief Ask for help operation. 0112 * 0113 * @param[in] scheduler The scheduler instance to ask for help. 0114 * @param[in] the_thread The thread needing help. 0115 * @param[in] node The scheduler node. 0116 * 0117 * @retval true Ask for help was successful. 0118 * @retval false Otherwise. 0119 */ 0120 bool ( *ask_for_help )( 0121 const Scheduler_Control *scheduler, 0122 Thread_Control *the_thread, 0123 Scheduler_Node *node 0124 ); 0125 0126 /** 0127 * @brief Reconsider help operation. 0128 * 0129 * @param[in] scheduler The scheduler instance to reconsider the help 0130 * request. 0131 * @param[in] the_thread The thread reconsidering a help request. 0132 * @param[in] node The scheduler node. 0133 */ 0134 void ( *reconsider_help_request )( 0135 const Scheduler_Control *scheduler, 0136 Thread_Control *the_thread, 0137 Scheduler_Node *node 0138 ); 0139 0140 /** 0141 * @brief Withdraw node operation. 0142 * 0143 * @param[in] scheduler The scheduler instance to withdraw the node. 0144 * @param[in] the_thread The thread using the node. 0145 * @param[in] node The scheduler node to withdraw. 0146 * @param[in] next_state The next thread scheduler state in case the node is 0147 * scheduled. 0148 */ 0149 void ( *withdraw_node )( 0150 const Scheduler_Control *scheduler, 0151 Thread_Control *the_thread, 0152 Scheduler_Node *node, 0153 Thread_Scheduler_state next_state 0154 ); 0155 0156 /** 0157 * @brief Makes the node sticky. 0158 * 0159 * This operation is used by _Thread_Priority_update_and_make_sticky(). It 0160 * is only called for the scheduler node of the home scheduler. 0161 * 0162 * Uniprocessor schedulers schould provide 0163 * _Scheduler_default_Sticky_do_nothing() for this operation. 0164 * 0165 * SMP schedulers should provide this operation using 0166 * _Scheduler_SMP_Make_sticky(). 0167 * 0168 * The make and clean sticky operations are an optimization to simplify the 0169 * control flow in the update priority operation. The update priority 0170 * operation is used for all scheduler nodes and not just the scheduler node 0171 * of home schedulers. The update priority operation is a commonly used 0172 * operations together with block and unblock. The make and clean sticky 0173 * operations are used only in specific scenarios. 0174 * 0175 * @param scheduler is the scheduler of the node. 0176 * 0177 * @param[in, out] the_thread is the thread owning the node. 0178 * 0179 * @param[in, out] node is the scheduler node to make sticky. 0180 */ 0181 void ( *make_sticky )( 0182 const Scheduler_Control *scheduler, 0183 Thread_Control *the_thread, 0184 Scheduler_Node *node 0185 ); 0186 0187 /** 0188 * @brief Cleans the sticky property from the node. 0189 * 0190 * This operation is used by _Thread_Priority_update_and_clean_sticky(). It 0191 * is only called for the scheduler node of the home scheduler. 0192 * 0193 * Uniprocessor schedulers schould provide 0194 * _Scheduler_default_Sticky_do_nothing() for this operation. 0195 * 0196 * SMP schedulers should provide this operation using 0197 * _Scheduler_SMP_Clean_sticky(). 0198 * 0199 * @param scheduler is the scheduler of the node. 0200 * 0201 * @param[in, out] the_thread is the thread owning the node. 0202 * 0203 * @param[in, out] node is the scheduler node to clean the sticky property. 0204 */ 0205 void ( *clean_sticky )( 0206 const Scheduler_Control *scheduler, 0207 Thread_Control *the_thread, 0208 Scheduler_Node *node 0209 ); 0210 0211 /** 0212 * @brief Pin thread operation. 0213 * 0214 * @param[in] scheduler The scheduler instance of the specified processor. 0215 * @param[in] the_thread The thread to pin. 0216 * @param[in] node The scheduler node of the thread. 0217 * @param[in] cpu The processor to pin the thread. 0218 */ 0219 void ( *pin )( 0220 const Scheduler_Control *scheduler, 0221 Thread_Control *the_thread, 0222 Scheduler_Node *node, 0223 struct Per_CPU_Control *cpu 0224 ); 0225 0226 /** 0227 * @brief Unpin thread operation. 0228 * 0229 * @param[in] scheduler The scheduler instance of the specified processor. 0230 * @param[in] the_thread The thread to unpin. 0231 * @param[in] node The scheduler node of the thread. 0232 * @param[in] cpu The processor to unpin the thread. 0233 */ 0234 void ( *unpin )( 0235 const Scheduler_Control *scheduler, 0236 Thread_Control *the_thread, 0237 Scheduler_Node *node, 0238 struct Per_CPU_Control *cpu 0239 ); 0240 0241 /** 0242 * @brief Add processor operation. 0243 * 0244 * @param[in] scheduler The scheduler instance to add the processor. 0245 * @param[in] idle The idle thread of the processor to add. 0246 */ 0247 void ( *add_processor )( 0248 const Scheduler_Control *scheduler, 0249 Thread_Control *idle 0250 ); 0251 0252 /** 0253 * @brief Remove processor operation. 0254 * 0255 * @param[in] scheduler The scheduler instance to remove the processor. 0256 * @param[in] cpu The processor to remove. 0257 * 0258 * @return The idle thread of the removed processor. 0259 */ 0260 Thread_Control *( *remove_processor )( 0261 const Scheduler_Control *scheduler, 0262 struct Per_CPU_Control *cpu 0263 ); 0264 #endif 0265 0266 /** @see _Scheduler_Node_initialize() */ 0267 void ( *node_initialize )( 0268 const Scheduler_Control *, 0269 Scheduler_Node *, 0270 Thread_Control *, 0271 Priority_Control 0272 ); 0273 0274 /** @see _Scheduler_Node_destroy() */ 0275 void ( *node_destroy )( const Scheduler_Control *, Scheduler_Node * ); 0276 0277 /** @see _Scheduler_Release_job() */ 0278 void ( *release_job ) ( 0279 const Scheduler_Control *, 0280 Thread_Control *, 0281 Priority_Node *, 0282 uint64_t, 0283 Thread_queue_Context * 0284 ); 0285 0286 /** @see _Scheduler_Cancel_job() */ 0287 void ( *cancel_job ) ( 0288 const Scheduler_Control *, 0289 Thread_Control *, 0290 Priority_Node *, 0291 Thread_queue_Context * 0292 ); 0293 0294 /** @see _Scheduler_Start_idle() */ 0295 void ( *start_idle )( 0296 const Scheduler_Control *, 0297 Thread_Control *, 0298 struct Per_CPU_Control * 0299 ); 0300 0301 #if defined(RTEMS_SMP) 0302 /** @see _Scheduler_Set_affinity() */ 0303 Status_Control ( *set_affinity )( 0304 const Scheduler_Control *, 0305 Thread_Control *, 0306 Scheduler_Node *, 0307 const Processor_mask * 0308 ); 0309 #endif 0310 } Scheduler_Operations; 0311 0312 /** 0313 * @brief Scheduler context. 0314 * 0315 * The scheduler context of a particular scheduler implementation must place 0316 * this structure at the begin of its context structure. 0317 */ 0318 typedef struct Scheduler_Context { 0319 #if defined(RTEMS_SMP) 0320 /** 0321 * @brief Lock to protect this scheduler instance. 0322 */ 0323 ISR_lock_Control Lock; 0324 0325 /** 0326 * @brief The set of processors owned by this scheduler instance. 0327 */ 0328 Processor_mask Processors; 0329 #else 0330 char empty; 0331 #endif 0332 } Scheduler_Context; 0333 0334 /** 0335 * @brief Scheduler control. 0336 */ 0337 struct _Scheduler_Control { 0338 /** 0339 * @brief Reference to a statically allocated scheduler context. 0340 */ 0341 Scheduler_Context *context; 0342 0343 /** 0344 * @brief The scheduler operations. 0345 */ 0346 Scheduler_Operations Operations; 0347 0348 /** 0349 * @brief The maximum priority value of this scheduler. 0350 * 0351 * It defines the lowest (least important) thread priority for this 0352 * scheduler. For example the idle threads have this priority. 0353 */ 0354 Priority_Control maximum_priority; 0355 0356 /** 0357 * @brief The scheduler name. 0358 */ 0359 uint32_t name; 0360 0361 #if defined(RTEMS_SMP) 0362 /** 0363 * @brief True if the non-preempt mode for threads is supported by the 0364 * scheduler, otherwise false. 0365 */ 0366 bool is_non_preempt_mode_supported; 0367 #endif 0368 }; 0369 0370 /** 0371 * @brief This table contains the configured schedulers. 0372 * 0373 * The table is defined by <rtems/confdefs.h> through the 0374 * #CONFIGURE_SCHEDULER_TABLE_ENTRIES application configuration option. 0375 * 0376 * @see _Scheduler_Count. 0377 */ 0378 extern const Scheduler_Control _Scheduler_Table[]; 0379 0380 /** 0381 * @brief This constant contains the count of configured schedulers. 0382 * 0383 * In SMP configurations, the constant is defined by <rtems/confdefs.h> through 0384 * the count of entries of the #CONFIGURE_SCHEDULER_TABLE_ENTRIES application 0385 * configuration option. 0386 * 0387 * In uniprocessor configurations, this is a compile time constant set to one. 0388 * This is important so that the compiler can optimize some loops away. 0389 * 0390 * @see _Scheduler_Table. 0391 */ 0392 #if defined(RTEMS_SMP) 0393 extern const size_t _Scheduler_Count; 0394 #else 0395 #define _Scheduler_Count ( (size_t) 1 ) 0396 #endif 0397 0398 #if defined(RTEMS_SMP) 0399 /** 0400 * @brief The scheduler assignment default attributes. 0401 */ 0402 #define SCHEDULER_ASSIGN_DEFAULT UINT32_C(0x0) 0403 0404 /** 0405 * @brief The presence of this processor is optional. 0406 */ 0407 #define SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL SCHEDULER_ASSIGN_DEFAULT 0408 0409 /** 0410 * @brief The presence of this processor is mandatory. 0411 */ 0412 #define SCHEDULER_ASSIGN_PROCESSOR_MANDATORY UINT32_C(0x1) 0413 0414 /** 0415 * @brief Scheduler assignment. 0416 */ 0417 typedef struct { 0418 /** 0419 * @brief The scheduler for this processor. 0420 */ 0421 const Scheduler_Control *scheduler; 0422 0423 /** 0424 * @brief The scheduler assignment attributes. 0425 * 0426 * Use @ref SCHEDULER_ASSIGN_DEFAULT to select default attributes. 0427 * 0428 * The presence of a processor can be 0429 * - @ref SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL, or 0430 * - @ref SCHEDULER_ASSIGN_PROCESSOR_MANDATORY. 0431 */ 0432 uint32_t attributes; 0433 } Scheduler_Assignment; 0434 0435 /** 0436 * @brief The scheduler assignments. 0437 * 0438 * The length of this array must be equal to the maximum processors. 0439 * 0440 * Application provided via <rtems/confdefs.h>. 0441 * 0442 * @see _Scheduler_Table and rtems_configuration_get_maximum_processors(). 0443 */ 0444 extern const Scheduler_Assignment _Scheduler_Initial_assignments[]; 0445 #endif 0446 0447 /** 0448 * @brief Returns the scheduler internal thread priority mapped by 0449 * SCHEDULER_PRIORITY_MAP(). 0450 * 0451 * @param scheduler Unused. 0452 * @param priority The user visible thread priority. 0453 * 0454 * @return The scheduler internal thread priority. 0455 */ 0456 Priority_Control _Scheduler_default_Map_priority( 0457 const Scheduler_Control *scheduler, 0458 Priority_Control priority 0459 ); 0460 0461 /** 0462 * @brief Returns the user visible thread priority unmapped by 0463 * SCHEDULER_PRIORITY_UNMAP(). 0464 * 0465 * @param scheduler Unused. 0466 * @param priority The scheduler internal thread priority. 0467 * 0468 * @return priority The user visible thread priority. 0469 */ 0470 Priority_Control _Scheduler_default_Unmap_priority( 0471 const Scheduler_Control *scheduler, 0472 Priority_Control priority 0473 ); 0474 0475 #if defined(RTEMS_SMP) 0476 /** 0477 * @brief Does nothing. 0478 * 0479 * This default implementation for the make and clean sticky operations 0480 * should be used by uniprocessor schedulers if SMP support is enabled. 0481 * 0482 * @param scheduler is an unused parameter. 0483 * 0484 * @param the_thread is an unused parameter. 0485 * 0486 * @param node is an unused parameter. 0487 */ 0488 void _Scheduler_default_Sticky_do_nothing( 0489 const Scheduler_Control *scheduler, 0490 Thread_Control *the_thread, 0491 Scheduler_Node *node 0492 ); 0493 0494 /** 0495 * @brief Does nothing. 0496 * 0497 * This default implementation for the thread pin or unpin operations should 0498 * be used by uniprocessor schedulers if SMP support is enabled. 0499 * 0500 * @param scheduler This parameter is unused. 0501 * @param the_thread This parameter is unused. 0502 * @param node This parameter is unused. 0503 * @param cpu This parameter is unused. 0504 */ 0505 void _Scheduler_default_Pin_or_unpin_do_nothing( 0506 const Scheduler_Control *scheduler, 0507 Thread_Control *the_thread, 0508 Scheduler_Node *node, 0509 struct Per_CPU_Control *cpu 0510 ); 0511 0512 /** 0513 * @brief Does nothing in a single processor system, otherwise a fatal error 0514 * is issued. 0515 * 0516 * This default implementation for the thread pin or unpin operations should 0517 * be used by SMP schedulers which do not support thread pinning. 0518 * 0519 * @param scheduler This parameter is unused. 0520 * @param the_thread This parameter is unused. 0521 * @param node This parameter is unused. 0522 * @param cpu This parameter is unused. 0523 */ 0524 void _Scheduler_default_Pin_or_unpin_not_supported( 0525 const Scheduler_Control *scheduler, 0526 Thread_Control *the_thread, 0527 Scheduler_Node *node, 0528 struct Per_CPU_Control *cpu 0529 ); 0530 #endif 0531 0532 /** 0533 * @brief This define provides a set of default implementations for 0534 * SMP-specific scheduler operations. 0535 * 0536 * The default implementations are intended for uniprocessor schedulers. SMP 0537 * schedulers shall implement the operations properly. 0538 * 0539 * If SMP support is disabled, the define evaluates to nothing. 0540 * 0541 * If SMP support is enabled and the system has exactly one processor, then it 0542 * may use an uniprocessor scheduler. The ask for help, reconsider help 0543 * request, and withdraw node operations are NULL, since they are only used if 0544 * a thread has at least one helping scheduler node. At least two schedulers 0545 * are required to get a helping node and each scheduler involved must own at 0546 * least one processor. This is not possible on a system with exactly one 0547 * processor. The processor add operation is NULL, since there is no other 0548 * processor to add. The processor remove operation is NULL, since the one and 0549 * only processor cannot be removed. 0550 */ 0551 #if defined(RTEMS_SMP) 0552 #define SCHEDULER_DEFAULT_SMP_OPERATIONS \ 0553 NULL, \ 0554 NULL, \ 0555 NULL, \ 0556 _Scheduler_default_Sticky_do_nothing, \ 0557 _Scheduler_default_Sticky_do_nothing, \ 0558 _Scheduler_default_Pin_or_unpin_do_nothing, \ 0559 _Scheduler_default_Pin_or_unpin_do_nothing, \ 0560 NULL, \ 0561 NULL, 0562 #else 0563 #define SCHEDULER_DEFAULT_SMP_OPERATIONS 0564 #endif 0565 0566 /** 0567 * @brief Does nothing. 0568 * 0569 * @param scheduler This parameter is unused. 0570 * @param the_thread This parameter is unused. 0571 */ 0572 void _Scheduler_default_Schedule( 0573 const Scheduler_Control *scheduler, 0574 Thread_Control *the_thread 0575 ); 0576 0577 /** 0578 * @brief Performs the scheduler base node initialization. 0579 * 0580 * @param scheduler This parameter is unused. 0581 * @param[out] node The node to initialize. 0582 * @param the_thread This parameter is unused. 0583 * @param priority The thread priority. 0584 */ 0585 void _Scheduler_default_Node_initialize( 0586 const Scheduler_Control *scheduler, 0587 Scheduler_Node *node, 0588 Thread_Control *the_thread, 0589 Priority_Control priority 0590 ); 0591 0592 /** 0593 * @brief Does nothing. 0594 * 0595 * @param scheduler This parameter is unused. 0596 * @param node This parameter is unused. 0597 */ 0598 void _Scheduler_default_Node_destroy( 0599 const Scheduler_Control *scheduler, 0600 Scheduler_Node *node 0601 ); 0602 0603 /** 0604 * @brief Does nothing. 0605 * 0606 * @param scheduler This parameter is unused. 0607 * @param the_thread This parameter is unused. 0608 * @param priority_node This parameter is unused. 0609 * @param deadline This parameter is unused. 0610 * @param queue_context This parameter is unused. 0611 * 0612 * @return Always returns NULL. 0613 */ 0614 void _Scheduler_default_Release_job( 0615 const Scheduler_Control *scheduler, 0616 Thread_Control *the_thread, 0617 Priority_Node *priority_node, 0618 uint64_t deadline, 0619 Thread_queue_Context *queue_context 0620 ); 0621 0622 /** 0623 * @brief Does nothing. 0624 * 0625 * @param scheduler This parameter is unused. 0626 * @param the_thread This parameter is unused. 0627 * @param priority_node This parameter is unused. 0628 * @param queue_context This parameter is unused. 0629 * 0630 * @return Always returns NULL. 0631 */ 0632 void _Scheduler_default_Cancel_job( 0633 const Scheduler_Control *scheduler, 0634 Thread_Control *the_thread, 0635 Priority_Node *priority_node, 0636 Thread_queue_Context *queue_context 0637 ); 0638 0639 /** 0640 * @brief Starts an idle thread. 0641 * 0642 * @param scheduler This parameter is unused. 0643 * @param[in, out] the_thread An idle thread. 0644 * @param cpu This parameter is unused. 0645 */ 0646 void _Scheduler_default_Start_idle( 0647 const Scheduler_Control *scheduler, 0648 Thread_Control *the_thread, 0649 struct Per_CPU_Control *cpu 0650 ); 0651 0652 #if defined(RTEMS_SMP) 0653 /** 0654 * @brief Checks if the processor set of the scheduler is the subset of the affinity set. 0655 * 0656 * Default implementation of the set affinity scheduler operation. 0657 * 0658 * @param scheduler This parameter is unused. 0659 * @param thread This parameter is unused. 0660 * @param node This parameter is unused. 0661 * @param affinity The new processor affinity set for the thread. 0662 * 0663 * @retval STATUS_SUCCESSFUL The affinity is a subset of the online 0664 * processors. 0665 * 0666 * @retval STATUS_INVALID_NUMBER The affinity is not a subset of the online 0667 * processors. 0668 */ 0669 Status_Control _Scheduler_default_Set_affinity( 0670 const Scheduler_Control *scheduler, 0671 Thread_Control *thread, 0672 Scheduler_Node *node, 0673 const Processor_mask *affinity 0674 ); 0675 #endif 0676 0677 /** 0678 * @brief This define provides the default implementation for the 0679 * SMP-specific set affinity operation. 0680 * 0681 * The default implementation _Scheduler_default_Set_affinity() is intended for 0682 * uniprocessor schedulers and SMP schedulers which only support an affinity to 0683 * all online processors. 0684 * 0685 * If SMP support is disabled, the define evaluates to nothing. 0686 */ 0687 #if defined(RTEMS_SMP) 0688 #define SCHEDULER_DEFAULT_SET_AFFINITY_OPERATION \ 0689 , _Scheduler_default_Set_affinity 0690 #else 0691 #define SCHEDULER_DEFAULT_SET_AFFINITY_OPERATION 0692 #endif 0693 0694 /** 0695 * @brief This defines the lowest (least important) thread priority of the 0696 * first scheduler instance. 0697 */ 0698 #define PRIORITY_MAXIMUM ( _Scheduler_Table[ 0 ].maximum_priority ) 0699 0700 /** @} */ 0701 0702 #ifdef __cplusplus 0703 } 0704 #endif 0705 0706 #endif 0707 /* end of include file */
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.3.7 LXR engine. The LXR team |
![]() ![]() |