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.

[参考译文] TMS570LC4357:ECC 1位和2位错误注入失败

Guru**** 2478765 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1009928/tms570lc4357-ecc-1-bit-and-2-bit-error-injecting-failed

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

大家好、团队、

我正在编写代码、通过注入1位 和2位错误来测试 RAM ECC 的功能。 当 一个 SRAM 单一位错误发生时、也尝试触发 ESM 低电平中断。

请告诉我下面提到的步骤是否正确或是否缺少任何内容 。这些是我已经执行的步骤->

  1. 使用     RAMCTRL 启用 ECC 检测、启用单位错误状态捕获以及 ESM 通知和 ECC 存储器写入

      RAMCTRL =((0xA << 0)|(0x1<< 4)|(0x1 << 8));

  2. 写入存储器->(*(volatile UINT32 *)(0x08000000)= 0x8421842184218421;

  3. 通过翻转一位插入1位 ECC 错误
    uint32 ecc1 =*(volatile uint32 *)(0x08400000U)^ 0x01;

  4. 读取损坏的数据以生成单位错误  
    eccram_read1 =(*(volatile UINT32 *)(0x08000000));

  5.  检查 ESM 标志  Q:是否需要处理任何额外的步骤来检查 ESM 错误?

/* Include Files */

#include "HL_sys_common.h"

/* USER CODE BEGIN (1) */
#include "HL_reg_l2ramw.h"
#include <stdio.h>
/* USER CODE END */

/** @fn void main(void)
 *   @brief Application main function
 *   @note This function is empty by default.
 *
 *   This function is called after startup.
 *   The user can use this function to implement the application.
 */

/* USER CODE BEGIN (2) */

void checkSinglebitECC(void);
void checkDoublebitECC(void);

/* USER CODE END */

int main(void)
{
    /* USER CODE BEGIN (3) */

    checkSinglebitECC();             /* function called to inject and check single bit error mechanism*/
    checkDoublebitECC();             /* function called to inject and check Double bit error mechanism*/

    /* USER CODE END */

    return 0;
}


/* USER CODE BEGIN (4) */

void checkSinglebitECC(void)
{
    volatile uint64 eccram_read1 = 0U;                     /* variable to hold the corrupted data to generate single bit error */

    /* Enable ECC detection.
     * Enable single bit error status capture and ESM notification.
     *  ECC memory writes are enabled. */
    l2ramwREG->RAMCTRL = ((0xA << 0) | (0x1<<4) | (0x1 << 8));

    (*(volatile uint32 *)(0x08000000 )) = 0x8421842184218421;

    /* Force a single bit error */
    uint32 ecc1 = *(volatile uint32 *)(0x08400000) ^ 0x01 ;

    /* Read the corrupted data to generate single bit error */
    eccram_read1 = (*(volatile uint32 *)(0x08000000 ));

    //if((l2ramwREG->RAMERRSTATUS & 0x280000u) == 0x280000u) /* Check for error status

}

/* USER CODE END */

执行这些步骤后、我 检查了内存浏览器。 我无法使用上述位置找到更新。我还尝试从内存浏览器填充内存。  

  1. 这里的问题是什么?
  2. 要在内存浏览器中检查、需要完成哪些配置?
  3. 如何验证错误注入是否成功?

请尽快回复

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

    您好!

    对于 CPU 检测到的1位 ECC、它将通知 EPC 并最终进入 ESM GP1.4。 CPU 检测到1位 ECC 错误后、它会向 EPC 以及相应的错误地址发出信号。 EPC 包含一个 CAM (内容可寻址存储器)、在该 CAM 中将扫描错误地址、以查看是否存在匹配项。 如果不匹 配、则1位错误地址存储在 CAM 中、如果 EPCCNTRL 中的 SERRENA 控制位被启用、ESM GP1.4被置位。

     epcREG1->EPCCNTRL |= 0x0A;

    对于 CPU 检测到的2位 ECC、它将通过 GP2.3直接进入 ESM

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

    您能回答我关于内存浏览器的第二部分问题吗?

        

    执行这些步骤后、我 检查了内存浏览器。 我无法使用上述位置找到更新。 我还尝试从内存浏览器中填充内存。  

    1. 这里的问题是什么?
    2. 要在内存浏览器中检查、需要完成哪些配置?
    3. 如何验证错误注入是否成功?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否为 L2RAM ECC 内存定义了 MPU 区域(从0x08400000开始)?

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

    否未定义。 如何为 L2RAM ECC 内存定义此 MPU 区域?

    是否使用 MPUREGACR 寄存器?

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

    您可以使用 HALCoGen 对其进行定义。 TMS570LC43x 支持16个 MPU 区域。 您可以为 L2RAM ECC 选择任何未使用的区域。

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

    感谢您的更新。 一个问题与上述答案相关

    我是否必须使用第 11.4节中涉及的任何寄存器以及该配置?

    我可以看到寄存  器 MPUTYPE 用来指示已执行的 MPU 区的数量、以及其他几个与使能 MPU 区相关的区域。 能否提供我必须使用的寄存器列表?

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

    您能否提供或提及该文档、我可以在其中找到所需的所有详细信息以及检查 RAM ECC 功能的详细步骤。  

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

    有关 MPU、请参阅 ARM Cortex-R5F TRM: https://developer.arm.com/documentation/ddi0460/d/Memory-Protection-Unit?lang=en

    HALCoGen 配置:请使用 HAL 帮助菜单:HalCoGen 帮助主题和帮助示例  

    RAM ECC:TMS570LC43x TRM 的第8章和第12章。 对于1位或2位 ECC 错误诊断测试、您可以使用 TRM 8.2.6中提到的方法。

    1.将64位数据写入 RAM 位置

    2.将地址编程到 DIAG_Data 寄存器、

    3.将具有1位错误或2位错误的 ECC 值编程到 DIAG_ECC 寄存器、

    4.触发诊断测试,测试将设置错误标志。

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

    HALCoGen 生成 MPU 初始化函数(在 HL_SYS_MPU.asm 中)。 在 HALCOGen 默认 MPU 设置中、仅区域1、2、3、4、 使用了5、6、7、16,因此您可以使用区域8或9。 RAM ECC 存储器为15。  

    如果要将区域12用于 RAM ECC 存储器、请首先选中"区域12配置"中的"启用 MPU 区域"、然后键入 RAM ECC 存储器空间的起始地址、选择存储器大小、并选择此存储器空间的类型和权限。

    点击"Generate code"后、将生成新的 MPU 配置代码。 应该调用_mpuInit_()。  

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

    BTW、_mpuInit_()在_c_int00 ()函数中调用: