#include
#include
#define INT_REGBANK 1
#define TIMESHARING 5
#define RTX_STACKFREE 20
#define RTX_MAXTASKN 10
#define RTX_RAMTOP 0xFF
#define INT_CLOCK 10000
#define RTX_TIMESHARING (0 - TIMESHARING)
#define RTX_CLOCK (0 - INT_CLOCK)
#define RTX_REGISTERBANK INT_REGBANK
#define K_SIG 1
#define K_TMO 2
#define SIG_EVENT 4
#define TMO_EVENT 8
#define K_READY 16
#define K_ACTIVE 32
#define K_ROBIN 64
#define K_IVL 128
#define B_WAITSIG 0
#define B_WAITTIM 1
#define B_SIGNAL 2
#define B_TIMEOUT 3
#define B_READY 4
#define B_ACTIVE 5
#define B_ROBIN 6
#define B_INTERVAL 7
idata unsigned char STKP[RTX_MAXTASKN];
idata unsigned char RTX_RobinTime;
idata unsigned char TASK_Current;
idata unsigned char RTX_SAVEPSW;
idata unsigned char RTX_SAVEACC;
bit RTX_TS_REQ=0;
bit RTX_TS_DELAY=0;
idata struct
{
char time;
char st;
}
STATE[RTX_MAXTASKN];
void os_system_init();
unsigned char task_switch();
unsigned char os_system_start();
unsigned char os_delete_task(unsigned char task_no);
unsigned char os_send_signal(unsigned char task_no);
unsigned char isr_send_signal(unsigned char task_no);
unsigned char os_clear_signal(unsigned char task_no);
unsigned char os_wait(unsigned type, unsigned timeout);
unsigned char os_create_task(unsigned int proc_name, unsigned char task_no);
unsigned char task_switch()
{
unsigned char i;
unsigned char next;
unsigned char limit;
SP-=2;
RTX_TS_DELAY=1;
next=TASK_Current;
while(1)
{
if (++next==RTX_MAXTASKN)next=0;
if (STATE[next].st&K_READY)break;
}
while(TASK_Current
{
TASK_Current++;
i=STKP[TASK_Current];
STKP[TASK_Current]=SP;
if(TASK_Current==RTX_MAXTASKN)
{
limit=RTX_RAMTOP;
}
else
{
limit=STKP[TASK_Current+1];
}
while(i!=limit)
{
SP++;
i++;
DBYTE[SP]=DBYTE[i];
}
}
while(TASK_Current>next)
{
if(TASK_Current==RTX_MAXTASKN)
{
i=RTX_RAMTOP;
}
else
{
i = STKP[TASK_Current+1];
}
limit = STKP[TASK_Current];
while(SP!=li