summaryrefslogblamecommitdiff
path: root/nuttx/include/sched.h
blob: bab6f517f91f93568bd562a59c33f4cf5364b975 (plain) (tree)
























































                                                                            


































                                                                              
                                                              


                                                                               
                              
                                                                  




                                                                                   







                                                          















                                                      































                                                                        

                                                                        










                                                                        
                                                                        






                                                                        
                                                                        


                                                                        
                           
                                                                        

                                                                        
                                                                        
                                                                        
                                                                        
                                                                        
      


                                                                        
                                                                
                                               
      


                                                                        
                                                                        


                                                                        
                              






                                                                        
      


                                                                        
                             
                                                                        
                                                                        
      







                                                                        
                                                                        


                            
                                                                        












                                                                        




                                                             
















                                                              
                           
                                                                       

                                                              

                                                                       
                                                     
      
                                            
                           

                                                                          
     

                                                          
      





                                                      
                                                               
                                        
                                                         
                                                        
                                                                   




                                                  
                                                                












                                                            


                                                                    









                                         
                                                 
                            
                                                     


                                     






                                                                  






                         
/************************************************************
 * sched.h
 *
 *   Copyright (C) 2007 Gregory Nutt. All rights reserved.
 *   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 * 3. Neither the name Gregory Nutt nor the names of its contributors may be
 *    used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 ************************************************************/

#ifndef __SCHED_H
#define __SCHED_H

/************************************************************
 * Included Files
 ************************************************************/

#include <nuttx/config.h>
#include <queue.h>
#include <signal.h>
#include <semaphore.h>
#include <pthread.h>
#include <mqueue.h>
#include <time.h>
#include <nuttx/irq.h>

/************************************************************
 * Definitions
 ************************************************************/

/* Task Management Definitins *******************************/

/* This is the maximum number of times that a lock can be set */

#define MAX_LOCK_COUNT    127

/* Values for the _TCB flags flag bits */

#define TCB_FLAG_PTHREAD        0x0001 /* Thread is a pthread */
#define TCB_FLAG_NONCANCELABLE  0x0002 /* Pthread is non-cancelable */
#define TCB_FLAG_CANCEL_PENDING 0x0004 /* Pthread cancel is pending */
#define TCB_FLAG_ROUND_ROBIN    0x0008 /* Round robin sched enabled */

/* Pthread definitions **************************************/

#define PTHREAD_KEYS_MAX CONFIG_NPTHREAD_KEYS

/************************************************************
 * Global Type Definitions
 ************************************************************/

#ifndef __ASSEMBLY__

/* General Task Management Types ****************************/

/* This is the type of the task_state field of the TCB.
 * NOTE: the order and content of this enumeration is
 * critical since there are some OS tables indexed by these
 * values.
 */

typedef enum tstate_e
{
  TSTATE_TASK_INVALID    = 0, /* INVALID - TCB has not yet been initialized */

  TSTATE_TASK_PENDING    = 1, /* READY_TO_RUN - Pending preemption unlock */
  TSTATE_TASK_READYTORUN = 2, /* READY-TO-RUN - But not running */
  TSTATE_TASK_RUNNING    = 3, /* READY_TO_RUN - And running */

  TSTATE_TASK_INACTIVE   = 4, /* BLOCKED - Initialized but not yet activated */
  TSTATE_WAIT_SEM        = 5, /* BLOCKED - Waiting for a semaphore */
#ifndef CONFIG_DISABLE_SIGNALS
  TSTATE_WAIT_SIG        = 6, /* BLOCKED - Waiting for a signal */
#endif
#ifndef CONFIG_DISABLE_MQUEUE
  TSTATE_WAIT_MQNOTEMPTY,     /* BLOCKED - Waiting for a MQ to become not empty. */
  TSTATE_WAIT_MQNOTFULL       /* BLOCKED - Waiting for a MQ to become not full. */
#endif
};
typedef enum tstate_e tstate_t;

/* The following definitions are determined by tstate_t */

