Listing 3. BSP Types
typedef enum
{
  DSP_K_STATE_NULL,
  DSP_K_STATE_READY,
  DSP_K_STATE_RUN,
  DSP_K_STATE_PEND,
  DSP_K_STATE_TIMER,
  DSP_K_STATE_WAIT,

} t__DSP_K_STATES;

typedef struct
{
  t__DSP_K_TSK function;  /* task main thread */
  t__DSP_K_STATES state;  /* initial task state */
  t__DSP_K_SCHD scheduler; /* task scheduler */
  void *stack; /* main thread & scheduler stack */
  size_t stacksz; /* size of stack */

} t__DSP_K_TASK_DSCR;

 /* 
  * work out total size of context stack needed 
 */
#define _DSP_K_SAVEREG \
  ( _DSP_K_CTXTAST + \
    _DSP_K_CTXTREG + \
    _DSP_K_CTXTIDX + \
    _DSP_K_CTXTMOD + \
    _DSP_K_CTXTBSE + \
    _DSP_K_CTXTLEN + \
    _DSP_K_MULTLEN )

typedef struct
{
  t__DSP_K_STATES state; /* kernel 'queue' */
    /* thread context save stack */
  unsigned int ctxt[ _DSP_K_SAVEREG ];
  int errno; /* per. task errno */
  int eval;  /* per. task exit value */
  struct waitevent waits; /* task wait structure */
  timer_t timer;  /* timer assigned to task */
  pid_t parent; /* parent of task when run */
  gid_t group;  /* process group task belongs to */
  unsigned int drivers; /* bit set if driver open */
# if( DSP_K_STATS > 0 )
     /* see usr/src/linux/include/kernel.h etc. */
    int schedcnt;  /* count of schedules */
    int schedcall; /* scheduler invocations */
    int resetcnt; /* task reset count */
# endif

} t__DSP_K_tcb;


/* ----------------------------------------------
 * BSP DATA STRUCTURE
*/
typedef struct
{
  t__DSP_K_TSKID current;
    /* +1 for 'main' context */
  t__DSP_K_tcb tasks[ DSP_K_NUM_TASKS + 1 ];
  t__DSP_K_TASK_DSCR *tl; /* copy of entry point */
  int argc;    /* environment variables */
  char **argv;
  void *arg0;
# if( DSP_K_STATS > 0 )
    int tickcnt;  /* count of ticks */
# endif

} t__DSP_K_context;

extern t__DSP_K_context __DSP_K_context;