setjmp构建简单协作式多任务系统
if(!creat){
creat_tsk(tskfunc1,9,NULL,400);
creat=1;
}
i=0;
while(1){
WAITFOR(cnt>argc);
test=0x55;
/*使用函数调用在子程序中测试WAITFOR*/
subfunc();
>
while(i++<cnt)test=i^0xAA;
}
}
void tskfunc2(int argc,void *argv){
while(1){
WAITFOR(++cnt>15);
cnt=0;
}
}
void subfunc(void){
int i;
WAITFOR(cnt<5);
for(i=0;i<++)test=0x10*i;
}
2 内核构成
内核包括一个供外部用户程序包含的头文件(co-os.h)和具体实现的源文件(co-os.c),它们提供了演示程序中用到的3个系统调用。
内核的实现代码假定了CPU堆栈是向下增长的,并且通过宏来直接操作堆栈指针。以下代码在Microsoft VC6 for x86、Borland C++ Builder 5.5、SDS CrossCode7.0 for 68K和GCC3.2 for AVR四种平台中测试过,只需在co-os.h头文件中定义相应的平台类型即可顺利编译。
(1)co-os.h文件清单
#include<setjmp.h>
/*选择X86_VC6,X86_BC5,AVR_GCC或M68H_SDS.*/
#define X86_VC6
#define MAX_TSK 10
typedef struct {
void (*entry)(int argc,void *argv);
jmp_buf env;
int argc;
void *argv;
}TVB;
extern TCB tcb[MAX_TSK];
extern int task_num,tskid;
《setjmp构建简单协作式多任务系统(第2页)》