/**************************************************************************** ** 程序名称: syrOS v0.1 ** 功能描述: 我写的一个操作系统框架,目前支持简易优先级调度。 ** 程序作者: 宋元瑞 ** 修改日期: 2010年10月 ****************************************************************************/ #include <stdio.h> #include <windows.h> #include <setjmp.h> #define OSINIT OS_INIT(); #define OSSTART OS_START(); #define TASKBEGIN(prio) Dly(prio,0);if(OS_start==0)this_place=setjmp(Task_Num[prio].task_buf[0]); #define TASKEND(prio) task_end(prio); #define DLY(prio,task_part) Dly(prio,task_part);if(OS_start==0)this_place=setjmp(Task_Num[prio].task_buf[task_part]); struct { int build; //标记Task_Num[]是否与task函数建立了联系 int prio; //本任务的优先级(任务序号) int run_times; //本task已经运行了几次 int run_part_now; //现在本任务运行在第几块 int max_parts; //每个task最多分成几块 jmp_buf task_buf[10]; //每个任务分配最多断点 void(*pTask)(void); //指向task函数 }Task_Num[64]; struct state { int task_run_now;//现在正在执行的任务(优先级) }State_Now; int OS_start=0; //标记OS是否启动 int this_place=0; //设置跳点时接收setjmp()返回值的变量 jmp_buf next_task; void get_next_task(jmp_buf next_task) { int i=0,k=0; printf("NEXT "); for(k=0;k<64;k++) { if(Task_Num[k].build == 0) {break;} if(Task_Num[k].run_times == 5) { Task_Num[k].run_times = 0; if(Task_Num[k+1].build ==1) //如果下一个任务存在,就执行下一个任务;否则返回执行第一个任务 { for(i=0;i<16;i++) //获得下一个task的task_buf {//printf("here(%d %d ) /n",k+1,(Task_Num[k+1].run_part_now+1)%Task_Num[k+1].max_parts); next_task=Task_Num[k+1].task_buf[(Task_Num[k+1].run_part_now+1)%Task_Num[k+1].max_parts]; } Task_Num[k+1].run_times++; return; //终止函数 } } } for(i=0;i<16;i++) //如果没有run_times==5的任务 或 上面的任务是最后一个,就获得task[0]的task_buf {//printf("here(0 %d ) /n",(Task_Num[0].run_part_now+1)%Task_Num[0].max_parts); next_task=Task_Num[0].task_buf[(Task_Num[0].run_part_now+1)%Task_Num[0].max_parts]; } Task_Num[0].run_times++; printf("time /n"); } //if(OS_start == 0)this_place=setjmp(Task_Num[prio].task_buf[task_part]); void Dly(int prio,int task_part) {//printf("*%d* ",Task_Num[prio].run_times); //printf("%d^ ",this_place); State_Now.task_run_now=prio; Task_Num[prio].run_part_now=task_part; if(OS_start == 0) //如果是初次设置跳点(一次设置,终身有效) {printf("X "); Task_Num[prio].max_parts++; return; } else //if(Task_Num[prio].run_part_now != 0) //如果上面是返回跳点,并且不是在task函数开头。 {printf("Y "); get_next_task(next_task); //获得要跳入的跳点 if(OS_start == 1) //跳入下一个要执行的跳点(本句可以去掉) {printf("start%d ",OS_start); longjmp(next_task,1); } } } void OS_INIT() { int i,j,k; //下面是全局变量的初始化 OS_start=0; this_place=0; for(i=0;i<16;i++) { next_task=0; } State_Now.task_run_now=0; //下面是结构体Task_Num内容的初始化 for(i=0;i<64;i++) { Task_Num.build=0; Task_Num.prio=i; Task_Num.run_times=0; Task_Num.run_part_now=0; Task_Num.max_parts=0; for(j=0;j<10;j++) { for(k=0;k<16;k++) {Task_Num.task_buf[j][k]=0;} } Task_Num.pTask=NULL; } } void OS_START() { int i=0; for(i=0;i<64;i++) //将每个task函数都执行一遍,目的是设置跳点 { if(Task_Num.build == 1) { Task_Num.pTask(); //执行task函数 } else { break; } } OS_start=1; longjmp(Task_Num[0].task_buf[0],1); //Task_Num[0].pTask(); //启动各任务并行执行,各个task犹Dly()来调度执行 } void task_end(int this_task_prio) { Task_Num[this_task_prio].run_part_now=0; if(OS_start==1) {longjmp(Task_Num[this_task_prio].task_buf[0],1);}//返回本task的头部 } void Task_Creat(void(*pFun)(void),int priority,int max_parts) { int i=0; Task_Num[priority].build=1; Task_Num[priority].prio=priority; //没必要,OS_INIT已设置,可以删除 Task_Num[priority].run_times=0; //没必要,OS_INIT已设置,可以删除 Task_Num[priority].run_part_now=0; //没必要,OS_INIT已设置,可以删除 Task_Num[priority].max_parts=0; //没必要,OS_INIT已设置,可以删除 for(i=0;i<16;i++) //没必要,OS_INIT已设置,可以删除 {Task_Num[priority].task_buf[priority]=0;} Task_Num[priority].pTask=pFun; } void task0(void) { TASKBEGIN(0) printf("0_0------------------------- "); DLY(0,1); printf("0_1 +++++++++++++++++++++++++"); DLY(0,2); printf("0_2 "); Sleep(1000); TASKEND(0) } void task1(void) { TASKBEGIN(1) printf("/n1_0 ********************** "); DLY(1,1); printf("1_1 "); DLY(1,2); printf("1_2 "); Sleep(1000); TASKEND(1) } int main(int argc, char *argv[]) { OSINIT Task_Creat(task0,0,3); Task_Creat(task1,1,3); OSSTART return 0; }