2010年5月12日 星期三

幾種副程式的用法

因為有了Source Insight 的幫助,在看程式真的是快、狠、準


不過如果遇到不會的,還是無濟無事


最近在學USB,還沒學懂但已經賺到C語言的用法了


其中一個是我以前比較少用的方式,指標式的副程式(Master大大回應的很詳細)


USB裡面有幾個有趣的寫法,為了了解其運作,自己練習一般


#define  EP1_OUT_Callback   Process1
#define  EP2_OUT_Callback   Process2
#define  EP3_OUT_Callback   Process3
#define  EP4_OUT_Callback   Process4
#define  EP5_OUT_Callback   Process5
#define  EP6_OUT_Callback   Process6
#define  EP7_OUT_Callback   Process7



int k1;
void Process1(void)
{
 k1=1;
}
void Process2(void)
{
 k1=2;
}
void Process3(void)
{
 k1=3;
}
void Process4(void)
{
 k1=4;
}
void Process5(void)
{
 k1=5;
}
void Process6(void)
{
 k1=6;
}
void Process7(void)
{
 k1=7;
}


void (*pEpInt_OUT[7])(void) =
  {
    EP1_OUT_Callback,
    EP2_OUT_Callback,
    EP3_OUT_Callback,
    EP4_OUT_Callback,
    EP5_OUT_Callback,
    EP6_OUT_Callback,
    EP7_OUT_Callback,
  };



typedef struct _Task{
  void (*TASK1)(void);    
  void (*TASK2)(void);  
  void (*TASK3)(void);  
  void (*TASK4)(void);  
  void (*TASK5)(void);  
  void (*TASK6)(void);  
  void (*TASK7)(void);  
}Task;


Task ak =
  {
Process1,
Process2,
Process3,
Process4,
Process5,
Process6,
Process7
};



int EPindex=0;
Task *ak1 ;


int main(void){



/*
 while(1){
  if (EPindex>6)EPindex=0;
  (*pEpInt_OUT[EPindex])();
  EPindex++;

 }
*/


/*
 while(1){
  Process1( );
  Process2( );
  Process3( );
  Process4( );
  Process5( );
  Process6( );
  Process7( );

 }
*/


/*
 while(1){
  ak.TASK1( );
  ak.TASK2( );
  ak.TASK3( );
  ak.TASK4( );
  ak.TASK5( );
  ak.TASK6( );
  ak.TASK7( );


 }
*/
 ak1=&ak;
 while(1){
  ak1->TASK1( );
  ak1->TASK2( );
  ak1->TASK3( );
  ak1->TASK4( );
  ak1->TASK5( );
  ak1->TASK6( );
  ak1->TASK7( );

 }


}


 


上面有四種不同副程式的寫法,有興趣的人可以自行compiler,有問題可以請教Bee大大,應該會得到更滿意的答案。



 


沒有留言:

張貼留言