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.

[参考译文] CCS/TMS570LS3137:在调试模式下、ECC 也应该在链接器脚本中计算吗? 但生成.bin 文件和使用引导加载程序下载应用程序时不需要相同的操作

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/909419/ccs-tms570ls3137-does-in-debug-mode-the-ecc-should-also-be-calculated-in-linker-script-but-same-is-not-required-for-generating-bin-file-and-using-boot-loader-to-downloading-application

器件型号:TMS570LS3137
主题中讨论的其他器件: NOWECCUNIFLASH

工具/软件:Code Composer Studio

您好,

我指的是两种不同的测试代码模式。

第一种方法)一种是 “调试模式”,我希望启用 ECC 并运行代码,以便我可以放置断点。

第2种方法)正在生成3MB 的二进制文件并使用 boot-loader 进行下载(此模式是否还需要下图中的绿色框?) 。

在 TMS570的 CCS 调试模式中是否缺少任何一点、因为当我启用 ECC 时、TMS570LS3137控制器在加电期间处于 ESM 组3错误? 。

如  http://www.ti.com/lit/an/spna241/spna241.pdf 第6节中所述,是否还需要绿色框(下图)? 仅适用于调试模式。  但是生成.bin 文件和使用引导加载程序下载应用程序并不需要相同 的文件(因为我们实际上无法 生成如此大的二进制文件,从0x0000_0000开始,到0xF040_0000结束)。

如果我在调试模式下禁用以下行,它将正常工作。 在调试模式下,是否还应在链接器脚本中计算 ECC? 但引导加载程序下载应用程序不需要相同的操作。

/*启用 CPU 事件导出*/
/*这允许 CPU 发出检测到的任何单位或双位错误的信号
*通过其 ECC 逻辑访问程序闪存或数据 RAM。
*
_coreEnableEventBusExport_();

/*为闪存访问启用 CPU 指示的 ECC 错误响应*/
flashWREG->FEDACCTRL1 = 0x000A060AU;


/*为 ATCM (闪存访问)启用 CPU ECC 检查*/
_coreEnableFlashEcc_();

我已经执行了 SPNA241第7节中提到的操作来填充3MB 闪存空间的每一个字节、但是在 CCS "调试模式"中、TMS570LS3137  控制器 在加电期间出现 ESM 组3错误 。

链接器脚本如下所示、我已经阅读了第7节和第6节 SPNA241.pdf

  向量   (X):origin=0x00000000 length=0x00000020 fill=0xFFFFFFFF

  FLASH1      (RX):origin=0x00000020 length=0x00047FE0 fill=0xFFFFFFFF

  FLASH2      (RX):origin=0x00048000 length=0x000B6F00 fill=0xFFFFFFFF

  FLASH3       (RX):origin=0x000FEF00 length=0x00001000 fill=0xFFFFFFFF

  FLASH4      (RX):origin=0x000FFF00 length=0x00000100 fill=0xFFFFFFFF

  FLASH5        (RX):origin=0x00100000 length=0x00080000 fill=0xFFFFFFFF

  Flash6     (RX):origin=0x00180000 length=0x00180000 fill=0xFFFFFFFF

