This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM2434:EtherCAT 子器件缓冲区处理 API 在09.01版本中不起作用

Guru**** 2415590 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1333593/am2434-ethercat-subdevice-buffer-handling-api-not-functional-with-09-01-version

器件型号:AM2434

你(们)好!

我曾尝试从09.00.00.03切换到工业通信 SDK 版本09.01.00.41、很遗憾、 我使用的缓冲区处理 API 已不再起作用。 我使用 ethercat_slave_simple_demo_am243x-evm_r5fss0-0_freertos_ti-arm-clang 示例、并且我只需添加以下行

1) 1)在 EC_API_SLV_cbRegisterUserApplicationRun 之后

  /*缓冲区回调*/
  ec_api_slv_cbRegisterPreSeqInputPDBuffer (pAppInstance_p->ptEcSlvApi、pAppInstance_p->ptEcSlvApiacquirBuffer);
  ec_api_slv_cbRegisterPostSeqInputPDBuffer (pAppInstance_p->ptEcSlvApi、pAppInstance_p->ptEcSlvApireleaseBuffer);

2)两个简单的回调、只是将一个缓冲区传递到堆栈

静态 uint8_t data[1024]=0};
静态 void * acquireBuffer (void* pContext_puint32_t length_p)
{
  返回&data[0]

静态 void releaseBuffer (void* pContext_p、void* pData_p、uint32_t length_p)
{
//只是一个测试没有什么可做的

一旦 EtherCAT 堆栈应进入运行状态(由 TwinCAT 主站触发)、整个内核就会崩溃并卡在数据中止处理程序中。 缓冲区函数中也有断点、但它们还没有被调用

PS:EtherCAT 从站堆栈的文档也丢失了、单击此处的"API 文档"将无处可去: software-dl.ti.com/.../EXAMPLES_INDUSTRIAL_COMMS_ETHERCAT_SLAVE_DEMOS.html

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dominic:感谢您提请我们注意文档链接问题、我将提交 JIRA 来解决。

    同时、您可以从 MCU-SDK 文档访问 EtherCAT 从站 API 文档。 例如 :C:/ti/ind_comms_sdk_am243x_09_00_00_03/docs/am243x/ethercat_slave/modules.html  

    从文档中、我没有看到从9.0到9.1对上述 API 进行了任何更改。

    您添加回调函数的问题吗? 如果您能给我发送一个补丁、在9.1的基础上使用、那就太棒了。

    另一方面、只需确认在9.1 w/o 上述修改后、 ethercat_slave_simple_demo_am243x-evm_r5fss0-0_freertos_ti-arm-clang 工作正常、对吗?

    谢谢!

    保拉

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Paula、

    "对不起,我也没想到会被你撞见的。"

    如果没有这些更改、示例就可以正常工作、这是正确的。

    下面是一个补丁、其中包含对示例所做的更改。

    diff --git a/ecSlvSimple.c b/ecSlvSimple.c
    index 7670305..7339d74 100644
    --- a/ecSlvSimple.c
    +++ b/ecSlvSimple.c
    @@ -2930,6 +2930,17 @@ static bool EC_SLV_APP_EoE_SS_receiveHandler(void* pContext_p, uint16_t* pData_p
         return true;
     }
    
    +static uint8_t data[1024]={0};
    +
    +static void*acquireBuffer(void* pContext_p, uint32_t length_p)
    +{
    +    return &data[0];
    +}
    +
    +static void releaseBuffer(void* pContext_p, void* pData_p, uint32_t length_p)
    +{
    +}
    +
     /*!
      *  <!-- Description: -->
      *
    @@ -3088,16 +3099,22 @@ void EC_SLV_APP_SS_applicationInit(EC_SLV_APP_SS_Application_t *pAppInstance_p)
         EC_API_SLV_DIAG_enable(pAppInstance_p->ptEcSlvApi);
    
     #if !(defined DPRAM_REMOTE) && !(defined FBTL_REMOTE) && !(defined OSAL_FREERTOS_JACINTO) /* first omit flash */
    -    EC_API_SLV_cbRegisterFlashInit              (pAppInstance_p->ptEcSlvApi, EC_SLV_APP_EEP_initFlash, pAppInstance_p->ptEcSlvApi);
    +    // currently not supported for our custom board
    +
    +    // EC_API_SLV_cbRegisterFlashInit              (pAppInstance_p->ptEcSlvApi, EC_SLV_APP_EEP_initFlash, pAppInstance_p->ptEcSlvApi);
         /* @cppcheck_justify{misra-c2012-11.6} void cast required for signature */
         /* cppcheck-suppress misra-c2012-11.6 */
    -    EC_API_SLV_EEPROM_cbRegisterWrite           (pAppInstance_p->ptEcSlvApi,   EC_SLV_APP_EEP_writeEeprom, OSPIFLASH_APP_STARTMAGIC);
    +    // EC_API_SLV_EEPROM_cbRegisterWrite           (pAppInstance_p->ptEcSlvApi,   EC_SLV_APP_EEP_writeEeprom, OSPIFLASH_APP_STARTMAGIC);
         /* @cppcheck_justify{misra-c2012-11.6} void cast required for signature */
         /* cppcheck-suppress misra-c2012-11.6 */
    -    EC_API_SLV_EEPROM_cbRegisterLoad            (pAppInstance_p->ptEcSlvApi,   EC_SLV_APP_EEP_loadEeprom, OSPIFLASH_APP_STARTMAGIC);
    +    // EC_API_SLV_EEPROM_cbRegisterLoad            (pAppInstance_p->ptEcSlvApi,   EC_SLV_APP_EEP_loadEeprom, OSPIFLASH_APP_STARTMAGIC);
     #endif
         EC_API_SLV_cbRegisterUserApplicationRun     (pAppInstance_p->ptEcSlvApi, EC_SLV_APP_SS_applicationRun, pAppInstance_p);
    
    +    /* buffer callbacks */
    +    EC_API_SLV_cbRegisterPreSeqInputPDBuffer(pAppInstance_p->ptEcSlvApi, pAppInstance_p->ptEcSlvApi, acquireBuffer);
    +    EC_API_SLV_cbRegisterPostSeqInputPDBuffer(pAppInstance_p->ptEcSlvApi, pAppInstance_p->ptEcSlvApi, releaseBuffer);
    +
         error = (EC_API_EError_t)EC_API_SLV_init(pAppInstance_p->ptEcSlvApi);
         if (error != EC_API_eERR_NONE)
         {
    @@ -3350,6 +3367,9 @@ static void EC_SLV_APP_SS_applicationRun(void* pAppCtxt_p)
                 }
    
     #if !(defined FBTL_REMOTE) || (0 == FBTL_REMOTE)
    +#if 0
    +            // I don't use this code, as processdata is updated via callbacks only
    +
                 err = (EC_API_EError_t)EC_API_SLV_PDO_setEntryData(pApplicationInstace->ptEcSlvApi
                         ,pApplicationInstace->ptTxPdo1A00
                         ,1
    @@ -3359,6 +3379,7 @@ static void EC_SLV_APP_SS_applicationRun(void* pAppCtxt_p)
                 {
                     OSAL_printf("Fill Description Object Error code: 0x%08x\r\n", err);
                 }
    +#endif
     #endif
             }
             else
    @@ -3394,6 +3415,9 @@ static void EC_SLV_APP_SS_applicationRun(void* pAppCtxt_p)
                         lastLed = (lastLed << 1u);
                     }
    
    +#if 0
    +                // I don't use this code, as processdata is updated via callbacks only
    +
                     //Write Led data to the process data. It can be seen in OBD in Object 0x2002:2 as well.
                     error = EC_API_SLV_PDO_setEntryData(
                             pApplicationInstace->ptEcSlvApi,
    @@ -3406,6 +3430,7 @@ static void EC_SLV_APP_SS_applicationRun(void* pAppCtxt_p)
                     {
                         OSAL_printf("%s:%d:E=0x%x\r\n", __func__, __LINE__, error);
                     }
    +#endif
                 }
             }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Dominic、谢谢、请允许我花一些时间(几天)准备好设置并复制。

    谢谢!

    保拉

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Dominic、在9.1中使用您的更改也对我无效(您提到的更改适用于9.0)。 然后我仔细检查了文档、发现:

    EtherCAT 从站:API 更改(TI.com)

    不知怎么的,我以前漏掉了这个,我的道歉。

    谢谢!

    保拉

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Paula、

    感谢您的帮助! 现在我看到了问题。 我不知道 API 的变化、但回调函数和上下文的位置已交换。 这是一个危险的变化

    我想知道编译器为什么没有注意到。 不过、我通过交换两个参数进行了快速测试。 现在我不再遇到任何硬故障、所以我认为问题已得到解决。 如果有其他问题、我将重新打开/或打开另一个问题。

    谢谢。

    多米尼克