📄 thread.h
字号:
/** * @file rtems/score/thread.h * * This include file contains all constants and structures associated * with the thread control block. *//* * COPYRIGHT (c) 1989-2006. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. * * $Id: thread.h,v 1.58 2006/01/16 15:13:58 joel Exp $ */#ifndef _RTEMS_SCORE_THREAD_H#define _RTEMS_SCORE_THREAD_H/** * @defgroup ScoreThread Thread Handler * * This handler encapsulates functionality related to the management of * threads. This includes the creation, deletion, and scheduling of threads. *//**@{*/#ifdef __cplusplusextern "C" {#endif#include <rtems/score/context.h>#include <rtems/score/cpu.h>#if defined(RTEMS_MULTIPROCESSING)#include <rtems/score/mppkt.h>#endif#include <rtems/score/object.h>#include <rtems/score/priority.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 following defines the "return type" of a thread. * * @note This cannot always be right. Some APIs have void * tasks/threads, others return pointers, others may * return a numeric value. Hopefully a pointer is * always at least as big as an uint32_t . :) */typedef void *Thread;/** * The following defines the ways in which the entry point for a * thread can be invoked. Basically, it can be passed any * combination/permutation of a pointer and an uint32_t value. * * @note For now, we are ignoring the return type. */typedef enum { THREAD_START_NUMERIC, THREAD_START_POINTER, THREAD_START_BOTH_POINTER_FIRST, THREAD_START_BOTH_NUMERIC_FIRST} Thread_Start_types;/** This type corresponds to a very simple style thread entry point. */typedef Thread ( *Thread_Entry )(); /* basic type *//** This type corresponds to a thread entry point which takes a single * unsigned thirty-two bit integer as an argument. */typedef Thread ( *Thread_Entry_numeric )( uint32_t );/** This type corresponds to a thread entry point which takes a single * untyped pointer as an argument. */typedef Thread ( *Thread_Entry_pointer )( void * );/** This type corresponds to a thread entry point which takes a single * untyped pointer and an unsigned thirty-two bit integer as arguments. */typedef Thread ( *Thread_Entry_both_pointer_first )( void *, uint32_t );/** This type corresponds to a thread entry point which takes a single * unsigned thirty-two bit integer and an untyped pointer and an * as arguments. */typedef Thread ( *Thread_Entry_both_numeric_first )( uint32_t , void * );/** * The following lists the algorithms used to manage the thread cpu budget. * * Reset Timeslice: At each context switch, reset the time quantum. * Exhaust Timeslice: Only reset the quantum once it is consumed. * Callout: Execute routine when budget is consumed. */typedef enum { THREAD_CPU_BUDGET_ALGORITHM_NONE, THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE, THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE, THREAD_CPU_BUDGET_ALGORITHM_CALLOUT} Thread_CPU_budget_algorithms;/** This type defines the Thread Control Block structure. */typedef struct Thread_Control_struct Thread_Control;/** This defines thes the entry point for the thread specific timeslice * budget management algorithm. */typedef void (*Thread_CPU_budget_algorithm_callout )( Thread_Control * );/** @brief Per Task Variable Manager Structure Forward Reference * * Forward reference to the per task variable structure. */struct rtems_task_variable_tt;/** @brief Per Task Variable Manager Structure * * This is the internal structure used to manager per Task Variables. */typedef struct { /** This field points to the next per task variable for this task. */ struct rtems_task_variable_tt *next; /** This field points to the physical memory location of this per * task variable. */ void **ptr; /** This field is to the global value for this per task variable. */ void *gval; /** This field is to this thread's value for this per task variable. */ void *tval; /** This field points to the destructor for this per task variable. */ void (*dtor)(void *);} rtems_task_variable_t;/** * The following structure contains the information which defines * the starting state of a thread. */typedef struct { /** This field is the starting address for the thread. */ Thread_Entry entry_point; /** This field indicatres the how task is invoked. */ Thread_Start_types prototype; /** This field is the pointer argument passed at thread start. */ void *pointer_argument; /** This field is the numeric argument passed at thread start. */ uint32_t numeric_argument; /*-------------- initial execution modes ----------------- */ /** This field indicates whether the thread was preemptible when * it started. */ boolean is_preemptible; /** This field indicates the CPU budget algorith. */ Thread_CPU_budget_algorithms budget_algorithm; /** This field is the routine to invoke when the CPU allotment is * consumed. */ Thread_CPU_budget_algorithm_callout budget_callout; /** This field is the initial ISR disable level of this thread. */ uint32_t isr_level; /** This field is the initial priority. */ Priority_Control initial_priority; /** This field indicates whether the SuperCore allocated the stack. */ boolean core_allocated_stack; /** This field is the stack information. */ Stack_Control Initial_stack;#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) /** This field is the initial FP context area address. */ void *fp_context;#endif /** This field is the initial stack area address. */ void *stack;} 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 Thread Blocking Management Information * * This contains the information required to manage a thread while it is * blocked and to return information to it. */typedef struct { /** This field is the Id of the object this thread is waiting upon. */ Objects_Id id; /** This field is used to return an integer while when blocked. */ uint32_t count; /** This field is the first pointer to a user return argument. */ void *return_argument; /** This field is the second pointer to a user return argument. */ void *return_argument_1; /** This field contains any options in effect on this blocking operation. */ uint32_t option; /** This field will contain the return status from a blocking operation. * * @note The following assumes that all API return codes can be * treated as an uint32_t. */ uint32_t return_code; /** This field is the chain header for the second through Nth tasks * of the same priority blocked waiting on the same object. */ Chain_Control Block2n; /** This field points to the thread queue on which this thread is blocked. */ Thread_queue_Control *queue;} Thread_Wait_information;/** * The following defines the control block used to manage * each thread proxy. * * @note It is critical that proxies and threads have identical * memory images for the shared part. */typedef struct { /** This field is the object management structure for each proxy. */ Objects_Control Object; /** This field is the current execution state of this proxy. */ States_Control current_state; /** This field is the current priority state of this proxy. */ Priority_Control current_priority; /** This field is the base priority of this proxy. */ Priority_Control real_priority; /** This field is the number of mutexes currently held by this proxy. */ uint32_t resource_count; /** This field is the blocking information for this proxy. */ Thread_Wait_information Wait; /** This field is the Watchdog used to manage proxy delays and timeouts. */ Watchdog_Control Timer;#if defined(RTEMS_MULTIPROCESSING) /** This field is the received response packet in an MP system. */ MP_packet_Prefix *receive_packet;#endif /****************** end of common block ********************/ /** This field is used to manage the set of proxies in the system. */ Chain_Node Active;} Thread_Proxy_control;/** * The following record defines the control block used * to manage each thread. * * @note It is critical that proxies and threads have identical * memory images for the shared part. */typedef enum { /** This value is for the Classic RTEMS API. */ THREAD_API_RTEMS, /** This value is for the POSIX API. */ THREAD_API_POSIX, /** This value is for the ITRON API. */ THREAD_API_ITRON} Thread_APIs;/** This macro defines the first API which has threads. */#define THREAD_API_FIRST THREAD_API_RTEMS/** This macro defines the last API which has threads. */#define THREAD_API_LAST THREAD_API_ITRON/** * This structure defines the Thread Control Block (TCB). */struct Thread_Control_struct { /** This field is the object management structure for each thread. */ Objects_Control Object; /** This field is the current execution state of this thread. */ States_Control current_state; /** This field is the current priority state of this thread. */ Priority_Control current_priority; /** This field is the base priority of this thread. */ Priority_Control real_priority; /** This field is the number of mutexes currently held by this thread. */ uint32_t resource_count; /** This field is the blocking information for this thread. */ Thread_Wait_information Wait; /** This field is the Watchdog used to manage thread delays and timeouts. */ Watchdog_Control Timer;#if defined(RTEMS_MULTIPROCESSING) /** This field is the received response packet in an MP system. */ MP_packet_Prefix *receive_packet;#endif /*================= end of common block =================*/ /** This field is the number of nested suspend calls. */ uint32_t suspend_count; /** This field is true if the thread is offered globally */ boolean is_global; /** This field is is true if the post task context switch should be * executed for this thread at the next context switch. */ boolean do_post_task_switch_extension; /** This field is true if the thread is preemptible. */ boolean is_preemptible; /** This field is the GNAT self context pointer. */ void *rtems_ada_self; /** This field is the length of the time quantum that this thread is * allowed to consume. The algorithm used to manage limits on CPU usage * is specified by budget_algorithm. */ uint32_t cpu_time_budget; /** This field is the algorithm used to manage this thread's time * quantum. The algorithm may be specified as none which case, * no limit is in place. */ Thread_CPU_budget_algorithms budget_algorithm; /** This field is the method invoked with the budgeted time is consumed. */ Thread_CPU_budget_algorithm_callout budget_callout; /** This field is the number of clock ticks executed by this thread * since it was created. */ uint32_t ticks_executed; /** This field points to the Ready FIFO for this priority. */ Chain_Control *ready; /** This field contains precalculated priority map indices. */ Priority_Information Priority_map; /** This field contains information about the starting state of * this thread. */ Thread_Start_information Start; /** This field contains the context of this thread. */ Context_Control Registers;#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) /** This field points to the floating point context for this thread. * If NULL, the thread is integer only. */ void *fp_context;#endif /** This field points to the newlib reentrancy structure for this thread. */ struct _reent *libc_reent; /** This array contains the API extension area pointers. */ void *API_Extensions[ THREAD_API_LAST + 1 ]; /** This field points to the user extension pointers. */ void **extensions; /** This field points to the set of per task variables. */ 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 define the thread control pointers used to access * and manipulate the idle thread. */SCORE_EXTERN Thread_Control *_Thread_Idle;/** * 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -