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.

[参考译文] SAFETI_DIAG_LIB:用于在生产代码中实现 ESM 处理程序的概念。

Guru**** 2393725 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1488231/safeti_diag_lib-concept-for-implementing-esm-handler-in-production-code

部件号:SAFETI_DIAG_LIB

工具/软件:

尊敬的:

我只想验证我对 SDL 提供的 ESM 处理程序的理解以及我的前进方向。 据我所知:

  • 如果中断是由自检引起的、SDL 本身会标记其自检并防止 ESM 中断调用处理程序。
  • 一些故障注入确实会调用 ESM 处理程序、它们使用全局变量来向应用程序发出处理程序执行的信号
  • ESM 处理程序中的所有错误都被确认到 ESM (SR 寄存器)
  • 一些错误还使用_SL_HoldNCLEL_nError 清除 nError 引脚

我有以下问题:

  • 为什么_sl_HoldNCLEL_nError 是无条件使用的? n´t 是否应该检查发生的目的是否正确、然后才清除 nError?
  • 我假设提供的 ESM 处理程序仅显示对 ESM 的接收和确认。
  • 我还假设我应该为每个错误处理添加一个信令方法、例如调用一个中断安全函数、如"report_esm_error_to_app()"?
  • 我问自己是否应该无条件地向 ESM 确认该错误、还是仅当我检测到这是一个预期的呼叫时才知道。 示例:

    // I have added this for the DCC. I do a fault injection on startup. I have checked the SDL code and it does call the handler for this error.
    
    else if((ESM_GRP1_MASK == ((grp_channel & ESM_GRP1_MASK))) && (ESM_G1ERR_DCC1_ERR == (grp_channel & 0x0000ffffu)))
    {
        g_callbk_param1 = param1; // CNT0
        g_callbk_param2 = param2; // CNT1
        sl_esmREG->SR1[0] |= GET_ESM_BIT_NUM(ESM_G1ERR_DCC1_ERR);
        g_dcc1_faultinject_callback = TRUE;
        _SL_HoldNClear_nError();
    }
    
    // Now I could either:
    
    else if((ESM_GRP1_MASK == ((grp_channel & ESM_GRP1_MASK))) && (ESM_G1ERR_DCC1_ERR == (grp_channel & 0x0000ffffu)))
    {
        if (was_fault_injection)
        {
            g_callbk_param1 = param1; // CNT0
            g_callbk_param2 = param2; // CNT1
            sl_esmREG->SR1[0] |= GET_ESM_BIT_NUM(ESM_G1ERR_DCC1_ERR);
            g_dcc1_faultinject_callback = TRUE;
            _SL_HoldNClear_nError();
        else
        {
            report_esm_error_to_app();
        }
    }
    
    // Or:
    
    else if((ESM_GRP1_MASK == ((grp_channel & ESM_GRP1_MASK))) && (ESM_G1ERR_DCC1_ERR == (grp_channel & 0x0000ffffu)))
    {
        g_callbk_param1 = param1; // CNT0
        g_callbk_param2 = param2; // CNT1
        sl_esmREG->SR1[0] |= GET_ESM_BIT_NUM(ESM_G1ERR_DCC1_ERR);
        g_dcc1_faultinject_callback = TRUE;
        _SL_HoldNClear_nError();

        if (!was_fault_injection)
        {
            report_esm_error_to_app();
        }
    }
    
    

然后、我的"report_esm_error_to_app"函数可以记录错误、增加计数器或将应用转换为错误模式。

感谢您的反馈。 此致。

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

    你(们)好 对此有任何更新? 谢谢。

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

    你(们)好 对此有任何更新?

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

    你(们)好 对此有任何更新?

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

    您好 Julian:

    我真诚地为延迟的回应道歉,我休息了几天。

    Unknown 说:
    为什么_sl_HoldNCLEL_nError 是无条件使用的? n´t 是否应该检查发生的情况是否有目的、然后才清除 nError?

    在 SDL 代码中、这样可以正常工作、因为我们有意创建 ESM 错误、因此我们可以清除 nERROR 引脚。 但是、在应用程序代码中、我们应该在清除 nERROR 之前检查其油量的原因。

    我假设提供的 ESM 处理程序仅显示对 ESM 的接收和确认。

    您是对的。

    Unknown 说:
    我进一步假设我应该为每个错误处理添加一个信令方法、例如调用一个中断安全函数、如"report_esm_error_to_app ()"?

    您可以这样做、这只是应用程序、取决于如何进一步报告它并采取措施。

    --
    此致、
    Jagadish。