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:R5F 中的 Σ — Δ ISR 进入时刻抖动

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1608701/am2432-sigma-delta-isr-entrance-moment-jitter-in-r5f

器件型号: AM2432

尊敬的 TI 专家:

几个月前、我的同事问了这个问题、 AM2432:R5F 中的 Σ — Δ ISR 进入瞬间抖动 — 基于 Arm 的微控制器论坛 — 基于 Arm 的微控制器 — TI E2E 支持论坛 

我进一步研究了这个问题。 SDK 中似乎有代码会禁用中断。  

例如、在函数 bsp_send_command_to_firmware() 中、该函数由各种 EtherCAT 相关函数调用。

void bsp_send_command_to_firmware(PRUICSS_Handle pruIcssHandle,
                                  uint32_t command,
                                  uint16_t param1, uint16_t param2)
{
    volatile t_host_interface *pHost2PruIntfc = (volatile t_host_interface *)
            ((((PRUICSS_HwAttrs *)(pruIcssHandle->hwAttrs))->baseAddr) +
             PRUICSS_DATARAM(0));
    {
#ifdef ENABLE_PDI_TASK
        SemaphoreP_pend(&semcmdlow_object, SystemP_WAIT_FOREVER);
#else
        uintptr_t key1 = HwiP_disable();
#endif
        bsp_pruss_cmd_intfc_write_word(command, &pHost2PruIntfc->cmdlow);
        bsp_pruss_cmd_intfc_write_word(param1, &pHost2PruIntfc->param1low);
        bsp_pruss_cmd_intfc_write_word(param2, &pHost2PruIntfc->param2low);
#ifdef SUPPORT_CMDACK_POLL_MODE
        bsp_pruss_cmd_intfc_write_word(1, &pHost2PruIntfc->cmdlow_ack);
#endif
        PRUICSS_sendEvent((g_bsp_params.pruicss_handle), ARM_PRU_EVENT1);
        ASSERT_DMB();
        ASSERT_DSB();
        {
#ifdef SUPPORT_CMDACK_POLL_MODE
            volatile uint16_t ack;

            do
            {
                ack = bsp_pruss_cmd_intfc_read_word(&pHost2PruIntfc->cmdlow_ack);
            }
            while(ack);
#ifndef ENABLE_PDI_TASK
            HwiP_restore(key1);
#endif
#else
            uint32_t evtoutNum = HOST_CMD_LOW_ACK_EVENT - 20;
#ifndef ENABLE_PDI_TASK
            HwiP_restore(key1);
#endif
            PRUICSS_waitEvent((PRUICSS_Handle)(g_bsp_params.pruicss_handle), evtoutNum);
#endif
        }
        bsp_pruss_cmd_intfc_write_word(0xFF,    &pHost2PruIntfc->cmdlow);
#ifdef ENABLE_PDI_TASK
        SemaphoreP_post(&semcmdlow_object);
#endif
    }
}

当我使用 SDK 的 SDFM 3 通道示例时、ISR 的抖动会减少到 300ns。 因此、我认为抖动的原因是 4us。

我将尝试找到导致问题的所有代码段、正如我搜索 hwiP_disable 时、有很多匹配项、

HwiP_disable_matches.png

都使用 SPI 和 UART、这也可能是原因。

对于测试,我有下来的是,我首先注释出一些函数,频率是从改进

SD_4us_jitter.png

最终目的

SD_4us_jitter_somefunction.png

 

每次找到我们使用的代码段并禁用中断时、我都会更新线程。 并想知道是否有必要保留实施。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    例如、在函数 bsp_send_command_to_firmware() 中、该函数由各种 EtherCAT 相关函数调用。

    因此、对于 EtherCAT、我想将所有内容都迁移到 ECAT MAIN 区域、只在中断中进行 PDO 数据处理。 移除是否安全  

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

    您好、建宇:

    HwiP_disable 和 HwiP_restore 之间的部分被认为很关键、因为我们不想部分更新 PRUICSS 输入字段、并切换到不同的上下文、这会导致不良行为。

    为了更清楚地了解您的查询、禁用所有外设间隔是您的问题吗? 如果仅禁用 PDI 和 SYNC 中断而不禁用全局 IRQ、这是否没问题?

    我引用了以下可以替换 HwiP_disable 和 HwiP_restore 的 API:

    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 - PRUICSS_INTERRUPT_OFFSET_ADJUSTMENT);
        HwiP_disableInt(HOST_SYNC0_EVENT + g_bsp_params.interrupt_offset - PRUICSS_INTERRUPT_OFFSET_ADJUSTMENT);
        HwiP_disableInt(HOST_SYNC1_EVENT + g_bsp_params.interrupt_offset - PRUICSS_INTERRUPT_OFFSET_ADJUSTMENT);
    }
    
    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 - PRUICSS_INTERRUPT_OFFSET_ADJUSTMENT);
        HwiP_enableInt(HOST_SYNC0_EVENT + g_bsp_params.interrupt_offset - PRUICSS_INTERRUPT_OFFSET_ADJUSTMENT);
        HwiP_enableInt(HOST_SYNC1_EVENT + g_bsp_params.interrupt_offset - PRUICSS_INTERRUPT_OFFSET_ADJUSTMENT);
    } 

    此致、
    Aaron

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果只禁用 PDI 和同步中断而不禁用全局 IRQ、那是否没问题?

    好极了。 是的、我们的关键要求是 SD ISR 是稳定的、同时不影响其余功能。

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

    您好 Aaron、

    我想要澄清一下、 我需要将调用 HW_EscWriteIsr 和 HW_EscReadIsr 的 PDO 读取/写入移至 SD ISR 中。 这些函数是否也会干扰函数 bsp_send_command_to_firmware?

    谢谢。

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

    您好、建宇:

    如果 从 SD ISR 上下文调用 HW_EscWriteIsr () 或 HW_EscReadIsr ()、则 EtherCAT ISR(如 PDI ISR 或同步 ISR)可能会中断它、这可能会在访问 bsp_get_proce_data_address () 和 bsp_proce_data_access_complete () 中的共享缓冲区状态机时导致竞态条件。