⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtos.c

📁 完全用C语言编写的C51单片机多任务操作系统,任务调度基于主动放弃,特别适合STC单片机.
💻 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 + -