请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号: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"函数可以记录错误、增加计数器或将应用转换为错误模式。
感谢您的反馈。 此致。