Back

#ifndef THREADSTATE_RUNNING

/*
  Constants
*/
typedef unsigned char UCHAR;
typedef unsigned int  UINT;
typedef unsigned long ULONG;

#define CreateThread    (*CreateThreadPtr)
#define SleepThread     (*SleepThreadPtr)
#define SuspendThread   (*SuspendThreadPtr)
#define TerminateThread (*TerminateThreadPtr)
#define ResumeThread    (*ResumeThreadPtr)
#define FindThread      (*FindThreadPtr)
#define CreateSemaphore (*CreateSemaphorePtr)
#define WaitSemaphore   (*WaitSemaphorePtr)
#define SignalSemaphore (*SignalSemaphorePtr)
#define SendMessage     (*SendMessagePtr)
#define ReceiveMessage  (*ReceiveMessagePtr)

#define THREADSTATE_VOID        0
#define THREADSTATE_RUNNING     1
#define THREADSTATE_BLOCKED     2
#define THREADSTATE_SUSPENDED   3

#define THREAD_COUNT            8
#define SEMAPHORE_COUNT         8
#define MESSAGE_COUNT           16
#define OS_DSTACK_SIZE          512
#define THREADSEM_COUNT         THREAD_COUNT

#define ALLTHREAD_START         0x120
#define ALLSEM_START            ALLTHREAD_START+THREAD_COUNT*sizeof(os_thread_struct)
#define ALLTHREADSEM_START      ALLSEM_START+SEMAPHORE_COUNT*sizeof(os_semaphore_struct)
#define ALLMESSAGE_START        ALLTHREADSEM_START+THREADSEM_COUNT*sizeof(os_threadsem_struct)
#define STACK_START             ALLMESSAGE_START+MESSAGE_COUNT*sizeof(os_message)

#define TOTAL_STACK_SIZE        2048-STACK_START-OS_DSTACK_SIZE
/*
  Message Types
*/

typedef struct os_message_struct
{
    void                        *message;
    struct os_message_struct    *next;
} os_message;


/*
  Thread Types
*/
typedef struct os_thread_struct
{
        void                    *hwstack;
        void                    *swstack;
        UCHAR                   priority;
        UINT                    sleep_duration;
        UCHAR                   threadID;
        UCHAR                   state;
        struct os_message       *message;
        struct os_thread_struct *next;
        struct os_thread_struct *prev;
} os_thread;

/*
  Sempahore Types
*/

typedef struct os_threadsem_struct
{
    os_thread                   *thread;
    struct os_threadsem_struct  *next;
} os_threadsem;

typedef struct os_semaphore_struct
{
    UCHAR                       remaining;
    os_threadsem                *queue;
    struct os_semaphore_struct  *next;
    struct os_semaphore_struct  *prev;
} os_semaphore;


/*
  OS Variables
*/
#asm(".EQU SpmcrAddr=0x57")

register UINT g_instaddr @6;
register UINT g_instdata @2;
register char g_spmcrval @10;
register UINT g_pageaddr @4;

UCHAR g_threadcount                 @0x100;
os_thread *g_prevthread             @0x102;
os_thread *g_currthread             @0x104;
os_thread *g_freethreads            @0x106;
os_thread *g_usedthreads            @0x108;

os_semaphore *g_freesemaphores      @0x10A;
os_semaphore *g_usedsemaphores      @0x10C;

os_semaphore *g_freethreadsems      @0x10E;
os_semaphore *g_usedthreadsems      @0x110;

os_semaphore *g_freemessages        @0x112;
os_semaphore *g_usedmessages        @0x114;

os_semaphore *g_uart_t_semaphore    @0x116;
os_semaphore *g_uart_r_semaphore    @0x118;

UCHAR *g_stkStart                   @0x11A;
UCHAR *g_stkCurrent                 @0x11C;
UCHAR *g_stkEnd                     @0x11E;

os_thread g_allthreads[THREAD_COUNT]            @ALLTHREAD_START;
os_semaphore g_allsemaphores[SEMAPHORE_COUNT]   @ALLSEM_START;
os_threadsem g_allthreadsems[THREADSEM_COUNT]   @ALLTHREADSEM_START;
os_threadsem g_allmessages[MESSAGE_COUNT]       @ALLMESSAGE_START;
UCHAR g_stkBlock[TOTAL_STACK_SIZE]              @STACK_START;

os_thread* (*CreateThreadPtr)(UINT *entryPoint, UCHAR priVal, UINT swStackSize, UINT hwStackSize)       @0x60;
void (*SleepThreadPtr)(os_thread* thread, UINT sleepLength)                                             @0x62;
void (*SuspendThreadPtr)(os_thread* thread)                                                             @0x64;
void (*TerminateThreadPtr)(os_thread* thread)                                                           @0x66;
void (*ResumeThreadPtr)(os_thread* thread)                                                              @0x68;
os_thread* (*FindThreadPtr)(UCHAR threadID)                                                             @0x6A;
os_semaphore* (*CreateSemaphorePtr)(UCHAR semVal)                                                       @0x6C;
UCHAR (*WaitSemaphorePtr)(os_semaphore *semaphore)                                                      @0x6E;
void (*SignalSemaphorePtr)(os_semaphore *semaphore)                                                     @0x70;
void (*SendMessagePtr)(os_thread *thread, void *message)                                                @0x72;
void* (*ReceiveMessagePtr)(os_thread *thread)                                                           @0x74;

#endif

Top