#define FIRST_READY_TO_RUN_STATE TSTATE_TASK_READYTORUN
#define LAST_READY_TO_RUN_STATE  TSTATE_TASK_RUNNING
#define FIRST_BLOCKED_STATE      TSTATE_TASK_INACTIVE
#ifndef CONFIG_DISABLE_MQUEUE
# define LAST_BLOCKED_STATE      TSTATE_WAIT_MQNOTFULL
# ifndef CONFIG_DISABLE_SIGNALS
#  define NUM_TASK_STATES        9
# else
#  define NUM_TASK_STATES        8
# endif
#else
# ifndef CONFIG_DISABLE_SIGNALS
#  define LAST_BLOCKED_STATE     TSTATE_WAIT_SIG
#  define NUM_TASK_STATES        7
# else
#  define LAST_BLOCKED_STATE     TSTATE_WAIT_SEM
#  define NUM_TASK_STATES        6
# endif
#endif

/* The following is the form of a thread start-up function */

typedef void (*start_t)(void);

/* This is the entry point into the main thread of the task
 * or into a created pthread within the task.
 */

union entry_u
{
  pthread_startroutine_t pthread;
  main_t main;
};
typedef union entry_u entry_t;

/* This is the type of the function that is executed with
 * exit() is called (if registered via atexit()).
 */

typedef void (*exitfunc_t)(void);

/* POSIX Message queue */

typedef struct msgq_s msgq_t;

/* This is the task control block (TCB) */

struct _TCB
{
  /* Fields used to support list management ***************************/

  FAR struct _TCB *flink;         /* link in DQ of TCBs               */
  FAR struct _TCB *blink;

  /* Task Management Fields *******************************************/

  pid_t    pid;                   /* This is the ID of the thread     */
  start_t  start;                 /* Thread start function            */
  entry_t  entry;                 /* Entry Point into the thread      */
  exitfunc_t exitfunc;            /* Called if exit is called.        */
  ubyte    sched_priority;        /* Current priority of the thread   */
  tstate_t task_state;            /* Current state of the thread      */
  uint16   flags;                 /* Misc. general status flags       */
  sint16   lockcount;             /* 0=preemptable (not-locked)       */
  FAR void *joininfo;             /* Detach-able info to support join */
#if CONFIG_RR_INTERVAL > 0
  int      timeslice;             /* RR timeslice interval remaining  */
#endif

  /* Values needed to restart a task **********************************/

  ubyte    init_priority;         /* Initial priority of the task     */
  char    *argv[CONFIG_MAX_TASK_ARGS+1]; /* Name+start-up parameters  */

  /* Stack-Related Fields *********************************************/

#ifndef CONFIG_CUSTOM_STACK
  size_t  adj_stack_size;         /* Stack size after adjustment      */
                                  /* for hardware, processor, etc.    */
                                  /* (for debug purposes only)        */
  FAR void *stack_alloc_ptr;      /* Pointer to allocated stack       */
                                  /* Need to deallocate stack         */
  FAR void *adj_stack_ptr;        /* Adjusted stack_alloc_ptr for HW  */
                                  /* The initial stack pointer value  */
#endif

  /* POSIX thread Specific Data ***************************************/

#if !defined(CONFIG_DISABLE_PTHREAD) && CONFIG_NPTHREAD_KEYS > 0
  FAR void *pthread_data[CONFIG_NPTHREAD_KEYS];
#endif

  /* POSIX Semaphore Control Fields ***********************************/

  sem_t *waitsem;                 /* Semaphore ID waiting on          */

  /* POSIX Signal Control Fields **************************************/

#ifndef CONFIG_DISABLE_SIGNALS
  sigset_t   sigprocmask;         /* Signals that are blocked         */
  sigset_t   sigwaitmask;         /* Waiting for pending signals      */
  sq_queue_t sigactionq;          /* List of actions for signals      */
  sq_queue_t sigpendingq;         /* List of Pending Signals          */
  sq_queue_t sigpendactionq;      /* List of pending signal actions   */
  sq_queue_t sigpostedq;          /* List of posted signals           */
  siginfo_t  sigunbinfo;          /* Signal info when task unblocked  */
#endif

  /* POSIX Named Message Queue Fields *********************************/

#ifndef CONFIG_DISABLE_MQUEUE
  sq_queue_t msgdesq;             /* List of opened message queues    */
  FAR msgq_t *msgwaitq;           /* Waiting for this message queue   */
#endif

  /* Library related fields *******************************************/

  int        errno;               /* Current per-thread errno         */

