summaryrefslogblamecommitdiffstats
path: root/cpukit/include/rtems/rtems/tasks.h
blob: 2a42dcd39c5ad4ddf60a27aa3ed8f8e03c2ec9d3 (plain) (tree)
1
2
3
4
5

                                           
   
        
  


























                                                                                

   
  





                                                                       
  






                                                                          

   

                                               

                            
 



                       
                             
                              
                               
                              
                                 
                                

                               
                            
                              
                                      
 

                  

      

                                                   
   
                                                       
  
                           
  

                                                                             
  





                                                                               
  



                                                                             
   
 
                                              

   
                                              
  



                                                                        
   
 
                                                 
 
   
                                
  
                                                            
  


                                                                            
   
                                          
 
                                               

   
                                
  



















































































                                                                                 

                                                                      
   
                                
  

                                                                               
  








                                                                              
   


                                                         

   
                                
  

                                                                               
   


                                             
 
   
                                
  
                                                                 
  
                                                                          
   
                        
 
                                              
 
   
                                
  
                                                             
   


                                                                
 
   
                                
  

                                                                       
   





































                                                                     
 
   
                                
  

                                                                               
   


                                                           
 
   
                                
  

                                                                         
  






                                                                             
   


                                                    
 
   
                                
  

                                                                          
   


                                                    
 
   
                                
  

                                                                             
   


                                                          

   
                                
  

                                                                           
  


                                                                      
   


                                                        
 
   



                                                                           
  

                                                                        
  
                                                                              
  

                                                                             
   










                                                           
 
   
                                
  
                                            
   


                                                
 
   
                                
  

                                                                          
   


                                                           
 
   
                                
  


                                                                            
   


                                                    

   
                                                                        
   


                                                         
 
   
                                
  

                                                                           
   


                                                        

   
                                    
  
                                                    
  
                                                
  


                                                                               
  
















                                                                              
  







                                                                   
   


                                                                         
 
   





                                                                     


                                                                               

                                                                     
  
                                                                 
  
                                                                
  










                                                                              
   





                                                                    

   



                                                      

                                                                              
  

                                                                             
  


                                                                               







                                                                               

                                                                     



                                                                     
  


                                                                              
  


                                                     
  



                                                                   
   



                                                         

  

                                                                  
   
                                    
  



                                                          


                                                                               




                                                                        
  
                                                                       
  







                                                                   
   


                                                       

  

                                                                   
   








                                                                            



                                                                            












                                                                              
  
                                                                 
  

                                                                   
   



                                                        

  

                                                                     
   
                                    
  






                                                                            
                                                                          

                                                                               
                    








                                                                          
  


                                                     
  



                                                                   
   



                                                          

  

                                                           
   

                                    

                                                     






                                                                              
  
                                                      
  
             




                                                                             







                                                                   
   


                                                                 
                                                                    
 

                                                                   
   

                                    

                                                                









                                                                              
  
                                                                 
  


                                                     
  



                                                                   
   


                                                                         
                                                                            
 

                                                               
   





                                                            

                                                                              
  



                                                                               
  






                                                                        
                                                                            









                                                                   





                                                    
 

                                                           
   
                                    
  
                                                                             
  
                                                   
  






























                                                                               





                                                

                                                              
   










                                                                               
  









                                                                               
  


                                                                             
  











                                                                               





                                                   

                                               
   
                                
  
                         
  
                                              
  
                                                        
  





                                                            


                                                                             

















































                                                                               
  

                                                                 
  































































































































































                                                                               
   






                                       

  
                                                  
 






                                                                  


                                                                              














































































































                                                                               


                                                                              














































































































































































































































                                                                               


                                                                       



















































































































































































































































                                                                               


                                                                               






































































                                                                               
                                                                          
                                                                            
                                                                           





















                                                                              

                                                                               



































                                                                               
                                                                               
                                                                               
                                                              
























































































































































































                                                                               
                                                                               










                                                                               
                                                                             
                                                                              
                                        























































                                                                               

                                                                               



                                                                              

















                                                                              
































                                                                              

                                                                              
  


                                                                               












                                                                              

                                                                            
































                                                                              

                                                                              
  
                                                                              



















































































                                                                               
/* SPDX-License-Identifier: BSD-2-Clause */

/**
 * @file
 *
 * @brief This header file defines the main parts of the Tasks Manager API.
 */

/*
 * Copyright (C) 2013, 2021 embedded brains GmbH (http://www.embedded-brains.de)
 * Copyright (C) 1988, 2017 On-Line Applications Research Corporation (OAR)
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * This file is part of the RTEMS quality process and was automatically
 * generated.  If you find something that needs to be fixed or
 * worded better please post a report or patch to an RTEMS mailing list
 * or raise a bug report:
 *
 * https://www.rtems.org/bugs.html
 *
 * For information on updating and regenerating please refer to the How-To
 * section in the Software Requirements Engineering chapter of the
 * RTEMS Software Engineering manual.  The manual is provided as a part of
 * a release.  For development sources please refer to the online
 * documentation at:
 *
 * https://docs.rtems.org
 */

/* Generated from spec:/rtems/task/if/header */

#ifndef _RTEMS_RTEMS_TASKS_H
#define _RTEMS_RTEMS_TASKS_H

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <sys/cpuset.h>
#include <rtems/rtems/attr.h>
#include <rtems/rtems/modes.h>
#include <rtems/rtems/status.h>
#include <rtems/rtems/types.h>
#include <rtems/score/basedefs.h>
#include <rtems/score/context.h>
#include <rtems/score/cpu.h>
#include <rtems/score/object.h>
#include <rtems/score/smp.h>
#include <rtems/score/stack.h>
#include <rtems/score/watchdogticks.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Generated from spec:/rtems/scheduler/if/group */

/**
 * @defgroup RTEMSAPIClassicScheduler Scheduler Manager
 *
 * @ingroup RTEMSAPIClassic
 *
 * @brief The scheduling concepts relate to the allocation of processing time
 *   for tasks.
 *
 * The concept of scheduling in real-time systems dictates the ability to
 * provide an immediate response to specific external events, particularly the
 * necessity of scheduling tasks to run within a specified time limit after the
 * occurrence of an event. For example, software embedded in life-support
 * systems used to monitor hospital patients must take instant action if a
 * change in the patient’s status is detected.
 *
 * The component of RTEMS responsible for providing this capability is
 * appropriately called the scheduler. The scheduler’s sole purpose is to
 * allocate the all important resource of processor time to the various tasks
 * competing for attention.
 */

/* Generated from spec:/rtems/task/if/group */

/**
 * @defgroup RTEMSAPIClassicTasks Task Manager
 *
 * @ingroup RTEMSAPIClassic
 *
 * @brief The Task Manager provides a comprehensive set of directives to
 *   create, delete, and administer tasks.
 */

/* Generated from spec:/rtems/task/if/argument */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief This integer type represents task argument values.
 *
 * @par Notes
 * The type is an architecture-specific unsigned integer type which is large
 * enough to represent pointer values and 32-bit unsigned integers.
 */
typedef CPU_Uint32ptr rtems_task_argument;

/* Generated from spec:/rtems/task/if/config */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief This structure defines the configuration of a task constructed by
 *   rtems_task_construct().
 */
typedef struct {
  /**
   * @brief This member defines the name of the task.
   */
  rtems_name name;

  /**
   * @brief This member defines the initial priority of the task.
   */
  rtems_task_priority initial_priority;

  /**
   * @brief This member shall point to the task storage area begin.
   *
   * The task storage area will contain the task stack, the thread-local storage,
   * and the floating-point context on architectures with a separate
   * floating-point context.
   *
   * The task storage area begin address and size should be aligned by
   * #RTEMS_TASK_STORAGE_ALIGNMENT.  To avoid memory waste, use RTEMS_ALIGNED()
   * and #RTEMS_TASK_STORAGE_ALIGNMENT to enforce the recommended alignment of a
   * statically allocated task storage area.
   */
  void *storage_area;

  /**
   * @brief This member defines size of the task storage area in bytes.
   *
   * Use the RTEMS_TASK_STORAGE_SIZE() macro to determine the recommended task
   * storage area size.
   */
  size_t storage_size;

  /**
   * @brief This member defines the maximum thread-local storage size supported
   *   by the task storage area.
   *
   * Use RTEMS_ALIGN_UP() and #RTEMS_TASK_STORAGE_ALIGNMENT to adjust the size to
   * meet the minimum alignment requirement of a thread-local storage area used
   * to construct a task.
   *
   * If the value is less than the actual thread-local storage size, then the
   * task construction by rtems_task_construct() fails.
   *
   * If the is less than the task storage area size, then the task construction
   * by rtems_task_construct() fails.
   *
   * The actual thread-local storage size is determined when the application
   * executable is linked.  The ``rtems-exeinfo`` command line tool included in
   * the RTEMS Tools can be used to obtain the thread-local storage size and
   * alignment of an application executable.
   *
   * The application may configure the maximum thread-local storage size for all
   * threads explicitly through the #CONFIGURE_MAXIMUM_THREAD_LOCAL_STORAGE_SIZE
   * configuration option.
   */
  size_t maximum_thread_local_storage_size;

  /**
   * @brief This member defines the optional handler to free the task storage
   *   area.
   *
   * It is called on exactly two mutually exclusive occasions.  Firstly, when the
   * task construction aborts due to a failed task create extension, or secondly,
   * when the task is deleted.  It is called from task context under protection
   * of the object allocator lock.  It is allowed to call free() in this handler.
   * If handler is NULL, then no action will be performed.
   */
  void ( *storage_free )( void * );

  /**
   * @brief This member defines the initial modes of the task.
   */
  rtems_mode initial_modes;

  /**
   * @brief This member defines the attributes of the task.
   */
  rtems_attribute attributes;
} rtems_task_config;

