工具/软件:
你好
我正在使用 LP-AM243电路板评估 EtherCAT 从站堆栈
SDK 版本为 ind_comms_sdk_am243x_09_02_00_08
示例工程使用 EtherCAT 从属设备中的401_Simple。
我注册了用于注册处理数据缓冲区的回调函数、并参考"缓冲区处理 API"一章注册了用户应用回调函数。
InputPD 预读回调:appPreSeqInputPD ()
OutputPD 写前回调:appPreSeqOutputPD ()
加载回调后的 InputPD:appPostSeqInputPD ()
加载回调后的 OutputPD:appPostSeqOutputPD ()
用户应用程序回调: EC_SLV_APP_SS_applicationRun ()
我的问题是、如果我如上所述注册回调函数、那么回调函数的调用顺序是否得到如下保证?
1.帧接收
↓μ s
2. appPreSeqInputPD()
↓μ s
3. appPostSeqInputPD()
↓μ s
4. EC_SLV_APP_SS_applicationRun ()
↓μ s
5. appPreSeqOutputPD ()
↓μ s
6. appPostSeqOutputPD ()
当管理用于进程数据缓冲的标志时,我们担心如果调用回调的顺序与预期不同,例如在 EC_SLV_APP_SS_applicationRun ()之前调用 appPreSeqOutputPD (),则标志管理序列将被中断。
以下是回调函数注册过程的自定义源代码的摘录、供参考。
// InputPD pre-read callback function registration
error = EC_API_SLV_cbRegisterPreSeqInputPDBuffer(
pApplicationInstance_p->ptEcSlvApi,
(EC_API_SLV_CBPreSeqInputPD_t)appPreSeqInputPD,
pApplicationInstance_p
);
if (error != EC_API_eERR_NONE)
{
OSAL_printf("Register PreSeqInputPD Error code: 0x%08x\r\n", error);
/* @cppcheck_justify{misra-c2012-15.1} goto is used to assure single point of exit */
/* cppcheck-suppress misra-c2012-15.1 */
goto Exit;
}
OSAL_printf("Register PreSeqInputPD Callback\r\n");
// OutputPD pre-write callback function registration
error = EC_API_SLV_cbRegisterPreSeqOutputPDBuffer(
pApplicationInstance_p->ptEcSlvApi,
(EC_API_SLV_CBPreSeqOutputPD_t)appPreSeqOutputPD,
pApplicationInstance_p
);
if (error != EC_API_eERR_NONE)
{
OSAL_printf("Register PreSeqOutputPD Error code: 0x%08x\r\n", error);
/* @cppcheck_justify{misra-c2012-15.1} goto is used to assure single point of exit */
/* cppcheck-suppress misra-c2012-15.1 */
goto Exit;
}
OSAL_printf("Register PreSeqOutputPD Callback\r\n");
// InputPD Loading Callback Function Registration
error = EC_API_SLV_cbRegisterPostSeqInputPDBuffer(
pApplicationInstance_p->ptEcSlvApi,
(EC_API_SLV_CBPostSeqInputPD_t)appPostSeqInputPD,
pApplicationInstance_p
);
if (error != EC_API_eERR_NONE)
{
OSAL_printf("Register PostSeqInputPD Error code: 0x%08x\r\n", error);
/* @cppcheck_justify{misra-c2012-15.1} goto is used to assure single point of exit */
/* cppcheck-suppress misra-c2012-15.1 */
goto Exit;
}
OSAL_printf("Register PostSeqInputPD Callback\r\n");
// Register callback function after writing to OutputPD
error = EC_API_SLV_cbRegisterPostSeqOutputPDBuffer(
pApplicationInstance_p->ptEcSlvApi,
(EC_API_SLV_CBPostSeqOutputPD_t)appPostSeqOutputPD,
pApplicationInstance_p
);
if (error != EC_API_eERR_NONE)
{
OSAL_printf("Register PostSeqOutputPD Error code: 0x%08x\r\n", error);
/* @cppcheck_justify{misra-c2012-15.1} goto is used to assure single point of exit */
/* cppcheck-suppress misra-c2012-15.1 */
goto Exit;
}
// Register callback function User ApplicationRun
EC_API_SLV_cbRegisterUserApplicationRun(
pApplicationInstance_p->ptEcSlvApi,
EC_SLV_APP_SS_applicationRun,
pApplicationInstance_p
);
if (error != EC_API_eERR_NONE)
{
OSAL_printf("Register EC_SLV_APP_SS_applicationRun Error code: 0x%08x\r\n", error);
/* @cppcheck_justify{misra-c2012-15.1} goto is used to assure single point of exit */
/* cppcheck-suppress misra-c2012-15.1 */
goto Exit;
}