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;