经典单片机C51多任务代码(改进版)
LPC_TMR16B0-> LPC_TMR16B0-> LPC_TMR16B0-> if ( LPC_TMR16B0-> LPC_TMR16B0-> if ( LPC_TMR16B0-> LPC_TMR16B0-> for(x=z;x> for(y=110;y> if(++task_id == MAX_TASKS) //中断内的实际代码 //---------------- } //======================================================================= #define MAX_TASKS 2 //任务槽个数.必须和实际任务数一至 //任务切换函数(任务调度器) if(++task_id == MAX_TASKS) SP = task_sp[task_id]; //任务装入函数.将指定的函数(参数1)装入指定(参数2)的任务槽中.如果该槽中原来就有任务,则原任务丢失,但系统本身不会发生错误. //从指定的任务开始运行任务调度.调用该宏后,将永不返回. void task1(){ void task2(){ void main(){
{
task_id = 0;
RWCH_BZ=1;//当task_id==0时说明所有任都切换了一次,置标志不再对栈进行调整。
}
SP = task_sp[task_id];
if(RWCH_BZ==0)
{//栈调整代码
SP+=2;//第一次切换程序时原栈没有(POP PSW 和POP ACC 数据调整一下,为什么请查汇编代码)
//为什么要加上面代码的分析
//中断中其实隐含了以下代码
//PUSH ACC
//PUSH PSW
//----------------
//下面两句的数据在每个任务第一次切换时任务栈内其实并没有它的数据,如果不调整,这两句将会把返回地址数据给POP掉
//所以进行SP+2处理才会正常返回切换后的任务,从而骗过CPU
//POP PSW
//POP ACC
//RET
}
//============================================
//setb et1
ET0=1;//开中断
//setb tr1
TR0=1;//开定时器
//===================================
/*
//网络原码
#include
#define MAX_TASK_DEP 12 //最大栈深.最低不得少于2个,保守值为12.
unsigned char idata task_stack[MAX_TASKS][MAX_TASK_DEP];//任务堆栈.
unsigned char task_id; //当前活动任务号
unsigned char idata task_sp[MAX_TASKS];
void task_switch(){
task_sp[task_id] = SP;
task_id = 0;
}
void task_load(unsigned int fn, unsigned char tid){
task_sp[tid] = task_stack[tid] + 1;
task_stack[tid][0] = (unsigned int)fn & 0xff;
task_stack[tid][1] = (unsigned int)fn >> 8;
}
#define os_start(tid) {task_id = tid,SP = task_sp[tid];return;}
static unsigned char i;
while(1){
i++;
task_switch();//编译后在这里打上断点
}
}
static unsigned char j;
while(1){
j+=2;
task_switch();//编译后在这里打上断点
}
}
//这里装载了两个任务,因此在定义MAX_TASKS时也必须定义为2
task_load(task1, 0);//将task1函数装入0号槽
task_load(task2, 1);//将task2函数装入1号槽
os_start(0);
}
*/
//=======================================================================
单片机C51多任务代 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)