RTEMS CPU Kit with SuperCore  4.10.99.0
rtems/score/thread.h
Go to the documentation of this file.
00001 
00010 /*
00011  *  COPYRIGHT (c) 1989-2009.
00012  *  On-Line Applications Research Corporation (OAR).
00013  *
00014  *  The license and distribution terms for this file may be
00015  *  found in the file LICENSE in this distribution or at
00016  *  http://www.rtems.com/license/LICENSE.
00017  */
00018 
00019 #ifndef _RTEMS_SCORE_THREAD_H
00020 #define _RTEMS_SCORE_THREAD_H
00021 
00039 #if defined(RTEMS_POSIX_API)
00040   #define RTEMS_SCORE_THREAD_ENABLE_EXHAUST_TIMESLICE
00041 #endif
00042 
00043 /*
00044  * With the addition of the Constant Block Scheduler (CBS),
00045  * this feature is needed even when POSIX is disabled.
00046  */
00047 #define RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT
00048 
00049 #if defined(RTEMS_POSIX_API)
00050   #define RTEMS_SCORE_THREAD_ENABLE_USER_PROVIDED_STACK_VIA_API
00051 #endif
00052 
00053 #if defined(RTEMS_SMP) || \
00054     defined(RTEMS_HEAVY_STACK_DEBUG) || \
00055     defined(RTEMS_HEAVY_MALLOC_DEBUG)
00056   #define __THREAD_DO_NOT_INLINE_DISABLE_DISPATCH__
00057 #endif
00058 
00059 #if defined(RTEMS_SMP) || \
00060    (CPU_INLINE_ENABLE_DISPATCH == FALSE) || \
00061    (__RTEMS_DO_NOT_INLINE_THREAD_ENABLE_DISPATCH__ == 1)
00062   #define __THREAD_DO_NOT_INLINE_ENABLE_DISPATCH__
00063 #endif
00064 
00065 /*
00066  *  Deferred floating point context switches are not currently
00067  *  supported when in SMP configuration.
00068  */
00069 #if defined(RTEMS_SMP)
00070   #undef  CPU_USE_DEFERRED_FP_SWITCH
00071   #define CPU_USE_DEFERRED_FP_SWITCH FALSE
00072 #endif
00073 
00074 #ifdef __cplusplus
00075 extern "C" {
00076 #endif
00077 
00078 #include <rtems/score/percpu.h>
00079 #include <rtems/score/context.h>
00080 #include <rtems/score/cpu.h>
00081 #if defined(RTEMS_MULTIPROCESSING)
00082 #include <rtems/score/mppkt.h>
00083 #endif
00084 #include <rtems/score/object.h>
00085 #include <rtems/score/priority.h>
00086 #include <rtems/score/scheduler.h>
00087 #include <rtems/score/stack.h>
00088 #include <rtems/score/states.h>
00089 #include <rtems/score/tod.h>
00090 #include <rtems/score/tqdata.h>
00091 #include <rtems/score/watchdog.h>
00092 
00093 /*
00094  *  The user can define this at configure time and go back to ticks
00095  *  resolution.
00096  */
00097 #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
00098   #include <rtems/score/timestamp.h>
00099 
00100   typedef Timestamp_Control Thread_CPU_usage_t;
00101 #else
00102   typedef uint32_t Thread_CPU_usage_t;
00103 #endif
00104 
00113 typedef void *Thread;
00114 
00124 typedef uintptr_t Thread_Entry_numeric_type;
00125 
00133 typedef enum {
00134   THREAD_START_NUMERIC,
00135   THREAD_START_POINTER,
00136   #if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API)
00137     THREAD_START_BOTH_POINTER_FIRST,
00138     THREAD_START_BOTH_NUMERIC_FIRST
00139   #endif
00140 } Thread_Start_types;
00141 
00143 typedef Thread ( *Thread_Entry )( void );   /* basic type */
00144 
00148 typedef Thread ( *Thread_Entry_numeric )( Thread_Entry_numeric_type );
00149 
00153 typedef Thread ( *Thread_Entry_pointer )( void * );
00154 
00158 typedef Thread ( *Thread_Entry_both_pointer_first )( void *, Thread_Entry_numeric_type );
00159 
00164 typedef Thread ( *Thread_Entry_both_numeric_first )( Thread_Entry_numeric_type, void * );
00165 
00173 typedef enum {
00174   THREAD_CPU_BUDGET_ALGORITHM_NONE,
00175   THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE,
00176   #if defined(RTEMS_SCORE_THREAD_ENABLE_EXHAUST_TIMESLICE)
00177     THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE,
00178   #endif
00179   #if defined(RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT)
00180     THREAD_CPU_BUDGET_ALGORITHM_CALLOUT
00181   #endif
00182 }  Thread_CPU_budget_algorithms;
00183 
00187 typedef void (*Thread_CPU_budget_algorithm_callout )( Thread_Control * );
00188 
00194 struct rtems_task_variable_tt;
00195 
00201 typedef struct {
00203   struct rtems_task_variable_tt  *next;
00207   void                          **ptr;
00209   void                           *gval;
00211   void                           *tval;
00213   void                          (*dtor)(void *);
00214 } rtems_task_variable_t;
00215 
00220 typedef struct {
00222   Thread_Entry                         entry_point;
00224   Thread_Start_types                   prototype;
00226   void                                *pointer_argument;
00228   Thread_Entry_numeric_type            numeric_argument;
00229   /*-------------- initial execution modes ----------------- */
00233   bool                                 is_preemptible;
00235   Thread_CPU_budget_algorithms         budget_algorithm;
00239   Thread_CPU_budget_algorithm_callout  budget_callout;
00241   uint32_t                             isr_level;
00243   Priority_Control                     initial_priority;
00244   #if defined(RTEMS_SCORE_THREAD_ENABLE_USER_PROVIDED_STACK_VIA_API)
00245 
00246     bool                                 core_allocated_stack;
00247   #endif
00248 
00249   Stack_Control                        Initial_stack;
00250   #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
00251 
00252     Context_Control_fp                  *fp_context;
00253   #endif
00254 
00255   void                                *stack;
00256 } Thread_Start_information;
00257 
00262 #define THREAD_STATUS_PROXY_BLOCKING 0x1111111
00263 
00274 typedef union {
00275   void       *mutable_object;
00276   const void *immutable_object;
00277 } Thread_Wait_information_Object_argument_type;
00278 
00285 typedef struct {
00287   Objects_Id            id;
00289   uint32_t              count;
00291   void                 *return_argument;
00293   Thread_Wait_information_Object_argument_type
00294                         return_argument_second;
00296   uint32_t              option;
00302   uint32_t              return_code;
00303 
00307   Chain_Control         Block2n;
00309   Thread_queue_Control *queue;
00310 }   Thread_Wait_information;
00311 
00319 typedef struct {
00321   Objects_Control          Object;
00323   States_Control           current_state;
00325   Priority_Control         current_priority;
00327   Priority_Control         real_priority;
00329   uint32_t                 resource_count;
00330 
00332   Thread_Wait_information  Wait;
00334   Watchdog_Control         Timer;
00335 #if defined(RTEMS_MULTIPROCESSING)
00336 
00337   MP_packet_Prefix        *receive_packet;
00338 #endif
00339      /****************** end of common block ********************/
00341   Chain_Node               Active;
00342 }   Thread_Proxy_control;
00343 
00351 typedef enum {
00353   THREAD_API_RTEMS,
00355   THREAD_API_POSIX
00356 }  Thread_APIs;
00357 
00359 #define THREAD_API_FIRST THREAD_API_RTEMS
00360 
00362 #define THREAD_API_LAST  THREAD_API_POSIX
00363 
00367 struct Thread_Control_struct {
00369   Objects_Control          Object;
00371   States_Control           current_state;
00373   Priority_Control         current_priority;
00375   Priority_Control         real_priority;
00377   uint32_t                 resource_count;
00379   Thread_Wait_information  Wait;
00381   Watchdog_Control         Timer;
00382 #if defined(RTEMS_MULTIPROCESSING)
00383 
00384   MP_packet_Prefix        *receive_packet;
00385 #endif
00386 #ifdef __RTEMS_STRICT_ORDER_MUTEX__
00387 
00390   Chain_Control            lock_mutex;
00391 #endif
00392      /*================= end of common block =================*/
00393 #if defined(RTEMS_MULTIPROCESSING)
00394 
00395   bool                                  is_global;
00396 #endif
00397 
00398   bool                                  is_preemptible;
00399 #if __RTEMS_ADA__
00400 
00401   void                                 *rtems_ada_self;
00402 #endif
00403 
00407   uint32_t                              cpu_time_budget;
00412   Thread_CPU_budget_algorithms          budget_algorithm;
00414   Thread_CPU_budget_algorithm_callout   budget_callout;
00418   Thread_CPU_usage_t                    cpu_time_used;
00419 
00421   void                                 *scheduler_info;
00422 
00426   Thread_Start_information              Start;
00428   Context_Control                       Registers;
00429 #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
00430 
00433   Context_Control_fp                   *fp_context;
00434 #endif
00435 
00436   struct _reent                        *libc_reent;
00438   void                                 *API_Extensions[ THREAD_API_LAST + 1 ];
00440   void                                **extensions;
00442   rtems_task_variable_t                *task_variables;
00443 };
00444 
00448 SCORE_EXTERN void *rtems_ada_self;
00449 
00454 SCORE_EXTERN Objects_Information _Thread_Internal_information;
00455 
00463 SCORE_EXTERN Context_Control _Thread_BSP_context;
00464 
00470 SCORE_EXTERN volatile uint32_t   _Thread_Dispatch_disable_level;
00471 
00472 #if defined(RTEMS_SMP)
00473 
00477   SCORE_EXTERN SMP_lock_spinlock_nested_Control _Thread_Dispatch_disable_level_lock;
00478 #endif
00479 
00485 SCORE_EXTERN uint32_t   _Thread_Maximum_extensions;
00486 
00490 SCORE_EXTERN uint32_t   _Thread_Ticks_per_timeslice;
00491 
00496 #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
00497 SCORE_EXTERN Thread_Control *_Thread_Allocated_fp;
00498 #endif
00499 
00506 SCORE_EXTERN struct _reent **_Thread_libc_reent;
00512 void _Thread_Handler_initialization(void);
00513 
00521 void _Thread_Create_idle(void);
00522 
00535 void _Thread_Start_multitasking( void );
00536 
00555 void _Thread_Dispatch( void );
00556 
00568 size_t _Thread_Stack_Allocate(
00569   Thread_Control *the_thread,
00570   size_t          stack_size
00571 );
00572 
00578 void _Thread_Stack_Free(
00579   Thread_Control *the_thread
00580 );
00581 
00595 bool _Thread_Initialize(
00596   Objects_Information                  *information,
00597   Thread_Control                       *the_thread,
00598   void                                 *stack_area,
00599   size_t                                stack_size,
00600   bool                                  is_fp,
00601   Priority_Control                      priority,
00602   bool                                  is_preemptible,
00603   Thread_CPU_budget_algorithms          budget_algorithm,
00604   Thread_CPU_budget_algorithm_callout   budget_callout,
00605   uint32_t                              isr_level,
00606   Objects_Name                          name
00607 );
00608 
00622 bool _Thread_Start(
00623   Thread_Control            *the_thread,
00624   Thread_Start_types         the_prototype,
00625   void                      *entry_point,
00626   void                      *pointer_argument,
00627   Thread_Entry_numeric_type  numeric_argument
00628 );
00629 
00639 bool _Thread_Restart(
00640   Thread_Control            *the_thread,
00641   void                      *pointer_argument,
00642   Thread_Entry_numeric_type  numeric_argument
00643 );
00644 
00656 void _Thread_Reset(
00657   Thread_Control            *the_thread,
00658   void                      *pointer_argument,
00659   Thread_Entry_numeric_type  numeric_argument
00660 );
00661 
00669 void _Thread_Close(
00670   Objects_Information  *information,
00671   Thread_Control       *the_thread
00672 );
00673 
00685 void _Thread_Ready(
00686   Thread_Control *the_thread
00687 );
00688 
00700 void _Thread_Clear_state(
00701   Thread_Control *the_thread,
00702   States_Control  state
00703 );
00704 
00719 void _Thread_Set_state(
00720   Thread_Control *the_thread,
00721   States_Control  state
00722 );
00723 
00736 void _Thread_Set_transient(
00737   Thread_Control *the_thread
00738 );
00739 
00748 void _Thread_Load_environment(
00749   Thread_Control *the_thread
00750 );
00751 
00767 void _Thread_Handler( void );
00768 
00778 void _Thread_Delay_ended(
00779   Objects_Id  id,
00780   void       *ignored
00781 );
00782 
00794 void _Thread_Change_priority (
00795   Thread_Control   *the_thread,
00796   Priority_Control  new_priority,
00797   bool              prepend_it
00798 );
00799 
00806 void _Thread_Set_priority(
00807   Thread_Control   *the_thread,
00808   Priority_Control  new_priority
00809 );
00810 
00815 #define _Thread_Suspend( _the_thread ) \
00816         _Thread_Set_state( _the_thread, STATES_SUSPENDED )
00817 
00823 #define _Thread_Resume( _the_thread ) \
00824         _Thread_Clear_state( _the_thread, STATES_SUSPENDED )
00825 
00826 #if (CPU_PROVIDES_IDLE_THREAD_BODY == FALSE)
00827 
00832 void *_Thread_Idle_body(
00833   uintptr_t  ignored
00834 );
00835 #endif
00836 
00839 typedef void (*rtems_per_thread_routine)( Thread_Control * );
00840 
00846 void rtems_iterate_over_all_threads(
00847   rtems_per_thread_routine routine
00848 );
00849 
00871 Thread_Control *_Thread_Get (
00872   Objects_Id         id,
00873   Objects_Locations *location
00874 );
00875 
00894 void _Thread_blocking_operation_Cancel(
00895   Thread_blocking_operation_States  sync_state,
00896   Thread_Control                   *the_thread,
00897   ISR_Level                         level
00898 );
00899 #if defined(RTEMS_SMP)
00900 
00906   void _Thread_Dispatch_initialization(void);
00907 
00914   bool _Thread_Dispatch_in_critical_section(void);
00915 
00921   uint32_t _Thread_Dispatch_get_disable_level(void);
00922 
00929   uint32_t _Thread_Dispatch_set_disable_level(uint32_t value);
00930 
00936   uint32_t _Thread_Dispatch_increment_disable_level(void);
00937 
00943   uint32_t _Thread_Dispatch_decrement_disable_level(void);
00944 
00945 #else
00946   /*
00947    * The _Thread_Dispatch_... functions are in thread.inl
00948    */
00949 #endif
00950 
00951 #ifndef __RTEMS_APPLICATION__
00952 #include <rtems/score/thread.inl>
00953 #endif
00954 #if defined(RTEMS_MULTIPROCESSING)
00955 #include <rtems/score/threadmp.h>
00956 #endif
00957 
00958 #ifdef __cplusplus
00959 }
00960 #endif
00961 
00964 #endif
00965 /* end of include file */