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.

[参考译文] AM2634:在所有存储器区域中配置 ECC 和 ESM 时出现问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1588601/am2634-issue-with-configuring-ecc-and-esm-in-all-memory-area

器件型号: AM2634

这只是对我遇到的 ESM 和 ECC 问题的总结

当我运行仅配置一个存储器子类型(在本例中为 SDL_MCAN0)的示例代码时

ECC 初始化正确、没有问题、我可以看到 ERROR 引脚为高电平(它是一个 LED)

同时使用配置所有存储器时会发生这种情况  

static const SDL_MemConfig_t SDL_R5FSS0_CORE0_ECC_AGGR_MemEntries[SDL_R5FSS0_CORE0_ECC_AGGR_RAM_IDS_TOTAL_ENTRIES] =

在中source/sdl/ecc/soc/am263x/sdl_ecc_soc.hSDL_ECC_initMemory返回没有错误、但SDL_ECC_init返回–1、并且错误引脚 led 不会打开

我想 ESM 可能是导致此问题的服务器、因此我找到了 maskbit、以便在示例文件 C:\ti\mcu_plus_sdk_am263x_10_01_00_31\examples\sdl\integrated_examples\sdl\esm.c 中 对其进行配置

 
// all ECC
#define ESM_ENABLE_BITMAP_ECC_ALL      (ESM_ENABLE_BITMAP_MCAN0ECC_G0 | \
                                        ESM_ENABLE_BITMAP_ICSSMECC_G2 | \
                                        ESM_ENABLE_BITMAP_MSSL2ECC_G0 | \
                                        ESM_ENABLE_BITMAP_R5F0ECC_G1 |  \
                                        ESM_ENABLE_BITMAP_ECCBUSC_G1 |  \
                                        ESM_ENABLE_BITMAP_ECCBUSC_G1 |  \
                                        ESM_ENABLE_BITMAP_TPTC_G0)

#define ESM_PRIORITY_ECC_ALL           (ESM_PRIORITY_MCAN0ECC_G0 | \
                                        ESM_PRIORITY_ICSSMECC_G2 | \
                                        ESM_PRIORITY_MSSL2ECC_G0 | \
                                        ESM_PRIORITY_R5F0ECC_G1 |  \
                                        ESM_PRIORITY_TPTC_G0)

#define ESM_ERRORP_ECC_ALL             (ESM_ERRORP_MCAN0ECC_G0 | \
                                        ESM_ERRORP_ICSSMECC_G2 | \
                                        ESM_ERRORP_MSSL2ECC_G0 | \
                                        ESM_ERRORP_R5F0ECC_G1 |  \
                                        ESM_ERRORP_ECCBUS_G1 |  \
                                        ESM_ERRORP_ECCBUS_G0 |  \
                                        ESM_ERRORP_TPTC_G2)
 
static SDL_ECC_InitConfig_t ECC_Test_R5FSS0_CORE0_ECCInitConfig =
{
    .numRams = SDL_R5FSS0_CORE0_ECC_AGGR_RAM_IDS_TOTAL_ENTRIES,
    /**< Number of Rams ECC is enabled  */
    .pMemSubTypeList = &(SDL_R5FSS0_CORE0_ECC_AGGR_MemEntries[0].memSubType),
    /**< Sub type list  */
};

int32_t ECC_Example_init (void)
{
    int32_t retValue=0;
    SDL_ErrType_t result;
    void *ptr = (void *)&arg;
    /* Initialise exception handler */
    ECC_Test_exceptionInit();

    DebugP_log("\r\nECC_Test_init: Exception init complete \r\n");

    /* Initialize ECC Memory */
    for (int i = 0; i < SDL_R5FSS0_CORE0_ECC_AGGR_RAM_IDS_TOTAL_ENTRIES; i++)
    {
        result = SDL_ECC_initMemory(SDL_R5FSS0_CORE0_ECC_AGGR, SDL_R5FSS0_CORE0_ECC_AGGR_MemEntries[i].memSubType);
        if (result != SDL_PASS) {
            /* print error and quit */
            DebugP_log("\r\nECC_Test_init: Error initializing Memory of R5FSS0 CORE0 ECC: result = %d\r\n", result);
            retValue = -1;
            return retValue;
        }
    }
    /* Initialize ESM module */
    result = SDL_ESM_init(SDL_ESM_INST_MAIN_ESM0, &ECC_Test_esmInitConfig_MAIN, SDL_ESM_applicationCallbackFunction, ptr);
    if (result != SDL_PASS) {
        /* print error and quit */
        DebugP_log("\r\nESM_Test_init: Error initializing MSS ESM: result = %d\r\n", result);
        retValue = -1;
        return retValue;
    }

    /* Initialize ECC */
    result = SDL_ECC_init(SDL_R5FSS0_CORE0_ECC_AGGR, &ECC_Test_R5FSS0_CORE0_ECCInitConfig);
    if (result != SDL_PASS) {
        /* print error and quit */
        DebugP_log("\r\nECC_Test_init: Error initializing R5FSS0 CORE0 ECC: result = %d\r\n", result);
        retValue = -1;
        return retValue;
    }
    return retValue;
}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ali:

    会出现  ECC_Example_init() with the new ECC esmInitConfig work?

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

     SDL_ECC_initMemory 和 SDL_ESM_INIT 均返回 SDL_PASS

    仅 返回–1 的 SDL_ECC_INIT

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

    因此、它无法与新的 ECC  esmInitConfig 搭配使用

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

    您好、

    是否修改 SDL lib 中的文件(例如 sdl_ecc_soc.h)? 代码中使用的突出显示变量在 lib 中进行声明和定义、它们是静态变量。  

     

    您可以单步进入 sdl_ecc_init () 来检查哪个函数导致了问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我保持不变、我没有更改它们、但我包含了 sdl_ecc_soc.h

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

    我试着单步进入函数、然后返回给您

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

    我发现了这个问题

    `SDL_ECC_INIT_INIT'会递增此指针`&(SDL_R5FSS0_CORE0_ECC_AGGR_MemEntries[0].memSubType);`、而不是转到 [1].memSubType、而是转到结构中的下一个元素

    我用以下取代它

     

    static SDL_ECC_InitConfig_t ECC_Test_R5FSS0_CORE0_ECCInitConfig =
    {
        .numRams = 1,
        /**< Number of Rams ECC is enabled  */
        .pMemSubTypeList = NULL,
        /**< Sub type list  */
    };
    
    
    ......
    
        for (int i = 0; i < SDL_R5FSS0_CORE0_ECC_AGGR_RAM_IDS_TOTAL_ENTRIES; i++)
        {
            ECC_Test_R5FSS0_CORE0_ECCInitConfig.pMemSubTypeList = &(SDL_R5FSS0_CORE0_ECC_AGGR_MemEntries[i].memSubType);
            result = SDL_ECC_init(SDL_R5FSS0_CORE0_ECC_AGGR, &ECC_Test_R5FSS0_CORE0_ECCInitConfig);
            if (result != SDL_PASS) {
                /* print error and quit */
                DebugP_log("\r\nECC_Test_init: Error initializing R5FSS0 CORE0 ECC: result = %d\r\n", result);
                retValue = -1;
                return retValue;
            }
        }