/* Generated from spec:/rtems/task/if/configured-minimum-stack-size */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief This constant can be used to indicate that the task should be created
 *   with the configured minimum stack size.
 *
 * Using this constant when specifying the task stack size indicates that this
 * task is to be created with a stack size of the minimum stack size that was
 * configured by the application. If not explicitly configured by the
 * application, the default configured minimum stack size is
 * #RTEMS_MINIMUM_STACK_SIZE which depends on the target architecture. Since
 * this uses the configured minimum stack size value, you may get a stack size
 * that is smaller or larger than the recommended minimum. This can be used to
 * provide large stacks for all tasks on complex applications or small stacks
 * on applications that are trying to conserve memory.
 */
#define RTEMS_CONFIGURED_MINIMUM_STACK_SIZE 0

/* Generated from spec:/rtems/task/if/current-priority */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief This constant is passed to {set-priority:/name} when the caller wants
 *   to obtain the current priority.
 */
#define RTEMS_CURRENT_PRIORITY 0

/* Generated from spec:/rtems/task/if/task */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief This type defines the return type of task entry points.
 *
 * This type can be used to document task entry points in the source code.
 */
typedef void rtems_task;

/* Generated from spec:/rtems/task/if/entry */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief This type defines the entry point of an RTEMS task.
 */
typedef rtems_task ( *rtems_task_entry )( rtems_task_argument );

/* Generated from spec:/rtems/task/if/initialization-table */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief This structure defines the properties of the Classic API user
 *   initialization task.
 */
typedef struct {
  /**
   * @brief This member defines the task name.
   */
  rtems_name name;

  /**
   * @brief This member defines the task stack size in bytes.
   */
  size_t stack_size;

  /**
   * @brief This member defines the initial task priority.
   */
  rtems_task_priority initial_priority;

  /**
   * @brief This member defines the attribute set of the task.
   */
  rtems_attribute attribute_set;

  /**
   * @brief This member defines the entry point of the task.
   */
  rtems_task_entry entry_point;

  /**
   * @brief This member defines the initial modes of the task.
   */
  rtems_mode mode_set;

  /**
   * @brief This member defines the entry point argument of the task.
   */
  rtems_task_argument argument;
} rtems_initialization_tasks_table;

/* Generated from spec:/rtems/task/if/minimum-priority */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief This compile time constant provides the highest (most important) task
 *   priority settable by the API.
 */
#define RTEMS_MINIMUM_PRIORITY 1

