?? rtos.c
字號:
#include "reg52.h"
#include "ABSACC.H"
#include "device.h"
#include "rtos.h"
TCB xdata task_tcb[TASK_USER];
//#define usr_stack ((unsigned char xdata *)0);
UCHAR data TASK_SCHEDULE_IDX,SYS_STACK_BOTM;
unsigned char code seeki[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
bdata char cnt_idx=0;
sbit cnt0 = cnt_idx^0;
sbit cnt1 = cnt_idx^1;
sbit cnt2 = cnt_idx^2;
sbit cnt3 = cnt_idx^3;
sbit cnt4 = cnt_idx^4;
sbit cnt5 = cnt_idx^5;
sbit cnt6 = cnt_idx^6;
sbit cnt7 = cnt_idx^7;
unsigned int cntx[8];
void Timer0() interrupt 1
{
unsigned char i;
TIME2MS;
for(i = 0; i < 8; i++)
{
if(cnt_idx&seeki[i])
{
cntx[i]++;/*if((cnt_idx>>i)&0x01)cntx[i]++;*/
if(cntx[i] >= task_tcb[i].task_sleepcnt)
{
if((task_tcb[i].task_stat&TASKRUN) == 0)
{
cntx[i] = 0;
cnt_idx &= ~seeki[i];
task_tcb[i].task_stat = TASKRDY;// TASK READY;
}
}
}
}
}
void init_timer0(void)
{
TMOD = (TMOD & 0XF0) | 0X01;
TIME2MS;
TR0 = 1;
ET0 = 1;
TF0 = 0;
}
void start_cnt(UCHAR idx)
{
if(idx>=8)return;
cntx[idx] = 0;
cnt_idx |= seeki[idx];
}
void task_init()
{
UCHAR i;
uint addr = USR_EXR_MEM_TOP;
for(i=0;i<TASK_USER;i++)
{
task_tcb[i].task_id = i;
task_tcb[i].task_stack_top = addr;
task_tcb[i].task_stat = TASKBLOCK;
task_tcb[i].ev_wait = 0;
addr -= TASK_STACK_SIZE;
}
TASK_SCHEDULE_IDX = 0;
init_timer0();
}
void task_switch(void)
{
unsigned char i ;
unsigned int j;
task_tcb[TASK_SCHEDULE_IDX].task_stat = TASKBLOCK;
i = TASK_SCHEDULE_IDX;
while(1)
{
i++;
if(i>=TASK_USER)i = 0;
if(task_tcb[i].task_stat==TASKRDY)break;
}
task_tcb[i].task_stat = TASKRUN;
if(i==TASK_SCHEDULE_IDX)return;
j = task_tcb[TASK_SCHEDULE_IDX].task_stack_top;
EA = 0;
task_tcb[TASK_SCHEDULE_IDX].task_stack_len = SP-SYS_STACK_BOTM;
while(SP>SYS_STACK_BOTM)
{
XBYTE[j--] = DBYTE[SP--];
}
XBYTE[j--] = ACC;
XBYTE[j--] = PSW;
TASK_SCHEDULE_IDX = i;
i = PSW&0x18;
/*
i >>= 3;
i *= 8;// equ i<<=3
*/
i += 7;
XBYTE[j--] = DBYTE[i--];
XBYTE[j--] = DBYTE[i--];
XBYTE[j--] = DBYTE[i--];
XBYTE[j--] = DBYTE[i--];
XBYTE[j--] = DBYTE[i--];
XBYTE[j--] = DBYTE[i--];
XBYTE[j--] = DBYTE[i--];
XBYTE[j] = DBYTE[i];
SP = SYS_STACK_BOTM+task_tcb[TASK_SCHEDULE_IDX].task_stack_len;
j = task_tcb[TASK_SCHEDULE_IDX].task_stack_top;
while(SP>SYS_STACK_BOTM)
{
DBYTE[SP--] = XBYTE[j--];
}
ACC = XBYTE[j--];
PSW = XBYTE[j--];
i = PSW&0x18;
i >>= 3;
i += 7;
DBYTE[i--] = XBYTE[j--];
DBYTE[i--] = XBYTE[j--];
DBYTE[i--] = XBYTE[j--];
DBYTE[i--] = XBYTE[j--];
DBYTE[i--] = XBYTE[j--];
DBYTE[i--] = XBYTE[j--];
DBYTE[i--] = XBYTE[j--];
DBYTE[i] = XBYTE[j];
SP = SYS_STACK_BOTM+task_tcb[TASK_SCHEDULE_IDX].task_stack_len;
EA = 1;
}
void task_sleep(uint time)
{
if(time>1)time /= 2;
start_cnt(TASK_SCHEDULE_IDX);
task_tcb[TASK_SCHEDULE_IDX].task_sleepcnt = time;
task_switch();
}
void start_task(void)
{
uint j;
EA = 0;
SP = SYS_STACK_BOTM+task_tcb[0].task_stack_len;
j = task_tcb[0].task_stack_top;
while(SP>SYS_STACK_BOTM)
{
DBYTE[SP--] = XBYTE[j--];
}
ACC = XBYTE[j--];
PSW = XBYTE[j];
SP = SYS_STACK_BOTM+task_tcb[0].task_stack_len;
TASK_SCHEDULE_IDX = 0;
EA = 1;
}
void task_creat(unsigned int task,unsigned char taskid)
{
UCHAR i;
unsigned int j;
TCB *ptcb;
if(taskid>=TASK_USER)return;
ptcb = &task_tcb[taskid];
ptcb->task_id = taskid;
ptcb->task_stat = TASKRDY;
i = SP;
j = ptcb->task_stack_top;
XBYTE[j--]= *(UCHAR *)&task;
XBYTE[j--] = *((UCHAR *)&task+1);
ptcb->task_stack_len = i - SYS_STACK_BOTM;
while(i>SYS_STACK_BOTM)
{
XBYTE[j--] = 0;
i--;
}
}
void task_event_send(unsigned char taskid,unsigned char ev)
{
if(taskid>=TASK_USER)return;
if((task_tcb[taskid].ev_wait & ev)==0)return;
task_tcb[taskid].task_stat = TASKRDY;
task_tcb[taskid].ev_wait &= ~ev;
}
unsigned char task_event_wait(unsigned char ev)
{
task_tcb[TASK_SCHEDULE_IDX].ev_wait = ev;
task_switch();
return task_tcb[TASK_SCHEDULE_IDX].ev_wait;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -