mainloop函数


原文地址:http://blog.csdn.net/huangxianxinalice/article/details/9363359
[cpp]  view plain  copy
  1. void MainLoop(void)  
  2. {  
  3.         /* 当运行在FreeRun-Mode:  bEscIntEnabled = FALSE, bDcSyncActive = FALSE 
  4.            当运行在Synchron-Mode: bEscIntEnabled = TRUE, bDcSyncActive = FALSE 
  5.            当运行在DC-Mode:       bEscIntEnabled = FALSE, bDcSyncActive = TRUE */  
  6.         if ( (!bEscIntEnabled || !bEcatFirstOutputsReceived)     /* SM同步方式,但是没有SM事件接收 */  
  7. #if DC_SUPPORTED  
  8.           && !bDcSyncActive                                               /* DC同步方式 */  
  9. #endif  
  10.             )  
  11.         {  
  12.             /* 如果应用程序是运行在ECAT同步模式当中,函数ECAT_Application将会在ESC中断里面被调用(在mcihw.c和spihw.c) 在ECAT同步模式当中,它可以被另外得检查,如果SM事件被接受至少一次(bEcatFirstOutputReceived=1),否则,没有中断会产生和函数ECAT_Application将会在这里被调用(中断禁止,因为当执行ECAT_Application的时候,SM事件可以产生)*/  
  13.             if ( !bEscIntEnabled )  
  14.             {  
  15.                 /* 应用程序正在运行在ECAT 自由运行模式,首先,我们需要检查是否有输出被接受 */  
  16.                 UINT16 ALEvent = HW_GetALEventRegister();  
  17.                 ALEvent = SWAPWORD(ALEvent);  
  18.   
  19.                 if ( ALEvent & PROCESS_OUTPUT_EVENT )  
  20.                 {  
  21.                     /* 设置标志位给状态机处理 */  
  22.                     bEcatFirstOutputsReceived = TRUE;  
  23. #if !ESC_SM_WD_SUPPORTED  
  24.                     /* 重置看门狗计数器 */  
  25.                     EcatWdCounter = 0;  
  26. #endif  
  27.                     if ( bEcatOutputUpdateRunning )  
  28.                     {  
  29.                         /* 更新输出的状态量 */  
  30.                         PDO_OutputMapping();  
  31.                     }  
  32.                 }  
  33.                 else if ( nPdOutputSize == 0 )  
  34.                 {  
  35.                     /* 如果没有输出被传输,当有输入被读,看门狗需要被重置 */  
  36.                     if ( ALEvent & PROCESS_INPUT_EVENT )  
  37.                     {  
  38.                         /* 输出被更新,设置标志位给看门狗检测 */  
  39.                         bEcatFirstOutputsReceived = TRUE;  
  40. #if !ESC_SM_WD_SUPPORTED  
  41.                         /* 重置看门狗的计数器 */  
  42.                         EcatWdCounter = 0;  
  43. #endif  
  44.                     }  
  45.                 }  
  46.             }  
  47.   
  48. #if AL_EVENT_ENABLED  
  49.             DISABLE_ESC_INT();  
  50. #endif  
  51.             ECAT_Application();  
  52. #if AL_EVENT_ENABLED  
  53.             ENABLE_ESC_INT();  
  54. #endif  
  55.         }  
  56.   
  57. #if !ECAT_TIMER_INT  
  58.         /* 这里没有中断服务程序来处理硬件定时器,所以,检查定时器的寄存器看是否想要的周期已经过了*/  
  59.         {  
  60.             UINT32 CurTimer = HW_GetTimer();  
  61.   
  62.             if(CurTimer>= ECAT_TIMER_INC_P_MS)  
  63.             {  
  64.                 ECAT_CheckTimer();  
  65.   
  66.                 HW_ClearTimer();  
  67.             }  
  68.         }  
  69. #endif  
  70.   
  71.         /* 调用EtherCAT函数 */  
  72.         ECAT_Main();  
  73.   
  74. #if COE_SUPPORTED  
  75.         /* 调用低优先级的应用程序部分 */  
  76.         COE_Main();  
  77. #endif  
  78.         CheckIfEcatError();  
  79.   
  80. #if CiA402_DEVICE  
  81.     if(bEcatInputUpdateRunning)  
  82.     {  
  83.         CiA402_StateMachine();//调用CIA402的处理机,来处理COE,这里没有用到  
  84.     }  
  85. #endif  
  86. }  


[cpp]  view plain  copy
  1. void PDO_OutputMapping()  
  2. {  
  3.   
  4.     HW_EscReadIsr(((MEM_ADDR *)aPdOutputData), nEscAddrOutputData, nPdOutputSize );  
  5.   
  6.     APPL_OutputMapping((UINT16*) aPdOutputData);  
  7. }  

[cpp]  view plain  copy
  1. /  
  2. /** 
  3. \param      指针指向输出处理数据 
  4.  
  5. \brief    这个函数将拷贝输出从ESC内存到本地内存到硬件 
  6. *////  
  7. void APPL_OutputMapping(Uint16* pData)  
  8. {  
  9.     Uint16 j = 0;  
  10.     Uint8 *pTmpData = (Uint8 *)pData;// 允许数据处理  
  11.   
  12.     for (j = 0; j < sRxPDOassign.u16SubIndex0; j++)  
  13.     {  
  14.         switch (sRxPDOassign.aEntries[j])  
  15.         {  
  16.         /* RxPDO 2 */  
  17.         case 0x1601:  
  18.             sDOOutputs.LEDs = *pTmpData++;  
  19.             break;  
  20.         case 0x1602:  
  21.             sDO1Outputs.Count = *pTmpData++;  
  22.             sDO1Outputs.Cmd   = *pTmpData++;  
  23.             sDO1Outputs.MotorData = *pTmpData++;  
  24.             sDO1Outputs.MotorData |= (*pTmpData++ << 8);  
  25.             break;  
  26.         }  
  27.     }  
  28. }  


[cpp]  view plain  copy
  1. void ECAT_Application(void)  
  2. {  
  3. #if CiA402_DEVICE  
  4.     /*轴的配置被写,在状态转换从PREOP到SAFEOP=>触发CiA402应用程序,如果设备是在SAFEOP或者OP状态 
  5.     (电机控制器的函数只有被触发,如果DC同步被激活和有效的运行模式被设置)*/  
  6.     if(bEcatInputUpdateRunning)  
  7. #endif  
  8.     {  
  9.         APPL_Application();  
  10.     }  
  11.   
  12.     if ( bEcatInputUpdateRunning )  
  13.     {  
  14.         /* EtherCAT 从站是至少在SAFE-OPERATIONAL,更新输入 */  
  15.         PDO_InputMapping();  
  16.     }  
  17.   
  18. }  

[cpp]  view plain  copy
  1. /  
  2. /** 
  3. \brief    这个函数将被调用从同步的中断程序或者从mainloop当中,如果没有同步被支持 
  4. *////  
  5. void APPL_Application(void)  
  6. {  
  7.     Uint8 LED; <span style="white-space:pre">                   </span>// 初始化测试数据  
  8.     static Uint8 prevState = 55;  
  9.       
  10.     LED = sDOOutputs.LEDs;  
  11.       
  12.     if(LED != prevState)  
  13.         set_led(LED);<span style="white-space:pre">             </span>//调用底层程序设置LED  
  14.     prevState = LED;  
  15.     appState = sDO1Outputs.Cmd;<span style="white-space:pre">           </span>// 设置应用程序的状态  
  16.       
  17.     sDIInputs.switchs = (Uint8)Read_HVS2();  
  18.     if(appState == 0)  
  19.         appState = sDIInputs.switchs;//special mode to control app state by input switchs!  
  20.     sAI1Inputs.info1 = 0x12345678;  
  21.     sAI1Inputs.info2 = bsp_read_word(0x10);  
  22.   
  23. }  

[cpp]  view plain  copy
  1. void PDO_InputMapping()  
  2. {  
  3.     APPL_InputMapping((UINT16*)aPdInputData);  
  4.     HW_EscWriteIsr(((MEM_ADDR *) aPdInputData), nEscAddrInputData, nPdInputSize );  
  5. }  

[cpp]  view plain  copy
  1. /  
  2. /** 
  3. \param      pData 指针指向输入过程数据 
  4. \brief      这个函数将会拷贝从本地内存到ESC内存到硬件 
  5. *////  
  6. void APPL_InputMapping(Uint16* pData)  
  7. {  
  8.     Uint16 j = 0;  
  9.     Uint8 *pTmpData = (Uint8 *)pData;  
  10.   
  11.   
  12.    for (j = 0; j < sTxPDOassign.u16SubIndex0; j++)  
  13.    {  
  14.       switch (sTxPDOassign.aEntries[j])  
  15.       {  
  16.       /* TxPDO 1 */  
  17.       case 0x1A00:  
  18.          *pTmpData++ = sDIInputs.switchs;  
  19.          break;  
  20.   
  21.       case 0x1A03: // 注意:可能是不对称的字节接近.  
  22.          *pTmpData++ = sAI1Inputs.info1 & 0xFF;  
  23.          *pTmpData++ = (sAI1Inputs.info1 & 0xFF00) >> 8;  
  24.          *pTmpData++ = (sAI1Inputs.info1 & 0xFF0000) >> 16;  
  25.          *pTmpData++ = (sAI1Inputs.info1 & 0xFF000000) >> 24;  
  26.          *pTmpData++ = sAI1Inputs.info2 & 0xFF;  
  27.          *pTmpData++ = (sAI1Inputs.info2 & 0xFF00) >> 8;  
  28.          break;  
  29.       }  
  30.    }  
  31. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值