SPNA241.pdf

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

    您好!

    生成 ECC 的方法有三种:

    nowECC: 生成要编程到具有 ECC 闪存的 TMS570平台器件 ECC 存储器位置的数据。

    CCS 或 Uniflash:"自动 ECC 生成"功能将在将程序加载到闪存时启用 ECC 计算/编程。

    3.链接器命令文件:vfill'仅影响 ECC 生成。 它指示 ECC 发生器将闪存视为已填充值0xFFFFFFFF。 这是虚拟填充、因为加载程序不需要下载3MB。

    对于应用(而不是引导加载程序)、您也可以使用链接器命令文件来生成 ECC、但不会为整个闪存生成 ECC。 如果应用程序可以容纳2个扇区、则只需使用0xFFFFFFFF 对这两个扇区进行虚拟填充、并为这两个扇区生成 ECC。

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

    您好,  

    是否有一种方法可以使用单个链接器脚本,以便此链接器脚本同时用于发布和调试。  

    这只有当我们可以 使用二进制生成脚本 tiobj2bin.bat 只生成1MB 所需的二进制文件时才可能实现、即使.out 文件包含0xF040_0000处的 ECC 区域也是如此

    我们的开发模式:

    我们有2个不同的构建,但只想使用一个链接器脚本。

    第1节)

    1)生成1)此生成,其中生成1 MB 二进制文件并将其提供给引导加载程序,以便下载到闪存区域。

    我们的链接器脚本如下面的第2节所示

    编译后二进制创建脚本:-

    我 使用以下脚本从*。out 文件中生成一个二进制(*。bin)文件、该文件在 CCS 的编译后进行推荐  

    "${CCS_INSTALL_ROOT}/utils/bin/tiobj2bin.bat ""${BuildArtiftFileName}" "${BuildArtifactFileBaseName}.bin" "${CG_TOOL_ROOT}/bin/ofd470.exe ""${CG_TOOL_ROOT}/bin/hex470.exe ""${CCS_INSTALL_ROOT}/utils/bin/mkhex4bin.exe

    执行该操作。 如果我们仅在0xF040_0000处删除 ECC、它就可以成功运行。

    如果我们在地址0xF040_0000生成 ECC,则编译后命令无法正确生成二进制文件,即创建一个大小约为4 GB 的非常大的二进制文件。我们有闪存代码在内部闪存中加载1 MB 部分的代码,即0x0000_0000到 0x0010_0000。 我们不需要将二进制文件的 ECC 传递给引导加载程序。

    这是因为如果地址从0x0000_0000开始,tiobj2bin.bat 将为连续存储器生成一个二进制文件,它将在二进制文件中填充零,直到0xF040_0000。

    因此,我们需要 tiobj2bin.bat 只为二进制文件生成1MB 的闪存信息地址范围。  

    2)构建2) 第二个构建是使用启用 ECC 检查来调试源代码、而在此构建中、我们将使用步骤3中提到的方法进行开发。  

    第2部分)链接器脚本

    /*内存映射*/

    存储器

    /*在映射到闪存的每一行的末尾添加一个 vfill 指令*/

    引导程序(X):origin=0x00000000 length=0x00000020 vfill =0xFFFF

    FLASH0 (RX):origin=0x00000020 length=0x000FFFE0 vfill = 0xffffffff

    SRAM (rwx):origin=0x08002000 length=0x0002D000

    栈(RW):origin=0x08000000 length=0x00002000

    /*用户代码开始(3)*/

    #if 1.

    /*添加与闪存组 ECC 区域相对应的内存区域*/

    ECC_VEC (R):origin=(0xf0400000 +(start (vectors)>> 3))

    length=(size (vectors)>> 3)

    ecc={algoL2R5F021、input_range=vectors}

    ECC_FLA0 (R):origin=(0xf0400000 +(开始(FLASH0)>> 3))

    length=(size (FLASH0)>> 3)

    ecc={algoL2R5F021、input_range=FLASH0}

    #endif

    /*用户代码结束*/

    /*用户代码结束*/

    /*用户代码开始(4)*/

    /*添加一条描述与器件匹配算法的 ECC{}指令*

    ECC

    algoL2R5F021:address_mask = 0xfffffff8 /*地址位31:3 */

    hamming_mask = R4 /*使用掩码中的 R4/R5构建*/

    奇偶校验掩码= 0x0c /*设置哪些 ECC 位为偶校验和奇校验*

    镜像= F021 /*RM57Lx 和 TMS570LCx 构建于 F021*/中

    /*用户代码结束*/

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

    我使用单独的脚本进行调试和发布。

    正确、如果工程使用链接器命令生成 ECC、并且二进制文件大约为4GB、其中包含整个存储器范围的内容。