  /* File system support **********************************************/

#if CONFIG_NFILE_DESCRIPTORS > 0
  FAR struct filelist *filelist;  /* Maps file descriptor to file     */
#endif

#if CONFIG_NFILE_STREAMS > 0
  FAR struct streamlist *streams; /* Holds C buffered I/O info        */
#endif

  /* State save areas *************************************************/
  /* The form and content of these fields are processor-specific.     */

  struct xcptcontext xcp;        /* Interrupt register save area      */

#if CONFIG_TASK_NAME_SIZE > 0
  char name[CONFIG_TASK_NAME_SIZE]; /* Task name                      */
#endif

};
typedef struct _TCB _TCB;

/* This is the callback type used by sched_foreach() */

typedef void (sched_foreach_t)(FAR _TCB *tcb, FAR void *arg);

#endif /* __ASSEMBLY__ */

/************************************************************
 * Global Function Prototypes
 ************************************************************/

#ifndef __ASSEMBLY__
#undef EXTERN
#if defined(__cplusplus)
#define EXTERN extern "C"
extern "C" {
#else
#define EXTERN extern
#endif

/* Task Control Interfaces (non-standard) */

#ifndef CONFIG_CUSTOM_STACK
EXTERN STATUS  task_init(FAR _TCB *tcb, const char *name, int priority,
                         FAR uint32 *stack, uint32 stack_size,
                         main_t entry, char *argv[]);
#else
EXTERN STATUS  task_init(FAR _TCB *tcb, const char *name, int priority,
                         main_t entry, char *argv[]);
#endif
EXTERN STATUS  task_activate(FAR _TCB *tcb);
#ifndef CONFIG_CUSTOM_STACK
EXTERN int     task_create(const char *name, int priority, int stack_size,
                           main_t entry, char *argv[]);
#else
EXTERN int     task_create(const char *name, int priority,
                           main_t entry, char *argv[]);
#endif
EXTERN STATUS  task_delete(pid_t pid);
EXTERN STATUS  task_restart(pid_t pid);

/* Task Scheduling Interfaces (based on POSIX APIs) */

EXTERN int     sched_setparam(pid_t pid,
                              const struct sched_param *param);
EXTERN int     sched_getparam(pid_t pid,
                              struct sched_param *param);
EXTERN int     sched_setscheduler(pid_t pid, int policy,
                                  const struct sched_param *param);
EXTERN int     sched_getscheduler(pid_t pid);
EXTERN int     sched_yield(void);
EXTERN int     sched_get_priority_max(int policy);
EXTERN int     sched_get_priority_min(int policy);
EXTERN int     sched_rr_get_interval(pid_t pid,
                                     struct timespec *interval);

/* Task Switching Interfaces (non-standard) */

EXTERN STATUS  sched_lock(void);
EXTERN STATUS  sched_unlock(void);
EXTERN sint32  sched_lockcount(void);

/* If instrumentation of the scheduler is enabled, then some
 * outboard logic must provide the following interfaces.
 */

#ifdef CONFIG_SCHED_INSTRUMENTATION

EXTERN void sched_note_start(FAR _TCB *tcb );
EXTERN void sched_note_stop(FAR _TCB *tcb );
EXTERN void sched_note_switch(FAR _TCB *pFromTcb, FAR _TCB *pToTcb);

#else
# define sched_note_start(t)
# define sched_note_stop(t)
# define sched_note_switch(t1, t2)
#endif /* CONFIG_SCHED_INSTRUMENTATION */

/* File system helpers */

#if CONFIG_NFILE_DESCRIPTORS > 0
EXTERN FAR struct filelist *sched_getfiles(void);
#if CONFIG_NFILE_STREAMS > 0
EXTERN FAR struct streamlist *sched_getstreams(void);
#endif /* CONFIG_NFILE_STREAMS */
#endif /* CONFIG_NFILE_DESCRIPTORS */

/* sched_foreach will enumerate over each task and provide the
 * TCB of each task to a user callback functions.  Interrupts
 * will be disabled throughout this enumeration!
 */

EXTERN void sched_foreach(sched_foreach_t handler, FAR void *arg);

#undef EXTERN
#if defined(__cplusplus)
}
#endif
#endif /* __ASSEMBLY__ */

#endif /* __SCHED_H */