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.

[参考译文] TMS570LS3137-EP:runFromRAM 导致中止(flashErrorReal)

Guru**** 2448320 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/602078/tms570ls3137-ep-runfromram-causes-abort-flasherrorreal

器件型号:TMS570LS3137-EP
主题中讨论的其他器件:HALCOGEN

你(们)好
我问 这个主题
现在、我们需要提高应用程序的执行速度。
我测试了运行从 Bob 先生处收到的示例程序。
它运行良好。

但是、当我们操作应用程序时、中止发生、而应用程序更改为在 RAM 上运行。
中止的时序是调用 __TI_auto_init()→run_binit()→copy_in()→memset()。

我在调用_coreEnableFlashEcc_()后检查了内存浏览器。


它显示了许多"???????? "
我认为这意味着不可纠正的 ECC 错误。

这是为什么?


链接器命令文件和映射文件如下所示。

・链接器 cmd 文件

内存
{
向量(X):origin=0x00000000
length=0x00000020
fill= 0xffffffff

FLASH0 (RX):origin=0x00000020
length=(0x00180000 - size (vectors))
vfill=0xffffffff

FLASH1 (RW):origin=0x00180000
长度= 0x00180000
// vfill=0xffffffff

ECC_VEC (R):origin=(0xf0400000 +(start (vectors)>> 3))
length=(size (vectors)>> 3)
ecc={算法=algoR4F021、input_range=vectors}

ECC_FLA0 (R):origin=(0xf0400000 +(开始(FLASH0)>> 3))
length=(size (FLASH0)>> 3)
ecc={algoR4F021、input_range=FLASH0}

// ecc_fA1 (R):origin=(0xf0400000 +(start (FLASH1)>> 3))
// length=(size (FLASH1)>> 3)
// ecc={算法=algoR4F021、INPUT_RANGE=FLASH1}


堆栈(RW):origin=0x08000000 length=0x00001500

RAM (RW):origin=0x08001500 length=0x0003EB00
}/*

ECC 算法 */
ECC
{
algoR4F021:address_mask = 0x003ff8 //地址位21:3 *
汉明_MASK = R4 /*用户 R4内置掩码 *
奇偶校验掩码= 0x0c /*设置哪些 ECC 位为偶校验和奇校验*/
镜像= F021 /* RM4x 和 TMS570LSx 构建于 F021中 */
}

段
{
.intvecs:{}>向量
.text:{}> FLASH0
.const:{}>FLASH0
.cinit:{}> FLASH0
.pinit:{}> FLASH0
.bss :{}> RAM
.data :{}> RAM
.sysmem:{}>RAM
binit:{}> FLASH0
runFromRAM:
{
BitCbit.obj (.text)
/*我用与上述相同的方式编写它。 总共48个.obj 文件*/
}
负载= FLASH0、
运行= RAM、
表(BINIT)
} 

・映射文件

存储器配置

名称 原点长度 已使用 未使用的属性填充
--- ---- ------ ---- ---- --------
矢量 00000000 00000020 00000020 00000000 x ffFFFF
FLASH0 00000020 0017ffe0 0000be70 00174170 R X (ffFFFF)
FLASH1 00180000 00180000 00000000 00180000 RW
堆栈 08000000 00001500 00000000 00001500 RW
RAM 08001500 0003eb00 00022607 0001c4f9 RW
ECC_VEC f0400000 00000004 00000004 00000000 R
ECC_FLA0 f0400004 0002fffc 0002fffc 00000000 R


段分配映射

运行源站加载源站长度初始化长度 attrs 成员
--- ------ ------ ------ ---- ----
00000000 00000000 00000020 00000020 r-x
00000000 000000000020 00000020 r-x .intvecs
000067bc 0000567c 0000567c r-x
000067bc 000067bc 00004cc8 00004cc8 r-x .text
0000b484 0000b0009b4 000009b4 000038-
000048 000038 bber- 000048 000048 0000000000r- 000048

binit
08001500 08000001bd0b 00000000 rw-08001500
0001bd0b 00000000 rw-.bss
0801d20c 00000020 0000679c 0000679c r-x
0801d20c 00000020 0000679c 0000679c 0000400 r-x runFRAM 000000040004000004

00000004000004 00000008004 00000004000004 00000004 000000040004000004 rf4000004 00000004 00000004 00000004 0000000800004000004 rw


ecc1. 

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

    启用 ECC 之前或之后是否将目标文件复制到 RAM? ????的多个位置 表示调试器无法读取最有可能是由于 RAM 中未初始化的 ECC 内存而导致的位置。 如果您在内存初始化并复制到 RAM 之前启用 RAM ECC、ECC 值将被更新以与您的目标代码相对应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复!

    我们的复位 exprion 代码(_c_int00)由 HALCoGen v04.06.00生成。
    呼叫顺序如下。

    _coreEnableRamEcc_()→_TI_auto_init ()

    _coreEnableRamEcc_():启用 RAM ECC
    __TI_auto_init():目标文件被复制到 RAM 中

    由于各种实验、我想.runFromRAM 段大小的上限约为16KB (0x4000)。
    当.runFromRAM 段的大小小于16KB (0×4000)时、RAM 操作将无错误地运行。

    您是否知道导致问题的原因?

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

    我想存在分支大小限制。 即、分支可以跳转的距离通常存在大小限制、您复制的代码可能会遇到此问题。 16KB 似乎是这种类型的限制、但肯定不应被忽略。 您可能需要检查 ARM 汇编器文档以验证分支的最大大小。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、好久不见。
    这一问题尚未得到解决。

    我已检查汇编器 maual[spnu118o_arm 汇编语言工具_UsersGuide]
    在8.4.34.3中、--trampoline_min_spacing 选项可以更改分支代码大小、对吧?
    我试图改变、但没有效果。 即仍发生中止。

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

    我更改了生成 ECC 的方式。
    当在 CCS 中启用自动 ECC 生成设置时、它看起来工作正常。
    为什么? 我需要在链接器命令文件中编写特殊说明?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Takashi-San、您好!

    我能想到的唯一解释是、读取目标代码并将其复制到 RAM 中存在 ECC 问题。 通过启用自动 ECC 生成、您很可能已经解决了问题。 它可能与未编程的区域相关、该区域未编程或读取超出原始目标文件末尾的 ECC 值等 如果使用自动 ECC 生成、链接器命令文件中不需要特殊说明。