/****************************************************************************
** 程序名称: syrOS v0.1
** 功能描述: 我写的一个操作系统框架,目前支持简易优先级调度。
** 程序作者: 宋元瑞
** 修改日期: 2010年10月
****************************************************************************/
#include
#include
#include
#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;
}