diff options
Diffstat (limited to '')
-rw-r--r-- | cpukit/score/include/rtems/score/thread.h | 454 |
1 files changed, 17 insertions, 437 deletions
diff --git a/cpukit/score/include/rtems/score/thread.h b/cpukit/score/include/rtems/score/thread.h index 4300d1a55d..c07350bc5a 100644 --- a/cpukit/score/include/rtems/score/thread.h +++ b/cpukit/score/include/rtems/score/thread.h @@ -19,6 +19,22 @@ #ifndef _RTEMS_SCORE_THREAD_H #define _RTEMS_SCORE_THREAD_H +#include <rtems/score/context.h> +#if defined(RTEMS_MULTIPROCESSING) +#include <rtems/score/mppkt.h> +#endif +#include <rtems/score/object.h> +#include <rtems/score/percpu.h> +#include <rtems/score/priority.h> +#include <rtems/score/stack.h> +#include <rtems/score/states.h> +#include <rtems/score/tqdata.h> +#include <rtems/score/watchdog.h> + +#ifdef __cplusplus +extern "C" { +#endif + /** * @defgroup ScoreThread Thread Handler * @@ -50,26 +66,6 @@ #define RTEMS_SCORE_THREAD_ENABLE_USER_PROVIDED_STACK_VIA_API #endif -#ifdef __cplusplus -extern "C" { -#endif - -#include <rtems/score/percpu.h> -#include <rtems/score/context.h> -#include <rtems/score/cpu.h> -#include <rtems/score/isr.h> -#if defined(RTEMS_MULTIPROCESSING) -#include <rtems/score/mppkt.h> -#endif -#include <rtems/score/object.h> -#include <rtems/score/priority.h> -#include <rtems/score/scheduler.h> -#include <rtems/score/stack.h> -#include <rtems/score/states.h> -#include <rtems/score/tod.h> -#include <rtems/score/tqdata.h> -#include <rtems/score/watchdog.h> - /* * The user can define this at configure time and go back to ticks * resolution. @@ -236,12 +232,6 @@ typedef struct { } Thread_Start_information; /** - * The following structure contains the information necessary to manage - * a thread which it is waiting for a resource. - */ -#define THREAD_STATUS_PROXY_BLOCKING 0x1111111 - -/** * @brief Union type to hold a pointer to an immutable or a mutable object. * * The main purpose is to enable passing of pointers to read-only send buffers @@ -450,359 +440,6 @@ struct Thread_Control_struct { rtems_task_variable_t *task_variables; }; -/** - * Self for the GNU Ada Run-Time - */ -SCORE_EXTERN void *rtems_ada_self; - -/** - * The following defines the information control block used to - * manage this class of objects. - */ -SCORE_EXTERN Objects_Information _Thread_Internal_information; - -/** - * The following context area contains the context of the "thread" - * which invoked the start multitasking routine. This context is - * restored as the last action of the stop multitasking routine. Thus - * control of the processor can be returned to the environment - * which initiated the system. - */ -SCORE_EXTERN Context_Control _Thread_BSP_context; - -/** - * The following holds how many user extensions are in the system. This - * is used to determine how many user extension data areas to allocate - * per thread. - */ -SCORE_EXTERN uint32_t _Thread_Maximum_extensions; - -/** - * The following is used to manage the length of a timeslice quantum. - */ -SCORE_EXTERN uint32_t _Thread_Ticks_per_timeslice; - -/** - * The following points to the thread whose floating point - * context is currently loaded. - */ -#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) -SCORE_EXTERN Thread_Control *_Thread_Allocated_fp; -#endif - -#if !defined(__DYNAMIC_REENT__) -/** - * The C library re-enter-rant global pointer. Some C library implementations - * such as newlib have a single global pointer that changed during a context - * switch. The pointer points to that global pointer. The Thread control block - * holds a pointer to the task specific data. - */ -SCORE_EXTERN struct _reent **_Thread_libc_reent; -#endif - -/** - * @brief Initialize thread handler. - * - * This routine performs the initialization necessary for this handler. - */ -void _Thread_Handler_initialization(void); - -/** - * @brief Create idle thread. - * - * This routine creates the idle thread. - * - * @warning No thread should be created before this one. - */ -void _Thread_Create_idle(void); - -/** - * @brief Start thread multitasking. - * - * This routine initiates multitasking. It is invoked only as - * part of initialization and its invocation is the last act of - * the non-multitasking part of the system initialization. - * - * - * - INTERRUPT LATENCY: - * + ready chain - * + select heir - */ -void _Thread_Start_multitasking( void ); - -/** - * @brief Allocate the requested stack space for the thread. - * - * Allocate the requested stack space for the thread. - * Set the Start.stack field to the address of the stack. - * - * @param[in] the_thread is the thread where the stack space is requested - * - * @retval actual size allocated after any adjustment - * @retval zero if the allocation failed - */ -size_t _Thread_Stack_Allocate( - Thread_Control *the_thread, - size_t stack_size -); - -/** - * @brief Deallocate thread stack. - * - * Deallocate the Thread's stack. - */ -void _Thread_Stack_Free( - Thread_Control *the_thread -); - -/** - * @brief Initialize thread. - * - * This routine initializes the specified the thread. It allocates - * all memory associated with this thread. It completes by adding - * the thread to the local object table so operations on this - * thread id are allowed. - * - * @note If stack_area is NULL, it is allocated from the workspace. - * - * @note If the stack is allocated from the workspace, then it is - * guaranteed to be of at least minimum size. - */ -bool _Thread_Initialize( - Objects_Information *information, - Thread_Control *the_thread, - void *stack_area, - size_t stack_size, - bool is_fp, - Priority_Control priority, - bool is_preemptible, - Thread_CPU_budget_algorithms budget_algorithm, - Thread_CPU_budget_algorithm_callout budget_callout, - uint32_t isr_level, - Objects_Name name -); - -/** - * @brief Initializes thread and executes it. - * - * This routine initializes the executable information for a thread - * and makes it ready to execute. After this routine executes, the - * thread competes with all other threads for CPU time. - * - * @param the_thread is the thread to be initialized - * @param the_prototype - * @param entry_point - * @param pointer_argument - * @param numeric_argument - * @param[in,out] processor The processor if used to start an idle thread - * during system initialization. Must be set to @c NULL to start a normal - * thread. - */ -bool _Thread_Start( - Thread_Control *the_thread, - Thread_Start_types the_prototype, - void *entry_point, - void *pointer_argument, - Thread_Entry_numeric_type numeric_argument, - Per_CPU_Control *processor -); - -/** - * @brief Restarts the specified thread. - * - * This support routine restarts the specified task in a way that the - * next time this thread executes, it will begin execution at its - * original starting point. - * - * TODO: multiple task arg profiles - */ -bool _Thread_Restart( - Thread_Control *the_thread, - void *pointer_argument, - Thread_Entry_numeric_type numeric_argument -); - -/** - * @brief Resets a thread to its initial state. - * - * This routine resets a thread to its initial state but does - * not restart it. Some APIs do this in separate - * operations and this division helps support this. - * - * @param[in] the_thread is the thread to resets - * @param[in] pointer_argument - * @param[in] numeric_argument - */ -void _Thread_Reset( - Thread_Control *the_thread, - void *pointer_argument, - Thread_Entry_numeric_type numeric_argument -); - -/** - * @brief Frees all memory associated with the specified thread. - * - * This routine frees all memory associated with the specified - * thread and removes it from the local object table so no further - * operations on this thread are allowed. - */ -void _Thread_Close( - Objects_Information *information, - Thread_Control *the_thread -); - -/** - * @brief Removes any set states for @a the_thread. - * - * This routine removes any set states for @a the_thread. It performs - * any necessary scheduling operations including the selection of - * a new heir thread. - * - * - INTERRUPT LATENCY: - * + ready chain - * + select heir - */ -void _Thread_Ready( - Thread_Control *the_thread -); - -/** - * @brief Clears the indicated STATES for @a the_thread. - * - * This routine clears the indicated STATES for @a the_thread. It performs - * any necessary scheduling operations including the selection of - * a new heir thread. - * - * - INTERRUPT LATENCY: - * + priority map - * + select heir - */ -void _Thread_Clear_state( - Thread_Control *the_thread, - States_Control state -); - -/** - * @brief Sets the indicated @a state for @a the_thread. - * - * This routine sets the indicated @a state for @a the_thread. It performs - * any necessary scheduling operations including the selection of - * a new heir thread. - * - * @param[in] the_thread is the thread to set the state for. - * @param[in] state is the state to set the_thread to. - * - * - INTERRUPT LATENCY: - * + ready chain - * + select map - */ -void _Thread_Set_state( - Thread_Control *the_thread, - States_Control state -); - -/** - * @brief Sets the transient state for a thread. - * - * This routine sets the Transient state for @a the_thread. It performs - * any necessary scheduling operations including the selection of - * a new heir thread. - * - * @param[in] the_thread is the thread to preform the action upon. - * - * - INTERRUPT LATENCY: - * + single case - */ -void _Thread_Set_transient( - Thread_Control *the_thread -); - -/** - * @brief Initializes enviroment for a thread. - * - * This routine initializes the context of @a the_thread to its - * appropriate starting state. - * - * @param[in] the_thread is the pointer to the thread control block. - */ -void _Thread_Load_environment( - Thread_Control *the_thread -); - -/** - * @brief Wrapper function for all threads. - * - * This routine is the wrapper function for all threads. It is - * the starting point for all threads. The user provided thread - * entry point is invoked by this routine. Operations - * which must be performed immediately before and after the user's - * thread executes are found here. - * - * @note On entry, it is assumed all interrupts are blocked and that this - * routine needs to set the initial isr level. This may or may not - * actually be needed by the context switch routine and as a result - * interrupts may already be at there proper level. Either way, - * setting the initial isr level properly here is safe. - */ -void _Thread_Handler( void ); - -/** - * @brief Ended the delay of a thread. - * - * This routine is invoked when a thread must be unblocked at the - * end of a time based delay (i.e. wake after or wake when). - * It is called by the watchdog handler. - * - * @param[in] id is the thread id - */ -void _Thread_Delay_ended( - Objects_Id id, - void *ignored -); - -/** - * @brief Change the priority of a thread. - * - * This routine changes the current priority of @a the_thread to - * @a new_priority. It performs any necessary scheduling operations - * including the selection of a new heir thread. - * - * @param[in] the_thread is the thread to change - * @param[in] new_priority is the priority to set @a the_thread to - * @param[in] prepend_it is a switch to prepend the thread - */ -void _Thread_Change_priority ( - Thread_Control *the_thread, - Priority_Control new_priority, - bool prepend_it -); - -/** - * @brief Set thread priority. - * - * This routine updates the priority related fields in the_thread - * control block to indicate the current priority is now new_priority. - */ -void _Thread_Set_priority( - Thread_Control *the_thread, - Priority_Control new_priority -); - -/** - * This routine updates the related suspend fields in the_thread - * control block to indicate the current nested level. - */ -#define _Thread_Suspend( _the_thread ) \ - _Thread_Set_state( _the_thread, STATES_SUSPENDED ) - -/** - * This routine updates the related suspend fields in the_thread - * control block to indicate the current nested level. A force - * parameter of true will force a resume and clear the suspend count. - */ -#define _Thread_Resume( _the_thread ) \ - _Thread_Clear_state( _the_thread, STATES_SUSPENDED ) - #if (CPU_PROVIDES_IDLE_THREAD_BODY == FALSE) /** * This routine is the body of the system idle thread. @@ -828,56 +465,6 @@ void rtems_iterate_over_all_threads( ); /** - * @brief Maps thread Id to a TCB pointer. - * - * This function maps thread IDs to thread control - * blocks. If ID corresponds to a local thread, then it - * returns the_thread control pointer which maps to ID - * and @a location is set to OBJECTS_LOCAL. If the thread ID is - * global and resides on a remote node, then location is set - * to OBJECTS_REMOTE, and the_thread is undefined. - * Otherwise, location is set to OBJECTS_ERROR and - * the_thread is undefined. - * - * @param[in] id is the id of the thread. - * @param[in] location is the location of the block. - * - * @note The performance of many RTEMS services depends upon - * the quick execution of the "good object" path in this - * routine. If there is a possibility of saving a few - * cycles off the execution time, this routine is worth - * further optimization attention. - */ -Thread_Control *_Thread_Get ( - Objects_Id id, - Objects_Locations *location -); - -/** - * @brief Cancel a blocking operation due to ISR. - * - * This method is used to cancel a blocking operation that was - * satisfied from an ISR while the thread executing was in the - * process of blocking. - * - * This method will restore the previous ISR disable level during the cancel - * operation. Thus it is an implicit _ISR_Enable(). - * - * @param[in] sync_state is the synchronization state - * @param[in] the_thread is the thread whose blocking is canceled - * @param[in] level is the previous ISR disable level - * - * @note This is a rare routine in RTEMS. It is called with - * interrupts disabled and only when an ISR completed - * a blocking condition in process. - */ -void _Thread_blocking_operation_Cancel( - Thread_blocking_operation_States sync_state, - Thread_Control *the_thread, - ISR_Level level -); - -/** * @brief Returns the thread control block of the executing thread. * * This function can be called in any context. On SMP configurations @@ -905,18 +492,11 @@ RTEMS_INLINE_ROUTINE Thread_Control *_Thread_Get_executing( void ) return executing; } -#ifndef __RTEMS_APPLICATION__ -#include <rtems/score/thread.inl> -#endif -#if defined(RTEMS_MULTIPROCESSING) -#include <rtems/score/threadmp.h> -#endif +/**@}*/ #ifdef __cplusplus } #endif -/**@}*/ - #endif /* end of include file */ |