Back to home page

LXR

 
 

    


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 */