关闭

单功能非线性流水线的最优调度的c语言实现

1888人阅读 评论(6) 收藏 举报

这是晚上图书馆回来时花的一些时间写的,代码的可读性和效率实在差,但是绝对保证正确性。呵呵!如果你能看懂我的代码那么你一定阅读代码的顶级高手了啊 !呵呵!

 

 

 

 

下面是c代码:

     
 
//你只要关注 FUCSEG,CYCTIM ,TimeSpaceDram
//把他们初始化就好了啊! 
#include<stdio.h>
#include <conio.h> 
#include <stdlib.h> 
#define FUCSEG 5//这是你要关注的地方这是预约表中的 功能段 
#define CYCTIM 9//这是你要关注的地方这是预约表中的 时间 
#define STATESIZE 50
#define STACKSIZE 44
void dispather(int);
int  pushconflict(int *stack,int *p,int c);
int pop(int *stack,int *p);
int empty(int *stack,int *p);
void push(int *stack,int*p,int elem) ;
int  pushconflict1(int *stack,int *p,int c);
void stategy(int c1,int c2,int c0);
int main()
{
 int temp0=0;
 int c0=0;
 int temp1=1;
 /*下面是你可以初始化的预约表啊!呵呵*/ 
 int TimeSpaceDram[FUCSEG][CYCTIM]={{1,0,0,0,0,0,0,0,1},
                                    {0,1,1,0,0,0,0,1,0},
                                    {0,0,0,1,0,0,0,0,0},
                                    {0,0,0,0,1,1,0,0,0},
                                    {0,0,0,0,0,0,1,1,0}};//矩阵的时空图,

printf("\n下面是预约表\n") ;                                 
for(int ye=0;ye<FUCSEG;ye++){
        printf("\n");
 for(int wu=0;wu<CYCTIM;wu++)
 printf("  %d  ",TimeSpaceDram[ye][wu]);}
 printf("\n");
 ///
 int Conflict[CYCTIM]={0};
 
 // matrix initionalization
 for(int i=0;i<FUCSEG;i++){
         temp0=0;
         int Assitance[CYCTIM]={0};
         for(int j=0;j<CYCTIM;j++){
                 if(TimeSpaceDram[i][j]!=0){
                             Assitance[temp0]=j;
                             temp0++;           
                            }                                            
                 }
         for(int k=temp0-1;k>0;k--)
                 for(int m=0;m<k;m++)
                         Conflict[Assitance[k]-Assitance[m]]=1;       
         }
 for(int ii=1;ii<CYCTIM;ii++){
         c0+=Conflict[ii]*temp1;
         temp1*=2;
         }
  dispather(c0);
 getchar();       
 return 0;    
}
void dispather(int c0)
{
     
 int statecurse=1;
 int statec=0;
 int definestate=c0;
 int stack[STACKSIZE]={0};
 int curse=0;
 int dispath[34]={0};
 int dispathcurse=0; 
 int ccc=0;//位数c0相同的值为全一的 
 int state[STATESIZE]={0};//这个是用来保存状态的 
 for(int ppp=1;definestate>0;definestate/=2,ppp*=2)//计算值为全1的数 
           ccc+=ppp;

statec=pushconflict(stack,&curse,c0);
   state[0]=c0;
   state[statecurse]=statec+2;
   printf("\n下面是调度策略\n");
   printf("格式:冲突向量--->(时间(若有两个则表示或的关系即你可以任选一个继续))--->冲突向量\n");
   printf("下面的每一行都是一个调度策略,即是状态转移示意图中的一个闭合回路\n");
while((empty(stack,&curse))!=0)
{
int j=0;
int ci=0;
int discard;
int operat=pop(stack,&curse);
j=pop(stack,&curse);
ci=(operat>>j)|c0;
if(ci==ccc)
 ;      
else
{ if(ci==c0)
{
  char   s[10]; 
  
   for(int j=0;state[j]>0;j+=2)
 {  
        itoa(state[j],   s,   2);       //转换成字符串,进制基数为2 
        printf( "%s--->(",s);     //输出 
        if(state[j+2]!=0)
       stategy(state[j],state[j+2],c0);
       else
       stategy(state[j],c0,c0);
        }
        itoa(state[0],   s,   2);       //转换成字符串,进制基数为2 
        printf( "%s    \n",s);     //输出  
      
}
else
{ 
for(int j=0;j<STATESIZE;j+=2)
  {
        if(ci==state[j])
        goto YE;
        }
statec=pushconflict(stack,&curse,ci); 
   state[statecurse+1]=ci;
   state[statecurse+2]=statec; 
   statecurse+=2;
 YE:
           ;                      
}
}
WU:
if(--(state[statecurse])<0)
{
state[statecurse]=0;
state[statecurse-1]=0;
statecurse-=2;
 state[statecurse]--;
 if(state[statecurse]<0)
 goto WU;                     
}
}

}
     
 void push(int *stack,int*p,int elem)
{
 stack[*p]=elem;
 (*p)++;    
}
int pop(int *stack,int *p)
{
int temp;
(*p)--;
temp=stack[*p];
 stack[*p]=0;
 return temp;   
}
int empty(int *stack,int *p)
{
if( *p==0)
return 0;
return 1;  
}
int  pushconflict(int *stack,int *p,int c)
{
 int t=1;
 int pp=0;
 int kk=c;
 while(c>0)
  {
  if(c%2==0)
  {
   push(stack,p,t);
   push(stack,p,kk); 
pp++;
}
  t++;
  c/=2;            
  } 
  return pp;
}    
int  pushconflict1(int *stack,int *p,int c)
{
 int t=1;
 int pp=0;
 while(c>0)
  {
  if(c%2==0)
  {
   push(stack,p,t); 
pp++;
}
  t++;
  c/=2;            
  } 
  return pp;
}  
void stategy(int c1,int c2,int c0)
{
int stack[CYCTIM]={0};
int curse=0;
int operat=0;
int j=0;
int t= pushconflict1(stack,&curse,c1);
 for(;t>0;t--)
 { 
   j=pop(stack,&curse);
   //printf("j=%d",j);
   operat=c1;
   if( c2==((operat>>j)|c0))
        printf("%d,",j);            
              }
              printf(")--->");
     
}     
     
     
     
     
     
     
     
     



 

 

 

呵呵!你只要更改以上提示的地方就可以了啊!

我们再举一个例子

 


   
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:374375次
    • 积分:5545
    • 等级:
    • 排名:第5120名
    • 原创:145篇
    • 转载:45篇
    • 译文:0篇
    • 评论:184条
    赞助

    如果您觉得此博客对您有用,欢迎对我进行小额赞助。




    不筹钱娶媳妇的程序员不是好程序员!


    最新评论