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:SDRAM 中的全局变量初始化

Guru**** 2468460 points
Other Parts Discussed in Thread: TMS570LS3137, HALCOGEN, TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/669102/compiler-tms570lc4357-global-variables-initialization-in-the-sdram

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

工具/软件:TI C/C++编译器

您好!

我面临着与 SDRAM 中的全局变量初始化相关的问题。

我正在尝试将 SDRAM 用作.data 内存。 我可以在正常执行期间在 SDRAM 中执行读/写操作,但在使用全局变量时,在初始化阶段之后,SDRAM 内存不会存储任何数据,如下面针对变量 emacAddress[]的示例所示。

通过使用内部 SRAM、在同一应用程序中正确初始化全局变量。

在 SDRAM 中初始化全局变量是否需要进行一些特定的设置?

谢谢你

Ciro

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

    在 c 中声明 a 段、并将此段放入 SDRAM (.cmd 文件):

    #pragma DATA_SECTION (emacPhyAddress、".emacSDRAM");
    extern unsigned int emacPhyAddress[20];

    在.cmd 文件中:
    部分

    (笑声) (笑声)
    emacSDRAM:> SDRAM


    最重要的是在调用_c_int00 ()(例如在 GEL 文件中)之前或在_c_int00 ()中的 TI_auto_init()之前激活 SDRAM。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的快速回复、但是

    在调用_c_int00()(例如在 GEL 文件中)或在_c_int00()中调用 TI_auto_init()之前、我们已经激活了 SDRAM。

    我是否应该为 SDRAM 中定义的每个全局变量使用#pragma DATA_SECTION???? 它有点贵。

    为什么 TMS570LS3137器件不需要此功能(我们已经在多个产品上使用过)?

    是否有其他方法?

    谢谢你

    Ciro

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

    如果您使用在 LS3137上工作的方法、那么在将代码编程到 LC43x 闪存和将.data 编程到 SDRAM 时会出现什么错误?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Wang、

    我没有遇到任何错误、我只是观察我在本主题中的重要消息中描述的意外行为。

    我能够在代码执行期间使用 SDRAM、因此我认为 SDRAM 已正确初始化(我还注意到、对于 HALCoGen 生成的新源代码、已应用勘误 EMIF#5)。 但是当程序启动时、在函数__TI_auto_init()被执行后、SDRAM 中的所有内容都会初始化为0。 这会导致执行应用程序时出现错误行为、该应用程序需要查找   已初始化的表和全局变量。

    我试图用一个例子来更好地解释我在回顾上面解释的全局变量 emacAddress[]时观察到的情况。

    • 我首先执行我的应用、在执行期间、正确地从 EPROM 读取 Mac 地址、并且值001EC0AD8D1D 写入 SDRAM 位置 0x80956015

    • 我在不关闭主板电源的情况下复位 CPU 和系统(通过这种方式、SDRAM 保持存储旧值)。
    • 我重新开始执行、在函数 system_init()之前设置一个断点、其中  调用函数 EMIF_SDRAM_StartupInit()(反映勘误 EMIF#5预见的14个步骤)。
    • SDRAM 初始化后、自上一次执行以来存储的旧值将显示在地址 0x80956015处。

    • 我会逐步执行、直到函数__TI_auto_init()被调用;此时我会注意到,即使在我的代码中全局变量 emacAddress[]初始化为0004A3474F48,SDRAM 也会初始化为0 (emacAddress 的初始化指令已经显示在本主题的第一条消息中)并且在调用 main()函数之前没有被覆盖的初始值。

    因此、我的应用程序以所有未初始化的全局变量启动。

    我认为这是一种意外行为。

    这种行为是否有任何原因?

    如何在 main()执行阶段正确初始化全局变量?

    构建选项或编译器选项中是否有任何设置可用于解决此问题?

    我希望此示例有助于更好地理解我要解释的内容。

    谢谢你

    Ciro

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

    尊敬的 QJ

    我们为您提供了更多详细信息。

    SDRAM 变量"emacAddress"在 C 中定义为 全局变量(无 const)、并分配给一个值:

    "UINT8_t emacAddress[6]={0x00、0x04、0xA3、0x47、0x4F、 0x48};"

    我们使用 ccsv6版本:  6.1.3.00034构建"exe"

    我们尝试使用相同的结果设置不同的编译器/链接器工具链(TI v5.2.5和 TI v17.6.0.0)。

    当我们加载并启动调试器时、"emacAddress"为0。 (确定)(请参阅随附的.zip 中的图像"1.png")

    当调用 TI 库"run_cinit"函数时、它通过初始化为_TI_Handler_Table_Base [handler_idx]的处理程序指针调用以下2个后续函数。

    第一个调用是"__TI_decompress_lzss"、它将"emacAddress"设置为预期值(确定)(请参阅 随附的.zip 中的图像"2.png")

    第二个调用是"_TI_zero_init"、清除为0 "emacAddress"(错误)。 (请参阅 随附的.zip 中的图像"3.png")  

    所有后续调用都是 "_TI_zero_init"、 "emacAddress"保持为0 (无关)。

    e2e.ti.com/.../5706.linker_5F00_problem.zip

    注:

    当我们删除了"-zero_init" Linker->杂 项选项时,该变量显然仍保持在预期值,但这在启动时需要清除的所有其他变量上造成了其他问题!! 这不是解决方案。

    2件事:

    1) 1)是否正确呼叫顺序(首先设置值、然后清除?)。 在编译器工具的哪个文件中、函数顺序在"_TI_Handler_Table_BAS"表中设置? 找不到。

    2) 2)如果顺序正确、为什么 "emacAddress"地址包含在要设置(解压缩)值的区域以及要清除的区域(零初始化)中?

    我希望这能帮助您理解。

    请帮助我们!!

    请注意、在最好的情况下(您很快就回答)、我们在撰写的即时消息和您的回复之间至少有24小时的延迟。

    提前感谢您

    Ciro

    Paolo

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

    我刚刚搜索了 e2e、一篇文章说、在链接器命令文件中使用 type = NOINIT 可以阻止该段初始化。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

     

    我们发现了问题的根本原因:

    EMIF_SDRAM_StartupInit()之后、EMIF 模块的寄存器 SDCR 错误地设置为0x00004400。 最后一个字节被覆盖为00、这会导致为页大小和块编号参数设置错误的值。

    SDCR 覆盖是由于 HALCoGen 生成的 EMIF_SDRAM_StartupInit()函数中的最后一条指令(v 04.06.00)所致

    现在、考虑到我的器件是 TMS570LC4357 (大端字节序)、将0x3U 添加到 SDCR 地址是错误的;通过更正此指令、一切工作正常。

    那么、为什么 HALCoGen 向 SDCR 地址添加0x3U、就像我的器件是小端字节序??? HALCoGen 中是否有任何设置可设置器件的字节序? (我没有找到任何,我认为在生成新项目时指定设备就足够了)。

     

    谢谢你

    Ciro

     

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

    感谢您告知我们您找到了根本原因。

    对于小端字节序器件(RMX 系列)、SDCR 的 SR 位为 SDCR 偏移+ 0x3;但对于大端字节序器件(TMS570Lx 系列)、SDCR 的 SR 位为偏移+ 0x0。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、但为什么即使 我指定我的器件是 TMS570LC43x、HALCoGen 也会添加0x3? 是否有任何方法可以使用0x0自动生成这段代码? 否则、每次我更改任何模块中的任何设置时、我都必须在 HL_EMIF.c 中再次更改此值。。。它不是很舒适!!

    Ciro

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

    如果您为 HALCoGen 项目选择 TMS570LC43x、则会将器件配置为大端字节序。 0x0而不是0x3用于访问 SDCR 高字节(位24至位31)。

    我在 HALCoGen 4.07上尝试过几次、没有看到您提到的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、那么我将尝试更新到版本4.07。
    对于 v 4.06、每次我生成代码时都会发生这种情况。

    谢谢你
    Ciro