|
RTEMS CPU Kit with SuperCore
4.10.99.0
|
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 */
1.7.5