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.

[参考译文] AM263P4-Q1:ECC 错误注入

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1651683/am263p4-q1-ecc-error-injection

器件型号: AM263P4-Q1

基于以下 ECC MSS L2 样本的 OCSRAM 原型 ECC 检测。 但是、在调用 sdl_ecc_injectError 函数后、有些情况下会调用 ESM 回调函数、而有些情况下则不调用此函数。
https://software-dl.ti.com/mcu-plus-sdk/esd/AM263PX/09_02_00_56/exports/docs/api_guide_am263px/SDL_ECC_PAGE.html#autotoc_md1214

我有两个问题。
(1) 如果 testLocationValue = injectErrorConfig.pErrMem[0];命中高速缓存、它是否可能无法访问实际内存、因此无法检测到错误?
如果是、是否有必要在错误注入测试代码之前禁用缓存、然后再重新启用它、如下所示?
如果没有调用回调函数、请说明未调用回调函数的可能原因以及相应的对策。

CacheP_wbInvAll (CacheP_TYPE_ALL);
CacheP_DISABLE (CacheP_TYPE_ALL);
__ASM__ volatile (“:::“存储器“);/*存储器屏障*/
sdl_ecc_injectError (...);
__ASM__ volatile (“:::“存储器“);/*存储器屏障*/
testLocationValue = injectErrorConfig.pErrMem[0];
CacheP_wbInvAll (CacheP_TYPE_ALL);
CacheP_ENABLE (CacheP_TYPE_ALL);
(2) 在 2‑位错误样本中、有指定要翻转以进行错误注入的位模式的代码、例如:
injectErrorConfig.flipBitMask = 0x30002;

值 0x30002 会翻转 3 位、而不是 2 位。 是否有具体原因? 注释指出“2 位错误“、但由于它实际影响超过 2 位、它是否有意使用 3 位进行测试?
此外、如果我们简单地使用 0x03 只翻转 2 位、我们是否会获得相同的结果?

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

     你好、Imaoka、

    对延迟的回复表示歉意!

    我们的所有示例都仅启用了缓存、因此我认为这不是因为缓存。

    我的建议:

    硬件 ECC 初始化对于此测试非常重要

    1. 始终确保在引导加载程序代码中具有“Bootloader_socInitL2MailBoxMemory“ API:

    此 API 将有助于使用默认值初始化整个 L2RAM 存储器及其相应的 ECC 区域。

    1. 如果您在没有引导加载程序的情况下进行测试并使用 DEV 引导模式、则在旧版本的 CCS 中、我发现 GEL 路径错误:

    路径应为:

    如果此 GEL 路径不正确、则我在步骤 1 中提到的初始化将不会在开发引导模式下发生。

    此外、对于 AM263Px 器件、在初始化中确保正确的值为 0x3F:

    因为我们发现、对于某些旧版本的器件、它仅为 0xF、这意味着仅初始化 4 个组、而不是 OCSRAM 中的全部 6 个组。

    --
    此致、
    Jagadish。

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

    *我代表客户 Imaoka-San 发布此文章、因为他们似乎是 E2E 上的实际问题。  

    (来自客户的消息)

    尊敬的 Jagadish:

    以下代码由我们根据示例代码创建。
    与示例代码的区别在于、为了检查内存内容、我们添加了该行
    testLocationValue = injectErrorConfig.pErrMem[0];调用 sdl_ecc_injectError () 之前。

    将此行注释掉后、错误检测按预期运行。

    我们之前收到一个响应、指出缓存不是问题的原因。
    但是、在我们的实现中、缓存是否会影响该行为?

    **********************************************************************************************

    sdl_ErrType_t RetVal;
    sdl_ecc_InjectErrorConfig_t injectErrorConfig;
    Volatile uint32_t testLocationValue;

    /*请注意、该地址相对于 ram 的开头*/
    injectErrorConfig.pErrMem =(uint32_t *)(a_addr);


    /*针对冲刺内存 x 位错误运行一次性测试*/
    injectErrorConfig.flipBitMask = A_flipBitMask;

    testLocationValue = injectErrorConfig.pErrMem[0];

    _ASM__ volatile (“:::“内存“);

    RetVal = sdl_ecc_injectError (a_aggr、a_id、a_type、&injectErrorConfig);

    _ASM__ volatile (“:::“内存“);

    if (RetVal == SDL_PASS)
    {
    /*访问需要注入的内存*/
    testLocationValue = injectErrorConfig.pErrMem[0];
    }

    **********************************************************************************************

    此致、Imaoka

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

    你好、Imaoka、

    在这种情况下、您是对的、问题仅是由于缓存造成的。 我进行了测试、我最终也能够重现您的问题。

    正如您所看到的、我添加了注入前的注入错误位置读取、我可以看到没有 ESM 回调、这意味着检测根本无法正常工作。

    因此、您对这个问题是正确的。

    我做了下面的工作,再次工作。

    在再次读取位置之前使缓存无效、如下所示:

    /*使错误注入存储器的位置失效*/
    CacheP_inv ((uint32_t *)&injectErrorConfig.pErrMem[0]、sizeof (uint32_t)、CacheP_TYPE_ALLD);

    您现在可以看到、它按预期运行。

    --
    此致、
    Jagadish。

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

    尊敬的 Jagadish:

    我对 ECC 错误注入有了很好的了解。 非常感谢您的支持。

    此致、Imaoka。