为什么不用纯c语言写系统,我写的操作系统(纯C语言)

/****************************************************************************

** 程序名称: 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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值