/* Generated from spec:/rtems/task/if/minimum-stack-size */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief This compile time constant provides the minimum task stack size
 *   recommended for the target architecture.
 *
 * It is the minimum stack size recommended for use on this processor.  This
 * value is selected by the RTEMS maintainers conservatively to minimize the
 * risk of blown stacks for most user applications.  Using this constant when
 * specifying the task stack size, indicates that the stack size will be at
 * least RTEMS_MINIMUM_STACK_SIZE bytes in size.  If the user configured
 * minimum stack size (see #CONFIGURE_MINIMUM_TASK_STACK_SIZE) is larger than
 * the recommended minimum, then it will be used.
 */
#define RTEMS_MINIMUM_STACK_SIZE STACK_MINIMUM_SIZE

/* Generated from spec:/rtems/task/if/no-priority */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief This compile time constant may be used for the
 *   rtems_task_set_priority() directive to get the current task priority.
 */
#define RTEMS_NO_PRIORITY RTEMS_CURRENT_PRIORITY

/* Generated from spec:/rtems/task/if/self-define */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief This compile time constant may be used to identify the calling task
 *   in task related directives.
 */
#define RTEMS_SELF OBJECTS_ID_OF_SELF

/* Generated from spec:/rtems/task/if/storage-alignment */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief This compile time constant defines the recommended alignment of a
 *   task storage area in bytes.
 *
 * @par Notes
 * Use it with RTEMS_ALIGNED() to define the alignment of a statically
 * allocated task storage area.
 */
#define RTEMS_TASK_STORAGE_ALIGNMENT CPU_STACK_ALIGNMENT

/* Generated from spec:/rtems/task/if/storage-size */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Gets the recommended task storage area size for the size and task
 *   attributes.
 *
 * @param _size is the size dedicated to the task stack and thread-local
 *   storage in bytes.
 *
 * @param _attributes is the attribute set of the task using the storage area.
 *
 * @return Returns the recommended task storage area size calculated from the
 *   input parameters.
 */
#if CPU_ALL_TASKS_ARE_FP == TRUE
  #define RTEMS_TASK_STORAGE_SIZE( _size, _attributes ) \
    ( ( _size ) + CONTEXT_FP_SIZE )
#else
  #define RTEMS_TASK_STORAGE_SIZE( _size, _attributes ) \
    ( ( _size ) + \
      ( ( ( _attributes ) & RTEMS_FLOATING_POINT ) != 0 ? \
        CONTEXT_FP_SIZE : 0 ) )
#endif

/* Generated from spec:/rtems/task/if/tcb */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief This structure represents the TCB.
 */
typedef struct _Thread_Control rtems_tcb;

/* Generated from spec:/rtems/task/if/visitor */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Visitor routines invoked by rtems_task_iterate() shall have this
 *   type.
 */
typedef bool( *rtems_task_visitor )( rtems_tcb *, void * );

/* Generated from spec:/rtems/task/if/yield-processor */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief This compile time constant may be passed to the
 *   rtems_task_wake_after() directive as the interval when a task wishes to
 *   yield the processor.
 */
#define RTEMS_YIELD_PROCESSOR WATCHDOG_NO_TIMEOUT

/* Generated from spec:/score/if/maximum-priority */

/**
 * @brief Returns the maximum priority of the scheduler with index zero.
 */
rtems_task_priority _RTEMS_Maximum_priority( void );

/* Generated from spec:/rtems/task/if/maximum-priority */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief This constant variable provides the lowest (least important) task
 *   priority of the first configured scheduler.
 */
#define RTEMS_MAXIMUM_PRIORITY _RTEMS_Maximum_priority()

/* Generated from spec:/rtems/scheduler/if/ident */

/**
 * @ingroup RTEMSAPIClassicScheduler
 *
 * @brief Identifies a scheduler by the object name.
 *
 * @param name is the scheduler name to look up.
 *
 * @param[out] id is the pointer to an ::rtems_id object.  When the directive
 *   call is successful, the identifier of the scheduler will be stored in this
 *   object.
 *
 * This directive obtains a scheduler identifier associated with the scheduler
 * name specified in ``name``.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_NAME There was no scheduler associated with the
 *   name.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``id`` parameter was NULL.
 *
 * @par Notes
 * @parblock
 * The scheduler name is determined by the scheduler configuration.
 *
 * The scheduler identifier is used with other scheduler related directives to
 * access the scheduler.
 * @endparblock
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within any runtime context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_scheduler_ident( rtems_name name, rtems_id *id );

/* Generated from spec:/rtems/scheduler/if/ident-by-processor */

/**
 * @ingroup RTEMSAPIClassicScheduler
 *
 * @brief Identifies a scheduler by the processor index.
 *
 * @param cpu_index is the processor index to identify the scheduler.
 *
 * @param[out] id is the pointer to an ::rtems_id object.  When the directive
 *   call is successful, the identifier of the scheduler will be stored in this
 *   object.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``id`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_NAME The processor index was invalid.
 *
 * @retval ::RTEMS_INCORRECT_STATE The processor index was valid, however, the
 *   corresponding processor was not owned by a scheduler.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within any runtime context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_scheduler_ident_by_processor(
  uint32_t  cpu_index,
  rtems_id *id
);

/* Generated from spec:/rtems/scheduler/if/ident-by-processor-set */

/**
 * @ingroup RTEMSAPIClassicScheduler
 *
 * @brief Identifies a scheduler by the processor set.
 *
 * @param cpusetsize is the size of the processor set referenced by ``cpuset``
 *   in bytes.  The size shall be positive.
 *
 * @param cpuset is the pointer to a cpu_set_t.  The referenced processor set
 *   will be used to identify the scheduler.
 *
 * @param[out] id is the pointer to an ::rtems_id object.  When the directive
 *   call is successful, the identifier of the scheduler will be stored in this
 *   object.
 *
 * The scheduler is selected according to the highest numbered online processor
 * in the specified processor set.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``id`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``cpuset`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_SIZE The processor set size was invalid.
 *
 * @retval ::RTEMS_INVALID_NAME The processor set contained no online
 *   processor.
 *
 * @retval ::RTEMS_INCORRECT_STATE The processor set was valid, however, the
 *   highest numbered online processor in the processor set was not owned by a
 *   scheduler.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within any runtime context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_scheduler_ident_by_processor_set(
  size_t           cpusetsize,
  const cpu_set_t *cpuset,
  rtems_id        *id
);

/* Generated from spec:/rtems/scheduler/if/get-maximum-priority */

/**
 * @ingroup RTEMSAPIClassicScheduler
 *
 * @brief Gets the maximum task priority of the scheduler.
 *
 * @param scheduler_id is the scheduler identifier.
 *
 * @param[out] priority is the pointer to an ::rtems_task_priority object.
 *   When the directive the maximum priority of the scheduler will be stored in
 *   this object.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ID There was no scheduler associated with the
 *   identifier specified by ``scheduler_id``.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``priority`` parameter was NULL.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within any runtime context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_scheduler_get_maximum_priority(
  rtems_id             scheduler_id,
  rtems_task_priority *priority
);

/* Generated from spec:/rtems/scheduler/if/map-priority-to-posix */

/**
 * @ingroup RTEMSAPIClassicScheduler
 *
 * @brief Maps a Classic API task priority to the corresponding POSIX thread
 *   priority.
 *
 * @param scheduler_id is the scheduler identifier.
 *
 * @param priority is the Classic API task priority to map.
 *
 * @param[out] posix_priority is the pointer to an ``int`` object.  When the
 *   directive call is successful, the POSIX thread priority value
 *   corresponding to the specified Classic API task priority value will be
 *   stored in this object.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``posix_priority`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_ID There was no scheduler associated with the
 *   identifier specified by ``scheduler_id``.
 *
 * @retval ::RTEMS_INVALID_PRIORITY The Classic API task priority was invalid.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within any runtime context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_scheduler_map_priority_to_posix(
  rtems_id            scheduler_id,
  rtems_task_priority priority,
  int                *posix_priority
);

/* Generated from spec:/rtems/scheduler/if/map-priority-from-posix */

/**
 * @ingroup RTEMSAPIClassicScheduler
 *
 * @brief Maps a POSIX thread priority to the corresponding Classic API task
 *   priority.
 *
 * @param scheduler_id is the scheduler identifier.
 *
 * @param posix_priority is the POSIX thread priority to map.
 *
 * @param[out] priority is the pointer to an ::rtems_task_priority object.
 *   When the directive call is successful, the Classic API task priority value
 *   corresponding to the specified POSIX thread priority value will be stored
 *   in this object.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``priority`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_ID There was no scheduler associated with the
 *   identifier specified by ``scheduler_id``.
 *
 * @retval ::RTEMS_INVALID_PRIORITY The POSIX thread priority was invalid.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within any runtime context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_scheduler_map_priority_from_posix(
  rtems_id             scheduler_id,
  int                  posix_priority,
  rtems_task_priority *priority
);

/* Generated from spec:/rtems/scheduler/if/get-processor */

/**
 * @ingroup RTEMSAPIClassicScheduler
 *
 * @brief Returns the index of the current processor.
 *
 * Where the system was built with SMP support disabled, this directive
 * evaluates to a compile time constant of zero.
 *
 * Where the system was built with SMP support enabled, this directive returns
 * the index of the current processor.  The set of processor indices is the
 * range of integers starting with zero up to
 * rtems_scheduler_get_processor_maximum() minus one.
 *
 * @return Returns the index of the current processor.
 *
 * @par Notes
 * Outside of sections with disabled thread dispatching the current processor
 * index may change after every instruction since the thread may migrate from
 * one processor to another.  Sections with disabled interrupts are sections
 * with thread dispatching disabled.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within any runtime context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
uint32_t rtems_scheduler_get_processor( void );

/* Generated from spec:/rtems/scheduler/if/get-processor-macro */
#define rtems_scheduler_get_processor() _SMP_Get_current_processor()

/* Generated from spec:/rtems/scheduler/if/get-processor-maximum */

/**
 * @ingroup RTEMSAPIClassicScheduler
 *
 * @brief Returns the processor maximum supported by the system.
 *
 * Where the system was built with SMP support disabled, this directive
 * evaluates to a compile time constant of one.
 *
 * Where the system was built with SMP support enabled, this directive returns
 * the minimum of the processors (physically or virtually) available at the
 * target and the configured processor maximum (see
 * #CONFIGURE_MAXIMUM_PROCESSORS).  Not all processors in the range from
 * processor index zero to the last processor index (which is the processor
 * maximum minus one) may be configured to be used by a scheduler or may be
 * online (online processors have a scheduler assigned).
 *
 * @return Returns the processor maximum supported by the system.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within any runtime context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
uint32_t rtems_scheduler_get_processor_maximum( void );

/* Generated from spec:/rtems/scheduler/if/get-processor-maximum-macro */
#define rtems_scheduler_get_processor_maximum() _SMP_Get_processor_maximum()

/* Generated from spec:/rtems/scheduler/if/get-processor-set */

/**
 * @ingroup RTEMSAPIClassicScheduler
 *
 * @brief Gets the set of processors owned by the scheduler.
 *
 * @param scheduler_id is the scheduler identifier.
 *
 * @param cpusetsize is the size of the processor set referenced by ``cpuset``
 *   in bytes.
 *
 * @param[out] cpuset is the pointer to a cpu_set_t object.  When the directive
 *   call is successful, the processor set of the scheduler will be stored in
 *   this object.  A set bit in the processor set means that the corresponding
 *   processor is owned by the scheduler, otherwise the bit is cleared.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``cpuset`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_ID There was no scheduler associated with the
 *   identifier specified by ``scheduler_id``.
 *
 * @retval ::RTEMS_INVALID_SIZE The provided processor set was too small for
 *   the set of processors owned by the scheduler.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within any runtime context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_scheduler_get_processor_set(
  rtems_id   scheduler_id,
  size_t     cpusetsize,
  cpu_set_t *cpuset
);

/* Generated from spec:/rtems/scheduler/if/add-processor */

/**
 * @ingroup RTEMSAPIClassicScheduler
 *
 * @brief Adds the processor to the set of processors owned by the scheduler.
 *
 * @param scheduler_id is the scheduler identifier.
 *
 * @param cpu_index is the index of the processor to add.
 *
 * This directive adds the processor specified by the ``cpu_index`` to the
 * scheduler specified by ``scheduler_id``.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ID There was no scheduler associated with the
 *   identifier specified by ``scheduler_id``.
 *
 * @retval ::RTEMS_NOT_CONFIGURED The processor was not configured to be used
 *   by the application.
 *
 * @retval ::RTEMS_INCORRECT_STATE The processor was configured to be used by
 *   the application, however, it was not online.
 *
 * @retval ::RTEMS_RESOURCE_IN_USE The processor was already assigned to a
 *   scheduler.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive may obtain and release the object allocator mutex.  This may
 *   cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_scheduler_add_processor(
  rtems_id scheduler_id,
  uint32_t cpu_index
);

/* Generated from spec:/rtems/scheduler/if/remove-processor */

/**
 * @ingroup RTEMSAPIClassicScheduler
 *
 * @brief Removes the processor from the set of processors owned by the
 *   scheduler.
 *
 * @param scheduler_id is the scheduler identifier.
 *
 * @param cpu_index is the index of the processor to remove.
 *
 * This directive removes the processor specified by the ``cpu_index`` from the
 * scheduler specified by ``scheduler_id``.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ID There was no scheduler associated with the
 *   identifier specified by ``scheduler_id``.
 *
 * @retval ::RTEMS_INVALID_NUMBER The processor was not owned by the scheduler.
 *
 * @retval ::RTEMS_RESOURCE_IN_USE The set of processors owned by the scheduler
 *   would have been empty after the processor removal and there was at least
 *   one non-idle task that used this scheduler as its home scheduler.
 *
 * @par Notes
 * Removing a processor from a scheduler is a complex operation that involves
 * all tasks of the system.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive may obtain and release the object allocator mutex.  This may
 *   cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_scheduler_remove_processor(
  rtems_id scheduler_id,
  uint32_t cpu_index
);

/* Generated from spec:/rtems/task/if/create */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Creates a task.
 *
 * @param name is the object name of the task.
 *
 * @param initial_priority is the initial task priority.
 *
 * @param stack_size is the task stack size in bytes.
 *
 * @param initial_modes is the initial mode set of the task.
 *
 * @param attribute_set is the attribute set of the task.
 *
 * @param[out] id is the pointer to an ::rtems_id object.  When the directive
 *   call is successful, the identifier of the created task will be stored in
 *   this object.
 *
 * This directive creates a task which resides on the local node.  The task has
 * the user-defined object name specified in ``name``.  The assigned object
 * identifier is returned in ``id``.  This identifier is used to access the
 * task with other task related directives.
 *
 * The **initial priority** of the task is specified in ``initial_priority``.
 * The scheduler of the created task is the scheduler of the calling task at
 * some point during the task creation.  The initial task priority specified in
 * ``initial_priority`` shall be valid for this scheduler.
 *
 * The **stack size** of the task is specified in ``stack_size``.  If the
 * requested stack size is less than the configured minimum stack size, then
 * RTEMS will use the configured minimum as the stack size for this task.  The
 * configured minimum stack size is defined by the
 * #CONFIGURE_MINIMUM_TASK_STACK_SIZE application configuration option.  In
 * addition to being able to specify the task stack size as a integer, there
 * are two constants which may be specified:
 *
 * * The #RTEMS_MINIMUM_STACK_SIZE constant can be specified to use the
 *   **recommended minimum stack size** for the target processor.  This value
 *   is selected by the RTEMS maintainers conservatively to minimize the risk
 *   of blown stacks for most user applications.  Using this constant when
 *   specifying the task stack size, indicates that the stack size will be at
 *   least #RTEMS_MINIMUM_STACK_SIZE bytes in size.  If the user configured
 *   minimum stack size is larger than the recommended minimum, then it will be
 *   used.
 *
 * * The #RTEMS_CONFIGURED_MINIMUM_STACK_SIZE constant can be specified to use
 *   the minimum stack size that was configured by the application.  If not
 *   explicitly configured by the application, the default configured minimum
 *   stack size is the target processor dependent value
 *   #RTEMS_MINIMUM_STACK_SIZE.  Since this uses the configured minimum stack
 *   size value, you may get a stack size that is smaller or larger than the
 *   recommended minimum.  This can be used to provide large stacks for all
 *   tasks on complex applications or small stacks on applications that are
 *   trying to conserve memory.
 *
 * The **initial mode set** specified in ``initial_modes`` is built through a
 * *bitwise or* of the mode constants described below.  Not all combinations of
 * modes are allowed.  Some modes are mutually exclusive.  If mutually
 * exclusive modes are combined, the behaviour is undefined.  Default task
 * modes can be selected by using the #RTEMS_DEFAULT_MODES constant.  The task
 * mode set defines
 *
 * * the preemption mode of the task: #RTEMS_PREEMPT (default) or
 *   #RTEMS_NO_PREEMPT,
 *
 * * the timeslicing mode of the task: #RTEMS_TIMESLICE or #RTEMS_NO_TIMESLICE
 *   (default),
 *
 * * the ASR processing mode of the task: #RTEMS_ASR (default) or
 *   #RTEMS_NO_ASR,
 *
 * * the interrupt level of the task: RTEMS_INTERRUPT_LEVEL() with a default of
 *   ``RTEMS_INTERRUPT_LEVEL( 0 )`` which is associated with enabled
 *   interrupts.
 *
 * The **initial preemption mode** of the task is enabled or disabled.
 *
 * * An **enabled preemption** is the default and can be emphasized through the
 *   use of the #RTEMS_PREEMPT mode constant.
 *
 * * A **disabled preemption** is set by the #RTEMS_NO_PREEMPT mode constant.
 *
 * The **initial timeslicing mode** of the task is enabled or disabled.
 *
 * * A **disabled timeslicing** is the default and can be emphasized through
 *   the use of the #RTEMS_NO_TIMESLICE mode constant.
 *
 * * An **enabled timeslicing** is set by the #RTEMS_TIMESLICE mode constant.
 *
 * The **initial ASR processing mode** of the task is enabled or disabled.
 *
 * * An **enabled ASR processing** is the default and can be emphasized through
 *   the use of the #RTEMS_ASR mode constant.
 *
 * * A **disabled ASR processing** is set by the #RTEMS_NO_ASR mode constant.
 *
 * The **initial interrupt level mode** of the task is defined by
 * RTEMS_INTERRUPT_LEVEL().
 *
 * * Task execution with **interrupts enabled** the default and can be
 *   emphasized through the use of the RTEMS_INTERRUPT_LEVEL() mode macro with
 *   a value of zero (0) for the parameter.  An interrupt level of zero is
 *   associated with enabled interrupts on all target processors.
 *
 * * Task execution at a **non-zero interrupt level** can be specified by the
 *   RTEMS_INTERRUPT_LEVEL() mode macro with a non-zero value for the
 *   parameter.  The interrupt level portion of the task mode supports a
 *   maximum of 256 interrupt levels.  These levels are mapped onto the
 *   interrupt levels actually supported by the target processor in a processor
 *   dependent fashion.
 *
 * The **attribute set** specified in ``attribute_set`` is built through a
 * *bitwise or* of the attribute constants described below.  Not all
 * combinations of attributes are allowed.  Some attributes are mutually
 * exclusive.  If mutually exclusive attributes are combined, the behaviour is
 * undefined.  Attributes not mentioned below are not evaluated by this
 * directive and have no effect.  Default attributes can be selected by using
 * the #RTEMS_DEFAULT_ATTRIBUTES constant.  The attribute set defines
 *
 * * the scope of the task: #RTEMS_LOCAL (default) or #RTEMS_GLOBAL and
 *
 * * the floating-point unit use of the task: #RTEMS_FLOATING_POINT or
 *   #RTEMS_NO_FLOATING_POINT (default).
 *
 * The task has a local or global **scope** in a multiprocessing network (this
 * attribute does not refer to SMP systems).  The scope is selected by the
 * mutually exclusive #RTEMS_LOCAL and #RTEMS_GLOBAL attributes.
 *
 * * A **local scope** is the default and can be emphasized through the use of
 *   the #RTEMS_LOCAL attribute.  A local task can be only used by the node
 *   which created it.
 *
 * * A **global scope** is established if the #RTEMS_GLOBAL attribute is set.
 *   Setting the global attribute in a single node system has no effect.the
 *
 * The **use of the floating-point unit** is selected by the mutually exclusive
 * #RTEMS_FLOATING_POINT and #RTEMS_NO_FLOATING_POINT attributes.  On some
 * target processors, the use of the floating-point unit can be enabled or
 * disabled for each task.  Other target processors may have no hardware
 * floating-point unit or enable the use of the floating-point unit for all
 * tasks.  Consult the *RTEMS CPU Architecture Supplement* for the details.
 *
 * * A **disabled floating-point unit** is the default and can be emphasized
 *   through use of the #RTEMS_NO_FLOATING_POINT attribute.  For performance
 *   reasons, it is recommended that tasks not using the floating-point unit
 *   should specify this attribute.
 *
 * * An **enabled floating-point unit** is selected by the
 *   #RTEMS_FLOATING_POINT attribute.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_NAME The ``name`` parameter was invalid.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``id`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_PRIORITY The ``initial_priority`` was invalid.
 *
 * @retval ::RTEMS_TOO_MANY There was no inactive object available to create a
 *   task.  The number of tasks available to the application is configured
 *   through the #CONFIGURE_MAXIMUM_TASKS application configuration option.
 *
 * @retval ::RTEMS_TOO_MANY In multiprocessing configurations, there was no
 *   inactive global object available to create a global task.  The number of
 *   global objects available to the application is configured through the
 *   #CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS application configuration option.
 *
 * @retval ::RTEMS_UNSATISFIED There was not enough memory to allocate the task
 *   storage area.  The task storage area contains the task stack, the
 *   thread-local storage, and the floating point context.
 *
 * @retval ::RTEMS_UNSATISFIED One of the task create extensions failed to
 *   create the task.
 *
 * @retval ::RTEMS_UNSATISFIED In SMP configurations, the non-preemption mode
 *   was not supported.
 *
 * @retval ::RTEMS_UNSATISFIED In SMP configurations, the interrupt level mode
 *   was not supported.
 *
 * @par Notes
 * @parblock
 * The task processor affinity is initialized to the set of online processors.
 *
 * When created, a task is placed in the dormant state and can only be made
 * ready to execute using the directive rtems_task_start().
 *
 * Application developers should consider the stack usage of the device drivers
 * when calculating the stack size required for tasks which utilize the driver.
 * The task stack size shall account for an target processor dependent
 * interrupt stack frame which may be placed on the stack of the interrupted
 * task while servicing an interrupt.  The stack checker may be used to monitor
 * the stack usage, see #CONFIGURE_STACK_CHECKER_ENABLED.
 *
 * For control and maintenance of the task, RTEMS allocates a TCB from the
 * local TCB free pool and initializes it.
 *
 * The TCB for a global task is allocated on the local node.  Task should not
 * be made global unless remote tasks must interact with the task.  This is to
 * avoid the system overhead incurred by the creation of a global task.  When a
 * global task is created, the task's name and identifier must be transmitted
 * to every node in the system for insertion in the local copy of the global
 * object table.
 * @endparblock
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive may obtain and release the object allocator mutex.  This may
 *   cause the calling task to be preempted.
 *
 * * When the directive operates on a global object, the directive sends a
 *   message to remote nodes.  This may preempt the calling task.
 *
 * * The number of tasks available to the application is configured through the
 *   #CONFIGURE_MAXIMUM_TASKS application configuration option.
 *
 * * Where the object class corresponding to the directive is configured to use
 *   unlimited objects, the directive may allocate memory from the RTEMS
 *   Workspace.
 *
 * * The number of global objects available to the application is configured
 *   through the #CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS application configuration
 *   option.
 * @endparblock
 */
rtems_status_code rtems_task_create(
  rtems_name          name,
  rtems_task_priority initial_priority,
  size_t              stack_size,
  rtems_mode          initial_modes,
  rtems_attribute     attribute_set,
  rtems_id           *id
);

/* Generated from spec:/rtems/task/if/construct */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Constructs a task from the specified task configuration.
 *
 * @param config is the task configuration.
 *
 * @param[out] id is the pointer to an ::rtems_id object.  When the directive
 *   call is successful, the identifier of the constructed task will be stored
 *   in this object.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``config`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_NAME The task name was invalid.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``id`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_PRIORITY The initial task priority was invalid.
 *
 * @retval ::RTEMS_INVALID_SIZE The thread-local storage size is greater than
 *   the maximum thread-local storage size specified in the task configuration.
 *   The thread-local storage size is determined by the thread-local variables
 *   used by the application and #CONFIGURE_MAXIMUM_THREAD_LOCAL_STORAGE_SIZE.
 *
 * @retval ::RTEMS_INVALID_SIZE The task storage area was too small to provide
 *   a task stack of the configured minimum size, see
 *   #CONFIGURE_MINIMUM_TASK_STACK_SIZE. The task storage area contains the
 *   task stack, the thread-local storage, and the floating-point context on
 *   architectures with a separate floating-point context.
 *
 * @retval ::RTEMS_TOO_MANY There was no inactive task object available to
 *   construct a task.
 *
 * @retval ::RTEMS_TOO_MANY In multiprocessing configurations, there was no
 *   inactive global object available to construct a global task.
 *
 * @retval ::RTEMS_UNSATISFIED One of the task create extensions failed during
 *   the task construction.
 *
 * @retval ::RTEMS_UNSATISFIED In SMP configurations, the non-preemption mode
 *   was not supported.
 *
 * @retval ::RTEMS_UNSATISFIED In SMP configurations, the interrupt level mode
 *   was not supported.
 *
 * @par Notes
 * @parblock
 * In contrast to tasks created by rtems_task_create(), the tasks constructed
 * by this directive use a user-provided task storage area.  The task storage
 * area contains the task stack, the thread-local storage, and the
 * floating-point context on architectures with a separate floating-point
 * context.
 *
 * This directive is intended for applications which do not want to use the
 * RTEMS Workspace and instead statically allocate all operating system
 * resources.  It is not recommended to use rtems_task_create() and
 * rtems_task_construct() together in an application.  It is also not
 * recommended to use rtems_task_construct() for drivers or general purpose
 * libraries.  The reason for these recommendations is that the task
 * configuration needs settings which can be only given with a through
 * knowledge of the application resources.
 *
 * An application based solely on static allocation can avoid any runtime
 * memory allocators.  This can simplify the application architecture as well
 * as any analysis that may be required.
 *
 * The stack space estimate done by <rtems/confdefs.h> assumes that all tasks
 * are created by rtems_task_create().  The estimate can be adjusted to take
 * user-provided task storage areas into account through the
 * #CONFIGURE_MINIMUM_TASKS_WITH_USER_PROVIDED_STORAGE application
 * configuration option.
 *
 * The #CONFIGURE_MAXIMUM_TASKS should include tasks constructed by
 * rtems_task_construct().
 * @endparblock
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive may obtain and release the object allocator mutex.  This may
 *   cause the calling task to be preempted.
 *
 * * When the directive operates on a global object, the directive sends a
 *   message to remote nodes.  This may preempt the calling task.
 *
 * * The number of tasks available to the application is configured through the
 *   #CONFIGURE_MAXIMUM_TASKS application configuration option.
 *
 * * Where the object class corresponding to the directive is configured to use
 *   unlimited objects, the directive may allocate memory from the RTEMS
 *   Workspace.
 *
 * * The number of global objects available to the application is configured
 *   through the #CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS application configuration
 *   option.
 * @endparblock
 */
rtems_status_code rtems_task_construct(
  const rtems_task_config *config,
  rtems_id                *id
);

/* Generated from spec:/rtems/task/if/ident */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Identifies a task by the object name.
 *
 * @param name is the object name to look up.
 *
 * @param node is the node or node set to search for a matching object.
 *
 * @param[out] id is the pointer to an ::rtems_id object.  When the directive
 *   call is successful, the object identifier of an object with the specified
 *   name will be stored in this object.
 *
 * This directive obtains a task identifier associated with the task name
 * specified in ``name``.
 *
 * A task may obtain its own identifier by specifying #RTEMS_SELF for the name.
 *
 * The node to search is specified in ``node``.  It shall be
 *
 * * a valid node number,
 *
 * * the constant #RTEMS_SEARCH_ALL_NODES to search in all nodes,
 *
 * * the constant #RTEMS_SEARCH_LOCAL_NODE to search in the local node only, or
 *
 * * the constant #RTEMS_SEARCH_OTHER_NODES to search in all nodes except the
 *   local node.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``id`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_NAME There was no object with the specified name on
 *   the specified nodes.
 *
 * @retval ::RTEMS_INVALID_NODE In multiprocessing configurations, the
 *   specified node was invalid.
 *
 * @par Notes
 * @parblock
 * If the task name is not unique, then the task identifier will match the
 * first task with that name in the search order.  However, this task
 * identifier is not guaranteed to correspond to the desired task.
 *
 * The objects are searched from lowest to the highest index.  If ``node`` is
 * #RTEMS_SEARCH_ALL_NODES, all nodes are searched with the local node being
 * searched first.  All other nodes are searched from lowest to the highest
 * node number.
 *
 * If node is a valid node number which does not represent the local node, then
 * only the tasks exported by the designated node are searched.
 *
 * This directive does not generate activity on remote nodes.  It accesses only
 * the local copy of the global object table.
 *
 * The task identifier is used with other task related directives to access the
 * task.
 * @endparblock
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within any runtime context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_task_ident(
  rtems_name name,
  uint32_t   node,
  rtems_id  *id
);

/* Generated from spec:/rtems/task/if/self */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Gets the task identifier of the calling task.
 *
 * This directive returns the task identifier of the calling task.
 *
 * @return Returns the task identifier of the calling task.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_id rtems_task_self( void );

/* Generated from spec:/rtems/task/if/start */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Starts the task.
 *
 * @param id is the task identifier.  The constant #RTEMS_SELF may be used to
 *   specify the calling task.
 *
 * @param entry_point is the task entry point.
 *
 * @param argument is the task entry point argument.
 *
 * This directive readies the task, specified by ``id``, for execution based on
 * the priority and execution mode specified when the task was created.  The
 * entry point of the task is given in ``entry_point``. The task's entry point
 * argument is contained in ``argument``.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``entry_point`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_ID There was no task associated with the identifier
 *   specified by ``id``.
 *
 * @retval ::RTEMS_INCORRECT_STATE The task was not in the dormant state.
 *
 * @retval ::RTEMS_ILLEGAL_ON_REMOTE_OBJECT The task resided on a remote node.
 *
 * @par Notes
 * @parblock
 * The type of the entry point argument is an unsigned integer type.  However,
 * the integer type has the property that any valid pointer to ``void`` can be
 * converted to this type and then converted back to a pointer to ``void``.
 * The result will compare equal to the original pointer.  The type can
 * represent at least 32 bits.  Some applications use the entry point argument
 * as an index into a parameter table to get task-specific parameters.
 *
 * Any actions performed on a dormant task such as suspension or change of
 * priority are nullified when the task is initiated via the rtems_task_start()
 * directive.
 * @endparblock
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within interrupt context.
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive may unblock a task.  This may cause the calling task to be
 *   preempted.
 * @endparblock
 */
rtems_status_code rtems_task_start(
  rtems_id            id,
  rtems_task_entry    entry_point,
  rtems_task_argument argument
);

/* Generated from spec:/rtems/task/if/restart */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Restarts the task.
 *
 * @param id is the task identifier.  The constant #RTEMS_SELF may be used to
 *   specify the calling task.
 *
 * @param argument is the task entry point argument.
 *
 * This directive resets the task specified by ``id`` to begin execution at its
 * original entry point.  The task's priority and execution mode are set to the
 * original creation values.  If the task is currently blocked, RTEMS
 * automatically makes the task ready.  A task can be restarted from any state,
 * except the dormant state.  The task's entry point argument is contained in
 * ``argument``.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ID There was no task associated with the identifier
 *   specified by ``id``.
 *
 * @retval ::RTEMS_INCORRECT_STATE The task never started.
 *
 * @retval ::RTEMS_ILLEGAL_ON_REMOTE_OBJECT The task resided on a remote node.
 *
 * @par Notes
 * @parblock
 * The type of the entry point argument is an unsigned integer type.  However,
 * the integer type has the property that any valid pointer to ``void`` can be
 * converted to this type and then converted back to a pointer to ``void``.
 * The result will compare equal to the original pointer.  The type can
 * represent at least 32 bits.  Some applications use the entry point argument
 * as an index into a parameter table to get task-specific parameters.
 *
 * A new entry point argument may be used to distinguish between the initial
 * rtems_task_start() of the task and any ensuing calls to rtems_task_restart()
 * of the task.  This can be beneficial in deleting a task.  Instead of
 * deleting a task using the rtems_task_delete() directive, a task can delete
 * another task by restarting that task, and allowing that task to release
 * resources back to RTEMS and then delete itself.
 * @endparblock
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within interrupt context.
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive may change the priority of a task.  This may cause the
 *   calling task to be preempted.
 *
 * * The directive may unblock a task.  This may cause the calling task to be
 *   preempted.
 * @endparblock
 */
rtems_status_code rtems_task_restart(
  rtems_id            id,
  rtems_task_argument argument
);

/* Generated from spec:/rtems/task/if/delete */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Deletes the task.
 *
 * @param id is the task identifier.  The constant #RTEMS_SELF may be used to
 *   specify the calling task.
 *
 * This directive deletes the task, either the calling task or another task, as
 * specified by ``id``.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ID There was no task associated with the identifier
 *   specified by ``id``.
 *
 * @retval ::RTEMS_CALLED_FROM_ISR The directive was called from within
 *   interrupt context.
 *
 * @retval ::RTEMS_ILLEGAL_ON_REMOTE_OBJECT The task resided on a remote node.
 *
 * @par Notes
 * @parblock
 * RTEMS stops the execution of the task and reclaims the stack memory, any
 * allocated delay or timeout timers, the TCB, and, if the task is
 * #RTEMS_FLOATING_POINT, its floating point context area. RTEMS explicitly
 * does not reclaim the following resources: region segments, partition
 * buffers, semaphores, timers, or rate monotonic periods.
 *
 * A task is responsible for releasing its resources back to RTEMS before
 * deletion.  To insure proper deallocation of resources, a task should not be
 * deleted unless it is unable to execute or does not hold any RTEMS resources.
 * If a task holds RTEMS resources, the task should be allowed to deallocate
 * its resources before deletion.  A task can be directed to release its
 * resources and delete itself by restarting it with a special argument or by
 * sending it a message, an event, or a signal.
 *
 * Deletion of the current task (#RTEMS_SELF) will force RTEMS to select
 * another task to execute.
 *
 * The TCB for the deleted task is reclaimed by RTEMS.
 *
 * When a global task is deleted, the task identifier must be transmitted to
 * every node in the system for deletion from the local copy of the global
 * object table.
 *
 * The task must reside on the local node, even if the task was created with
 * the #RTEMS_GLOBAL attribute.
 * @endparblock
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive may obtain and release the object allocator mutex.  This may
 *   cause the calling task to be preempted.
 *
 * * When the directive operates on a global object, the directive sends a
 *   message to remote nodes.  This may preempt the calling task.
 *
 * * The calling task does not have to be the task that created the object.
 *   Any local task that knows the object identifier can delete the object.
 *
 * * Where the object class corresponding to the directive is configured to use
 *   unlimited objects, the directive may free memory to the RTEMS Workspace.
 * @endparblock
 */
rtems_status_code rtems_task_delete( rtems_id id );

/* Generated from spec:/rtems/task/if/exit */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Deletes the calling task.
 *
 * This directive deletes the calling task.
 *
 * @par Notes
 * @parblock
 * The directive is an optimized variant of the following code sequences, see
 * also rtems_task_delete():
 *
 * @code
 * #include <pthread.h>
 * #include <rtems.h>
 *
 * void classic_delete_self( void )
 * {
 *   (void) rtems_task_delete( RTEMS_SELF );
 * }
 *
 * void posix_delete_self( void )
 * {
 *   (void) pthread_detach( pthread_self() );
 *   (void) pthread_exit( NULL);
 * }
 * @endcode
 * @endparblock
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within task context.
 *
 * * The directive will not return to the caller.
 *
 * * While thread dispatching is disabled, if the directive performs a thread
 *   dispatch, then the fatal error with the fatal source INTERNAL_ERROR_CORE
 *   and the fatal code INTERNAL_ERROR_BAD_THREAD_DISPATCH_DISABLE_LEVEL will
 *   occur.
 * @endparblock
 */
RTEMS_NO_RETURN void rtems_task_exit( void );

/* Generated from spec:/rtems/task/if/suspend */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Suspends the task.
 *
 * @param id is the task identifier.  The constant #RTEMS_SELF may be used to
 *   specify the calling task.
 *
 * This directive suspends the task specified by ``id`` from further execution
 * by placing it in the suspended state.  This state is additive to any other
 * blocked state that the task may already be in.  The task will not execute
 * again until another task issues the rtems_task_resume() directive for this
 * task and any blocked state has been removed.  The rtems_task_restart()
 * directive will also remove the suspended state.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ID There was no task associated with the identifier
 *   specified by ``id``.
 *
 * @retval ::RTEMS_ALREADY_SUSPENDED The task was already suspended.
 *
 * @retval ::RTEMS_ILLEGAL_ON_REMOTE_OBJECT The task resided on a remote node.
 *
 * @par Notes
 * The requesting task can suspend itself for example by specifying #RTEMS_SELF
 * as ``id``.  In this case, the task will be suspended and a successful return
 * code will be returned when the task is resumed.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within interrupt context.
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * When the directive operates on a remote object, the directive sends a
 *   message to the remote node and waits for a reply.  This will preempt the
 *   calling task.
 * @endparblock
 */
rtems_status_code rtems_task_suspend( rtems_id id );

/* Generated from spec:/rtems/task/if/resume */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Resumes the task.
 *
 * @param id is the task identifier.
 *
 * This directive removes the task specified by ``id`` from the suspended
 * state.  If the task is in the ready state after the suspension is removed,
 * then it will be scheduled to run.  If the task is still in a blocked state
 * after the suspension is removed, then it will remain in that blocked state.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ID There was no task associated with the identifier
 *   specified by ``id``.
 *
 * @retval ::RTEMS_INCORRECT_STATE The task was not suspended.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within interrupt context.
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive may unblock a task.  This may cause the calling task to be
 *   preempted.
 *
 * * When the directive operates on a remote object, the directive sends a
 *   message to the remote node and waits for a reply.  This will preempt the
 *   calling task.
 * @endparblock
 */
rtems_status_code rtems_task_resume( rtems_id id );

/* Generated from spec:/rtems/task/if/is-suspended */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Checks if the task is suspended.
 *
 * @param id is the task identifier.  The constant #RTEMS_SELF may be used to
 *   specify the calling task.
 *
 * This directive returns a status code indicating whether or not the task
 * specified by ``id`` is currently suspended.
 *
 * @retval ::RTEMS_SUCCESSFUL The task was **not** suspended.
 *
 * @retval ::RTEMS_INVALID_ID There was no task associated with the identifier
 *   specified by ``id``.
 *
 * @retval ::RTEMS_ALREADY_SUSPENDED The task was suspended.
 *
 * @retval ::RTEMS_ILLEGAL_ON_REMOTE_OBJECT The task resided on a remote node.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within interrupt context.
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_task_is_suspended( rtems_id id );

/* Generated from spec:/rtems/task/if/set-priority */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Sets the real priority or gets the current priority of the task.
 *
 * @param id is the task identifier.  The constant #RTEMS_SELF may be used to
 *   specify the calling task.
 *
 * @param new_priority is the new real priority or #RTEMS_CURRENT_PRIORITY to
 *   get the current priority.
 *
 * @param[out] old_priority is the pointer to an ::rtems_task_priority object.
 *   When the directive call is successful, the current or previous priority of
 *   the task with respect to its home scheduler will be stored in this object.
 *
 * This directive manipulates the priority of the task specified by ``id``.
 * When ``new_priority`` is not equal to #RTEMS_CURRENT_PRIORITY, the specified
 * task's previous priority is returned in ``old_priority``.  When
 * ``new_priority`` is #RTEMS_CURRENT_PRIORITY, the specified task's current
 * priority is returned in ``old_priority``.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``old_priority`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_ID There was no task associated with the identifier
 *   specified by ``id``.
 *
 * @retval ::RTEMS_INVALID_PRIORITY The task priority specified in
 *   ``new_priority`` was invalid with respect to the home scheduler of the
 *   task.
 *
 * @par Notes
 * @parblock
 * Valid priorities range from one to a maximum value which depends on the
 * configured scheduler.  The lower the priority value the higher is the
 * importance of the task.
 *
 * If the task is currently holding any binary semaphores which use a locking
 * protocol, then the task's priority cannot be lowered immediately.  If the
 * task's priority were lowered immediately, then this could violate properties
 * of the locking protocol and may result in priority inversion.  The requested
 * lowering of the task's priority will occur when the task has released all
 * binary semaphores which make the task more important.  The task's priority
 * can be increased regardless of the task's use of binary semaphores with
 * locking protocols.
 * @endparblock
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within interrupt context.
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive may change the priority of a task.  This may cause the
 *   calling task to be preempted.
 *
 * * When the directive operates on a remote object, the directive sends a
 *   message to the remote node and waits for a reply.  This will preempt the
 *   calling task.
 * @endparblock
 */
rtems_status_code rtems_task_set_priority(
  rtems_id             id,
  rtems_task_priority  new_priority,
  rtems_task_priority *old_priority
);

/* Generated from spec:/rtems/task/if/get-priority */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Gets the current priority of the task with respect to the scheduler.
 *
 * @param task_id is the task identifier.  The constant #RTEMS_SELF may be used
 *   to specify the calling task.
 *
 * @param scheduler_id is the scheduler identifier.
 *
 * @param[out] priority is the pointer to an ::rtems_task_priority object.
 *   When the directive call is successful, the current priority of the task
 *   with respect to the specified scheduler will be stored in this object.
 *
 * This directive returns the current priority in ``priority`` of the task
 * specified by ``task_id`` with respect to the scheduler specified by
 * ``scheduler_id``.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``priority`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_ID There was no task associated with the identifier
 *   specified by ``task_id``.
 *
 * @retval ::RTEMS_INVALID_ID There was no scheduler associated with the
 *   identifier specified by ``scheduler_id``.
 *
 * @retval ::RTEMS_NOT_DEFINED The task had no priority with respect to the
 *   scheduler.
 *
 * @retval ::RTEMS_ILLEGAL_ON_REMOTE_OBJECT The task resided on a remote node.
 *
 * @par Notes
 * The current priority reflects temporary priority adjustments due to locking
 * protocols, the rate-monotonic period objects on some schedulers such as EDF,
 * and the POSIX sporadic server.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within interrupt context.
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_task_get_priority(
  rtems_id             task_id,
  rtems_id             scheduler_id,
  rtems_task_priority *priority
);

/* Generated from spec:/rtems/task/if/mode */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Gets and optionally sets the mode of the calling task.
 *
 * @param mode_set is the mode set to apply to the calling task.  When ``mask``
 *   is set to #RTEMS_CURRENT_MODE, the value of this parameter is ignored.
 *   Only modes requested by ``mask`` are applied to the calling task.
 *
 * @param mask is the mode mask which specifies which modes in ``mode_set`` are
 *   applied to the calling task.  When the value is #RTEMS_CURRENT_MODE, the
 *   mode of the calling task is not changed.
 *
 * @param previous_mode_set is the pointer to an ::rtems_mode object.  When the
 *   directive call is successful, the mode of the task before any mode changes
 *   done by the directive call will be stored in this object.
 *
 * This directive queries and optionally manipulates the execution mode of the
 * calling task.  A task's execution mode enables and disables preemption,
 * timeslicing, asynchronous signal processing, as well as specifying the
 * interrupt level.  To modify an execution mode, the mode class(es) to be
 * changed must be specified in the ``mask`` parameter and the desired mode(s)
 * must be specified in the ``mode_set`` parameter.
 *
 * A task can obtain its current execution mode, without modifying it, by
 * calling this directive with a ``mask`` value of #RTEMS_CURRENT_MODE.
 *
 * The **mode set** specified in ``mode_set`` is built through a *bitwise or*
 * of the mode constants described below.  Not all combinations of modes are
 * allowed.  Some modes are mutually exclusive.  If mutually exclusive modes
 * are combined, the behaviour is undefined.  Default task modes can be
 * selected by using the #RTEMS_DEFAULT_MODES constant.  The task mode set
 * defines
 *
 * * the preemption mode of the task: #RTEMS_PREEMPT (default) or
 *   #RTEMS_NO_PREEMPT,
 *
 * * the timeslicing mode of the task: #RTEMS_TIMESLICE or #RTEMS_NO_TIMESLICE
 *   (default),
 *
 * * the ASR processing mode of the task: #RTEMS_ASR (default) or
 *   #RTEMS_NO_ASR,
 *
 * * the interrupt level of the task: RTEMS_INTERRUPT_LEVEL() with a default of
 *   ``RTEMS_INTERRUPT_LEVEL( 0 )`` which is associated with enabled
 *   interrupts.
 *
 * The **mode mask** specified in ``mask`` is built through a *bitwise or* of
 * the mode mask constants described below.
 *
 * When the #RTEMS_PREEMPT_MASK is set in ``mask``, the **preemption mode** of
 * the calling task is
 *
 * * enabled by using the #RTEMS_PREEMPT mode constant in ``mode_set`` and
 *
 * * disabled by using the #RTEMS_NO_PREEMPT mode constant in ``mode_set``.
 *
 * When the #RTEMS_TIMESLICE_MASK is set in ``mask``, the **timeslicing mode**
 * of the calling task is
 *
 * * enabled by using the #RTEMS_TIMESLICE mode constant in ``mode_set`` and
 *
 * * disabled by using the #RTEMS_NO_TIMESLICE mode constant in ``mode_set``.
 *
 * Enabling timeslicing has no effect if preemption is disabled.  For a task to
 * be timesliced, that task must have both preemption and timeslicing enabled.
 *
 * When the #RTEMS_ASR_MASK is set in ``mask``, the **ASR processing mode** of
 * the calling task is
 *
 * * enabled by using the #RTEMS_ASR mode constant in ``mode_set`` and
 *
 * * disabled by using the #RTEMS_NO_ASR mode constant in ``mode_set``.
 *
 * When the #RTEMS_INTERRUPT_MASK is set in ``mask``, **interrupts** of the
 * calling task are
 *
 * * enabled by using the RTEMS_INTERRUPT_LEVEL() mode macro with a value of
 *   zero (0) in ``mode_set`` and
 *
 * * disabled up to the specified level by using the RTEMS_INTERRUPT_LEVEL()
 *   mode macro with a positive value in ``mode_set``.
 *
 * An interrupt level of zero is associated with enabled interrupts on all
 * target processors.  The interrupt level portion of the task mode supports a
 * maximum of 256 interrupt levels.  These levels are mapped onto the interrupt
 * levels actually supported by the target processor in a processor dependent
 * fashion.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_NOT_IMPLEMENTED The #RTEMS_NO_PREEMPT was set in
 *   ``mode_set`` and setting the preemption mode was requested by
 *   #RTEMS_PREEMPT_MASK in ``mask`` and the system configuration had no
 *   implementation for this mode.
 *
 * @retval ::RTEMS_NOT_IMPLEMENTED The RTEMS_INTERRUPT_LEVEL() was set to a
 *   positive level in ``mode_set`` and setting the interrupt level was
 *   requested by #RTEMS_INTERRUPT_MASK in ``mask`` and the system
 *   configuration had no implementation for this mode.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within task context.
 *
 * * When the directive enables preemption for the calling task, another task
 *   may preempt the calling task.
 *
 * * While thread dispatching is disabled, if the directive performs a thread
 *   dispatch, then the fatal error with the fatal source INTERNAL_ERROR_CORE
 *   and the fatal code INTERNAL_ERROR_BAD_THREAD_DISPATCH_DISABLE_LEVEL will
 *   occur.
 * @endparblock
 */
rtems_status_code rtems_task_mode(
  rtems_mode  mode_set,
  rtems_mode  mask,
  rtems_mode *previous_mode_set
);

/* Generated from spec:/rtems/task/if/wake-after */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Wakes up after an interval in clock ticks or yields the processor.
 *
 * @param ticks is the interval in clock ticks to delay the task or
 *   #RTEMS_YIELD_PROCESSOR to yield the processor.
 *
 * This directive blocks the calling task for the specified ``ticks`` of clock
 * ticks if the value is not equal to #RTEMS_YIELD_PROCESSOR.  When the
 * requested interval has elapsed, the task is made ready.  The clock tick
 * directives automatically updates the delay period.  The calling task may
 * give up the processor and remain in the ready state by specifying a value of
 * #RTEMS_YIELD_PROCESSOR in ``ticks``.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @par Notes
 * Setting the system date and time with the rtems_clock_set() directive and
 * similar directives which set CLOCK_REALTIME have no effect on a
 * rtems_task_wake_after() blocked task.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within task context.
 *
 * * The directive requires a Clock Driver.
 *
 * * While thread dispatching is disabled, if the directive performs a thread
 *   dispatch, then the fatal error with the fatal source INTERNAL_ERROR_CORE
 *   and the fatal code INTERNAL_ERROR_BAD_THREAD_DISPATCH_DISABLE_LEVEL will
 *   occur.
 * @endparblock
 */
rtems_status_code rtems_task_wake_after( rtems_interval ticks );

/* Generated from spec:/rtems/task/if/wake-when */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Wakes up when specified.
 *
 * @param time_buffer is the date and time to wake up.
 *
 * This directive blocks a task until the date and time specified in
 * ``time_buffer``.  At the requested date and time, the calling task will be
 * unblocked and made ready to execute.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_NOT_DEFINED The system date and time was not set.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``time_buffer`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_CLOCK The time of day was invalid.
 *
 * @par Notes
 * The ticks portion of ``time_buffer`` structure is ignored.  The timing
 * granularity of this directive is a second.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within task context.
 *
 * * The directive requires a Clock Driver.
 *
 * * While thread dispatching is disabled, if the directive performs a thread
 *   dispatch, then the fatal error with the fatal source INTERNAL_ERROR_CORE
 *   and the fatal code INTERNAL_ERROR_BAD_THREAD_DISPATCH_DISABLE_LEVEL will
 *   occur.
 * @endparblock
 */
rtems_status_code rtems_task_wake_when( const rtems_time_of_day *time_buffer );

/* Generated from spec:/rtems/task/if/get-scheduler */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Gets the home scheduler of the task.
 *
 * @param task_id is the task identifier.  The constant #RTEMS_SELF may be used
 *   to specify the calling task.
 *
 * @param[out] scheduler_id is the pointer to an ::rtems_id object.  When the
 *   directive call is successful, the identifier of the home scheduler of the
 *   task will be stored in this object.
 *
 * This directive returns the identifier of the home scheduler of the task
 * specified by ``task_id`` in ``scheduler_id``.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``scheduler_id`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_ID There was no task associated with the identifier
 *   specified by ``task_id``.
 *
 * @retval ::RTEMS_ILLEGAL_ON_REMOTE_OBJECT The task resided on a remote node.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within interrupt context.
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_task_get_scheduler(
  rtems_id  task_id,
  rtems_id *scheduler_id
);

/* Generated from spec:/rtems/task/if/set-scheduler */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Sets the home scheduler for the task.
 *
 * @param task_id is the task identifier.  The constant #RTEMS_SELF may be used
 *   to specify the calling task.
 *
 * @param scheduler_id is the scheduler identifier of the new home scheduler
 *   for the task specified by ``task_id``.
 *
 * @param priority is the new real priority for the task with respect to the
 *   scheduler specified by ``scheduler_id``.
 *
 * This directive sets the home scheduler to the scheduler specified by
 * ``scheduler_id`` for the task specified by ``task_id``.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ID There was no scheduler associated with the
 *   identifier specified by ``scheduler_id``.
 *
 * @retval ::RTEMS_INVALID_PRIORITY The task priority specified by ``priority``
 *   was invalid with respect to the scheduler specified by ``scheduler_id``.
 *
 * @retval ::RTEMS_INVALID_ID There was no task associated with the identifier
 *   specified by ``task_id``.
 *
 * @retval ::RTEMS_RESOURCE_IN_USE The task specified by ``task_id`` was
 *   enqueued on a wait queue.
 *
 * @retval ::RTEMS_RESOURCE_IN_USE The task specified by ``task_id`` had a
 *   current priority which consisted of more than the real priority.
 *
 * @retval ::RTEMS_RESOURCE_IN_USE The task specified by ``task_id`` had a
 *   helping scheduler.
 *
 * @retval ::RTEMS_RESOURCE_IN_USE The task specified by ``task_id`` was
 *   pinned.
 *
 * @retval ::RTEMS_UNSATISFIED The scheduler specified by ``scheduler_id``
 *   owned no processor.
 *
 * @retval ::RTEMS_UNSATISFIED The scheduler specified by ``scheduler_id`` did
 *   not support the affinity set of the task specified by ``task_id``.
 *
 * @retval ::RTEMS_ILLEGAL_ON_REMOTE_OBJECT The task resided on a remote node.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within interrupt context.
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive may change the priority of a task.  This may cause the
 *   calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_task_set_scheduler(
  rtems_id            task_id,
  rtems_id            scheduler_id,
  rtems_task_priority priority
);

/* Generated from spec:/rtems/task/if/get-affinity */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Gets the processor affinity of the task.
 *
 * @param id is the task identifier.  The constant #RTEMS_SELF may be used to
 *   specify the calling task.
 *
 * @param cpusetsize is the size of the processor set referenced by ``cpuset``
 *   in bytes.
 *
 * @param[out] cpuset is the pointer to a cpu_set_t object.  When the directive
 *   call is successful, the processor affinity set of the task will be stored
 *   in this object.  A set bit in the processor set means that the
 *   corresponding processor is in the processor affinity set of the task,
 *   otherwise the bit is cleared.
 *
 * This directive returns the processor affinity of the task in ``cpuset`` of
 * the task specified by ``id``.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``cpuset`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_ID There was no task associated with the identifier
 *   specified by ``id``.
 *
 * @retval ::RTEMS_INVALID_SIZE The size specified by ``cpusetsize`` of the
 *   processor set was too small for the processor affinity set of the task.
 *
 * @retval ::RTEMS_ILLEGAL_ON_REMOTE_OBJECT The task resided on a remote node.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within interrupt context.
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_task_get_affinity(
  rtems_id   id,
  size_t     cpusetsize,
  cpu_set_t *cpuset
);

/* Generated from spec:/rtems/task/if/set-affinity */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Sets the processor affinity of the task.
 *
 * @param id is the task identifier.  The constant #RTEMS_SELF may be used to
 *   specify the calling task.
 *
 * @param cpusetsize is the size of the processor set referenced by ``cpuset``
 *   in bytes.
 *
 * @param[out] cpuset is the pointer to a cpu_set_t object.  The processor set
 *   defines the new processor affinity set of the task.  A set bit in the
 *   processor set means that the corresponding processor shall be in the
 *   processor affinity set of the task, otherwise the bit shall be cleared.
 *
 * This directive sets the processor affinity of the task specified by ``id``.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``cpuset`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_ID There was no task associated with the identifier
 *   specified by ``id``.
 *
 * @retval ::RTEMS_INVALID_NUMBER The referenced processor set was not a valid
 *   new processor affinity set for the task.
 *
 * @retval ::RTEMS_ILLEGAL_ON_REMOTE_OBJECT The task resided on a remote node.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within interrupt context.
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive may change the processor affinity of a task.  This may cause
 *   the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_task_set_affinity(
  rtems_id         id,
  size_t           cpusetsize,
  const cpu_set_t *cpuset
);

/* Generated from spec:/rtems/task/if/iterate */

/**
 * @ingroup RTEMSAPIClassicTasks
 *
 * @brief Iterates over all tasks and invokes the visitor routine for each
 *   task.
 *
 * @param visitor is the visitor routine invoked for each task.
 *
 * @param arg is the argument passed to each visitor routine invocation during
 *   the iteration.
 *
 * This directive iterates over all tasks in the system.  This operation covers
 * all tasks of all APIs.  The user should be careful in accessing the contents
 * of the TCB.  The visitor argument ``arg`` is passed to all invocations of
 * ``visitor`` in addition to the TCB. The iteration stops immediately in case
 * the visitor routine returns true.
 *
 * @par Notes
 * The visitor routine is invoked while owning the objects allocator lock.  It
 * is allowed to perform blocking operations in the visitor routine, however,
 * care must be taken so that no deadlocks via the object allocator lock can
 * occur.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive may obtain and release the object allocator mutex.  This may
 *   cause the calling task to be preempted.
 * @endparblock
 */
void rtems_task_iterate( rtems_task_visitor visitor, void *arg );

#ifdef __cplusplus
}
#endif

#endif /* _RTEMS_RTEMS_TASKS_H */