|
发表于 2008-12-10 16:10:52
|
显示全部楼层
to gamethink:
当task1内调用一个子程序sub1,而sub1内又调用了task_switch时
下面这句就不能删除了:
task_sp[task_id] = SP;
此时,sub1分享task1的task_id
我写了个小程序已经验证过了
#include <reg52.h>
#define MAX_TASKS 2 //任务槽个数.必须和实际任务数一至
#define MAX_TASK_DEP 12 //最大栈深.最低不得少于2个,保守值为12.
unsigned char task_id; //当前活动任务号
unsigned char task_sp[MAX_TASKS];
unsigned char idata task_stack[MAX_TASKS][MAX_TASK_DEP];//任务堆栈.
//任务切换函数(任务调度器)
void task_switch(){
task_sp[task_id] = SP;
if(++task_id == MAX_TASKS)
task_id = 0;
SP = task_sp[task_id];
}
//任务装入函数.将指定的函数(参数1)装入指定(参数2)的任务槽中.如果该槽中原来就有任务,则原任务丢失,但系统本身不会发生错误.
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;}
//////////////////////////////////////////////////////////////////////////
void sub1()
{
unsigned char a,b;
a++;
task_switch();
b++;
}
//////////////////////////////////////////////////////////////////////////
/*============================以下为测试代码============================*/
void task1(){
static unsigned char x,y,z;
while(1){
x++;
task_switch();//编译后在这里打上断点
y++;
sub1();
task_switch();//编译后在这里打上断点
z++;
task_switch();//编译后在这里打上断点
}
}
void task2(){
static unsigned char l,m,n;
while(1){
l+=2;
task_switch();//编译后在这里打上断点
m+=2;
task_switch();//编译后在这里打上断点
n+=2;
task_switch();//编译后在这里打上断点
}
}
void main(){
//这里装载了两个任务,因此在定义MAX_TASKS时也必须定义为2
task_load(task1, 0);//将task1函数装入0号槽
task_load(task2, 1);//将task2函数装入1号槽
os_start(0);
}
本贴被 kejian2000 编辑过,最后修改时间:2008-12-10,16:11:54. |
|