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.

[参考译文] AM2432:bsp_global_mutex_lock 不工作

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1583510/am2432-bsp_global_mutex_lock-not-working

器件型号: AM2432

你(们)好

我们最近在使用 EtherCAT 产品时遇到了一些问题。 当意识到它们可能是由某些变量的竞态条件引起时,我们测试了中断是否在保护的关键部分中被真正禁用bsp_global_mutex_lock

我们在中保护了一个部分sync0taskEcatisr、使其不会被触发、但发现它未被阻止。

image.png

浏览代码后、我发现中断号如下:

image.png 

在内部bsp_global_mutex_lock、中断号缺少 20 减法:

image.png

当 I 从中断号中减去 20 时、中断确实被阻止。

期待您的想法、

Sahar

 

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

    尊敬的 Sahar:

    感谢您指出这种不匹配。 这看起来像是一个错误。 我将查看此内容并返回给您。

    此致、
    Aaron

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

    尊敬的 Sahar:

    我创建了一个高优先级 JIRA 票证、以跟踪即将发布的工业通信 SDK 的修复。 对于互斥锁和互斥锁 API、必须将中断号除以 20。 以下是修复后的实现:

    void bsp_global_mutex_lock(void)
    {
        //escGlobalIArg = GateAll_enter (escGlobalGateHandle);
        //Disable PDI and SYNC0 ISR at ARM INTC (rather than global IRQ disable)
        HwiP_disableInt(HOST_AL_EVENT + g_bsp_params.interrupt_offset - 20);
        HwiP_disableInt(HOST_SYNC0_EVENT + g_bsp_params.interrupt_offset - 20);
        HwiP_disableInt(HOST_SYNC1_EVENT + g_bsp_params.interrupt_offset - 20);
    }
    
    void bsp_global_mutex_unlock(void)
    {
        //GateAll_leave (escGlobalGateHandle, escGlobalIArg);
        //Enable back PDI and SYNC0 ISR at ARM INTC
        HwiP_enableInt(HOST_AL_EVENT + g_bsp_params.interrupt_offset - 20);
        HwiP_enableInt(HOST_SYNC0_EVENT + g_bsp_params.interrupt_offset - 20);
        HwiP_enableInt(HOST_SYNC1_EVENT + g_bsp_params.interrupt_offset - 20);
    }

    只是为了了解环境、您正在使用哪个 EtherCAT 主设备?  

    此致、
    Aaron

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

    嗨、Aaron

    感谢您的快速响应。

    如果您指的是我们使用的控制器、那么当我们使用 Omron NX701-1700 时、会出现问题。
    我们看到这个特定控制器出现问题的原因是它发送的 PDI 非常接近 Sync0 中断、这导致有时在执行 Sync0task 时 PDI 中断到达。

    我实际上还有一个问题:

    根据我的理解、不嵌套中断启用/禁用请求、这会产生一种情况、一个任务禁用中断、在完成关键部分之前、可以执行另一个任务并再次启用中断。
    我实现了一个包装器来监测请求、并在所有禁用请求都 有相应的启用请求之前不启用中断。 我希望听到您对此的想法。 你认为这是必要的吗?

    此外、我们是否可以对修复程序进行影响分析?

    感谢您的支持、
    Sahar

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

    尊敬的 Sahar:

    我实现了一个包装程序来监视请求、并且在所有禁用请求都 有相应的启用请求之前不会启用中断。 我希望听到您对此的想法。 您认为这是必要的吗?

    感谢您指出关注的问题。 我将在内部讨论此问题、并返回给您。

    此外、我们能否对修复程序进行影响分析?

    我们已在 EtherCAT 一致性测试工具中运行 CTT 和 ESC 测试套件、从而确保实现正确。

    此致、
    Aaron