/*
CRTOS 实时可剥夺型内核
1.任务不用预加载,不用预定义。任务调用时加载,可删除(退出死循环即可)
2.单位轮转查询时间由晶振和定时器初始化决定。在这里为10ms
3.定时时间为【 time*单位轮转查询时间 】 ,其中time为 rtos_wait(time)中time.
4.可运行多个任务【自定义】
5.任务从rtos_wait()处切换,在定时时间到后从定时中断中切换回来,任务执行后,回到中断,再从中断回到主程序。
*/
#include "STC12C5A.H"
#define TIMER_RELOAD() {TL0=0x00;TH0=0xC4;}//使能T/C
初始10ms
#define MAX_TASKS 8 //任务槽最大个数.
unsigned char idata task_stack[MAX_TASKS][2];//任务堆栈. PC指针为16位,需2个字节task_stack[][0]L task_stack[][1]H。
unsigned char idata task_time[MAX_TASKS]; //定时时间
unsigned char data task_id=0; //当前活动任务号
void Timer0Init() //@18.432MHz
{
AUXR &= 0x7F;
//定时器时钟12T模式
TMOD &= 0xF0;
//设置定时器模式
TMOD |= 0x01;
//设置定时器模式
TIMER_RELOAD()
TF0 = 0;
//清除TF0标志
TR0 = 1;
//定时器0开始计时
ET0=1;
EA=1;
}
void rtos_wait(unsigned char time)
{
task_time[task_id]=time;
//保存当前任务时间
task_stack[task_id][1] =*((unsigned char data* )(SP));
//保存当前断点 并把SP=SP-2,任务切换到下一任务;
SP--;
task_stack[task_id][0] =*((unsigned char data*)(SP));
SP--;
for(task_id=0;task_id<MAX_TASKS && task_time[task_id];task_id++){}
//任务号设为最大,越过最大则回到0 //根据定时时间判断
if(task_id==MAX_TASKS) //任务满 超出则回到0
task_id=0;
}
void rwcl() //任务时间是否到,任务时间到 实时切换回
{
//从把定时时间减1 ,找看哪个任务到
,任务时间到 实时切换回
unsigned char data i;
for(i=0;i<MAX_TASKS && task_time[i];i++)
{
if(--task_time[i]==0)
//多个定时时间同时到,任务越靠后,越优先执行。
{
task_id=i;
//当前任务号
//保存的PC指针调出来
SP++;
(*((unsigned char data*)(SP)))=task_stack[i][0];
SP++;
(*((unsigned char data*)(SP)))=task_stack[i][1] ;
}
}
}
void tm0_isr() interrupt 1 //using 1
{
#pragma asm
JB PSW.3,RTOS1
JB PSW.4,RTOS2
PUSH 0
PUSH 1
PUSH 2
PUSH 3
PUSH 4
PUSH 5
PUSH 6
PUSH 7
JMP RTOS0
RTOS1: JB
PSW.4,RTOS3
PUSH 8
PUSH 9
PUSH 10
PUSH 11
PUSH 12
PUSH 13
PUSH 14
PUSH 15
JMP RTOS0
RTOS2:
PUSH 10H
PUSH 11H
PUSH 12H
PUSH 13H
PUSH 14H
PUSH 15H
PUSH 16H
PUSH 17H
JMP RTOS0
RTOS3: PUSH
18H
PUSH 19H
PUSH 1AH
PUSH 1BH
PUSH 1CH
PUSH 1DH
PUSH 1EH
PUSH 1FH
RTOS0:
#pragma endasm
TIMER_RELOAD();
//定时时间重载
rwcl();
//任务时间是否到,任务时间到 实时切换回
#pragma asm
JB PSW.3,RTOS01
JB PSW.4,RTOS02
POP 7
POP 6
POP 5
POP 4
POP 3
POP 2
POP 1
POP 0
JMP NEXT
RTOS01: JB
PSW.4,RTOS3
POP 15
POP 14
POP 13
POP 12
POP 11
POP 10
POP 9
POP 8
JMP NEXT
RTOS02:
POP 17H
POP 16H
POP 15H
POP 14H
POP 13H
POP 12H
POP 11H
POP 10H
JMP NEXT
RTOS03: POP
1FH
POP 1EH
POP 1DH
POP 1CH
POP 1BH
POP 1AH
POP 19H
POP 18H
NEXT:
#pragma endasm
}