⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 thread.h

📁 开放源码的嵌入式开发环境
💻 H
📖 第 1 页 / 共 2 页
字号:
/**  *  @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 + -