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.

[参考译文] TMS320F28388D:.data 段包含未初始化的数据

Guru**** 2538950 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1395181/tms320f28388d-data-section-contains-uninitialized-data

器件型号:TMS320F28388D

工具与软件:

您好!

我正在尝试为 F28388D 的固件更新构建自定义引导加载程序。
我已经实施了这一机制、似乎在特定条件下有效。

我的闪存被分成如下:


[选择逻辑]
[分区1]
[分区2]

[选择逻辑]放置在闪存入口点0x080000处。 它检查哪个分区是最新的并跳转到它的开头。

[Partition1]入口点以 codestartbranch.asm 开头。 该分区可以通过从 RAM 执行 FlashAPI 来刷写[Partition2]。

对称地、[Partition2]入口点以 codestartbranch.asm 开头。 该分区可以通过从 RAM 执行 FlashAPI 来刷写[Partition1]。

在更新过程结束时、系统将重新引导、[选择逻辑]将执行并跳转到最新的[分区]。

不幸的是、此流程的行为不符合预期。 当我使用调试器刷写[Partition1]时、我的代码按预期运行、并且我能够写入[Partition2]。 请注意、在这种情况下、尚未执行[选择逻辑]。

但是、如果让代码从[选择逻辑]开始、并在不刷写的情况下连接调试器、我可以看到我的代码行为没有预期的那样、我的应用程序只是运行怪异。 通过进一步调试、我注意到一些静态全局变量未初始化、即使已在我的代码中初始化、也会用0填充。

使用的链接器命令文件如下:(Partition1的链接器)  

MEMORY
{
    BOOT_RSVD           : origin = 0x000002, length = 0x0001AF     /* Part of M0, BOOT rom will use this for stack */

    RAMLS0_2		    : origin = 0x008000, length = 0x001800
   	RAMLS3		        : origin = 0x009800, length = 0x000800

	RAMGS0_4            : origin = 0x00D000, length = 0x005000
    RAMGS10       	    : origin = 0x017000, length = 0x001000
    RAMGS14             : origin = 0x01B000, length = 0x001000

	PART1_HEADER   		: origin = 0x084000, length = 0x000100
	FW_IMAGE_0			: origin = 0x084100, length = 0x003F00  /* on-chip Flash */
   	BEGIN            	: origin = 0x088000, length = 0x000100
   	FW_IMAGE_1			: origin = 0x088100, length = 0x01FF00  /* on-chip Flash */


    CPU1TOCPU2RAM_0     : origin = 0x03A000, length = 0x000400
    CPU2TOCPU1RAM_0     : origin = 0x03B000, length = 0x000400
    CPUTOCMRAM_0        : origin = 0x039000, length = 0x000400
    CMTOCPURAM_0        : origin = 0x038000, length = 0x000400


    RESET               : origin = 0x3FFFC0, length = 0x000002
}

SECTIONS
{

   codestart           : > BEGIN, ALIGN(8)
   .text               : >> FW_IMAGE_0 | FW_IMAGE_1, ALIGN(8)
   .cinit              : > FW_IMAGE_0 | FW_IMAGE_1, ALIGN(8)
   .switch             : > FW_IMAGE_0 | FW_IMAGE_1, ALIGN(8)
   .reset              : > RESET, TYPE = DSECT /* not used, */
   .stack              : > RAMGS0_4

#if defined(__TI_EABI__)
   .init_array      : > FW_IMAGE_0 | FW_IMAGE_1, ALIGN(8)
   .bss             : > RAMLS0_2
   .bss:output      : > RAMLS3
   .bss:cio         : > RAMLS0_2
   .data            : > RAMLS0_2
   .sysmem          : > RAMLS0_2
   /* Initalized sections go in Flash */
   .const           : > FW_IMAGE_0 | FW_IMAGE_1, ALIGN(8)
#else
   .pinit           : > FW_IMAGE, ALIGN(8)
   .ebss            : > RAMLS0_1
   .esysmem         : > RAMLS0_1
   .cio             : > RAMLS0_1
   /* Initalized sections go in Flash */
   .econst          : >> FW_IMAGE, ALIGN(8)
#endif

   MSGRAM_CPU1_TO_CPU2 : > CPU1TOCPU2RAM_0, type=NOINIT
   MSGRAM_CPU2_TO_CPU1 : > CPU2TOCPU1RAM_0, type=NOINIT
   MSGRAM_CPU_TO_CM    : > CPUTOCMRAM_0, type=NOINIT
   MSGRAM_CM_TO_CPU    : > CMTOCPURAM_0, type=NOINIT


  GROUP
   {
       .TI.ramfunc
       {
          -l F2838x_C28x_FlashAPI.lib
       }
   }  LOAD = FW_IMAGE_0,
	  RUN = RAMGS10,
	  LOAD_START(RamfuncsLoadStart),
	  LOAD_SIZE(RamfuncsLoadSize),
	  LOAD_END(RamfuncsLoadEnd),
	  RUN_START(RamfuncsRunStart),
	  RUN_SIZE(RamfuncsRunSize),
	  RUN_END(RamfuncsRunEnd),
	  ALIGN(8)


DataBufferSection : > RAMGS14, ALIGN(8)
}

通过查看生成的.map 文件、我可以看到.data 段已标记为未初始化。

.data 0 0000928e 0000024b UNINITIALIZED
0000928e 00000200 Codec.obj (.data:CRC32_TABLE)
0000948e 00000018 FW_updater.obj (.data)
000094a6 00000018 Sk.obj (.data:sk)
000094be 00000008 Codec.obj (.data:FRAME_HEADER_MAGIC_NUM)
000094c6 00000006 rts2800_fpu64_eabi.lib : exit.c.obj (.data)
000094cc 00000004 Codec.obj (.data:ENCODE_FRAME_HEADER_MAGIC_NUM)
000094d0 00000002 Main_Master_CPU1.obj (.data)
000094d2 00000002 SCIA.obj (.data)
000094d4 00000002 rts2800_fpu64_eabi.lib : _lock.c.obj (.data:_lock)
000094d6 00000002 : _lock.c.obj (.data:_unlock)
000094d8 00000001 HWConfig_cpu1.obj (.data)

在整法中、未初始化的变量是:  

  • 在我同时调试和闪存时正确初始化、从而出现正常行为
  • 当代码从闪存入口点引导并在没有刷写的情况下调试时未初始化、从而导致异常行为。

通过查看其他论坛帖子、我可以看到这一点  -- abi=eabi. 选项对于构建和链接很重要。 此选项适用于我。
此外、链接器还使用--rom_model 选项。

我希望这一点很清楚、有人可以帮助我解决这个问题。

谢谢!

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

    您好!

    您是否 也已在[SELECTION LOGIC]中对 codetstart.asm 进行了编程? 您是否将其构建为3个单独的.outs?

    我注意到一些静态全局变量未初始化、即使在我的代码中已初始化、也填充为0。

    这些变量是 [选择逻辑] 还是 [PARTIIONx]的一部分?

    [报价用户 id="612631" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1395181/tms320f28388d-data-section-contains-uninitialized-data "]

    通过查看生成的.map 文件、我可以看到.data 段已标记为未初始化。

    [报价]

    您还应该在.map 文件中看到复制表信息、其中包含有关初始化哪些段的详细信息。 例如-

    这意味着.data 段将按照表中所述进行初始化、且此复制将由称为部分 c_int00函数的 TI_auto_init 函数完成

    此致、

    Veena.

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

    尊敬的 Veena:
    感谢你的帮助。
    我的问题是、在 codestartbranch.asm 中已注释掉 c_int00。 我从示例项目中复制了该文件、但没有引起注意。