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.

[参考译文] TMS320F28379D:了解在链接器命令文件中存在 align (8)时生成的 hex 文件

Guru**** 2558250 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1356714/tms320f28379d-understanding-the-generated-hex-file-when-align-8-present-in-linker-command-file

器件型号:TMS320F28379D

大家好、  

我在28379d 器件上为我的应用生成了 Intel hex 文件。  

链接器命令文件中的段段落如下所示:

SECTIONS
{
   /* Allocate program areas: */
   .cinit              : > FLASHB | FLASHC      PAGE = 0, ALIGN(8)
   .text               : >> FLASHB | FLASHC | FLASHD | FLASHE      PAGE = 0, ALIGN(8)
   codestart           : > APP_START       PAGE = 0, ALIGN(8)
   /* Allocate uninitalized data sections: */
   .stack              : > RAMM1       PAGE = 1
   .switch             : > FLASHB      PAGE = 0, ALIGN(8)
   .reset              : > RESET,      PAGE = 0, TYPE = DSECT /* not used, */

#if defined(__TI_EABI__)
   .init_array         : > FLASHB | FLASHC,       PAGE = 0,       ALIGN(8)
   .bss                : > RAMLS4LS5,       PAGE = 1
   .bss:output         : > RAMLS4LS5,       PAGE = 1
   .bss:cio            : > RAMLS4LS5,       PAGE = 1
   .data               : > RAMLS4LS5,       PAGE = 1
   .sysmem             : > RAMLS4LS5,       PAGE = 1
   /* Initalized sections go in Flash */
   .const              : > FLASHF,       PAGE = 0,       ALIGN(8)
#else
   .pinit              : > FLASHB,       PAGE = 0,       ALIGN(8)
   .ebss               : >> RAMLS4LS5 | RAMGS0 | RAMGS1,    PAGE = 1
   .esysmem            : > RAMLS4LS5,       PAGE = 1
   .cio                : > RAMLS4LS5,       PAGE = 1
   /* Initalized sections go in Flash */
   .econst             : >> FLASHF      PAGE = 0, ALIGN(8)
#endif

//   Filter_RegsFile     : > RAMGS0,	   PAGE = 1

//   SHARERAMGS0		: > RAMGS0,		PAGE = 1
//   SHARERAMGS1		: > RAMGS1,		PAGE = 1
//   SHARERAMGS2		: > RAMGS2,		PAGE = 1
//   ramgs0           : > RAMGS0,     PAGE = 1
//   ramgs1           : > RAMGS1,     PAGE = 1


#ifdef __TI_COMPILER_VERSION__
    #if __TI_COMPILER_VERSION__ >= 15009000
        #if defined(__TI_EABI__)
        GROUP
        {
            .TI.ramfunc
            {
            -l sfra_f32_tmu_eabi.lib   
            }
            ramfuncs
            isrcodefuncs
        }                        LOAD = FLASHD,
                                 RUN = RAMLS0LS1LS2LS3,
                                 LOAD_START(RamfuncsLoadStart),
                                 LOAD_SIZE(RamfuncsLoadSize),
                                 LOAD_END(RamfuncsLoadEnd),
                                 RUN_START(RamfuncsRunStart),
                                 RUN_SIZE(RamfuncsRunSize),
                                 RUN_END(RamfuncsRunEnd),
                                 PAGE = 0, ALIGN(8)
        #else
            .TI.ramfunc : {} LOAD = FLASHD,
                             RUN = RAMLS0LS1LS2LS3,
                             LOAD_START(_RamfuncsLoadStart),
                             LOAD_SIZE(_RamfuncsLoadSize),
                             LOAD_END(_RamfuncsLoadEnd),
                             RUN_START(_RamfuncsRunStart),
                             RUN_SIZE(_RamfuncsRunSize),
                             RUN_END(_RamfuncsRunEnd),
                             PAGE = 0, ALIGN(8)
        #endif
    #else
   ramfuncs            : LOAD = FLASHD,
                         RUN = RAMLS0,
                         LOAD_START(_RamfuncsLoadStart),
                         LOAD_SIZE(_RamfuncsLoadSize),
                         LOAD_END(_RamfuncsLoadEnd),
                         RUN_START(_RamfuncsRunStart),
                         RUN_SIZE(_RamfuncsRunSize),
                         RUN_END(_RamfuncsRunEnd),
                         PAGE = 0, ALIGN(8)
    #endif

#endif

...

}

可以看出、align (8)用于闪存中分配的每个外观。  

我使用十六进制实用程序让 CCS12自动生成十六进制输出、使用 Intel 格式

但是、当我查看生成的 Intel hex 文件时、例如我的 app.hex、它会显示如下所示:

:02000004 0008 F2 (第一行、起始地址的有效值为0x0008)

...

:20 64B6 0076FFE200E200E201E202E203E204E205E206E207E606FE2956290276025600FFE2

因此,根据英特尔格式定义,它表示从地址000864B6开始, 十六进制图像数据是76 ... 等等

地址000864B6位于闪存段 D 中。通常、该起始地址不与128位边界对齐。 但我要确保将 FLASHD 设置为在.cmd 文件中的所有位置对齐(8)。

根据 spnu629a 文档、

我的理解是对于 align (4 )或(8)、闪存段中的内容应分别与64位或128位段对齐、即对于 align (8)、生成的映像十六进制的地址应始终从闪存中的 xxx8或 xxx0开始。 但基于这一点,我怀疑我的理解。  

您能就我遗漏的内容提供一些建议吗? 或者、是否有办法强制生成的十六进制文件始终从 xxx8 / xxx0开始、即128位对齐、以简化闪存操作。

感谢您的帮助。

此致、

魏  

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

    您好!

    我会提请编译器专家注意该主题。 他们将能够进一步提供帮助。

    谢谢

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

    Intel 格式十六进制输出中的每一行都包含该行上的数据地址。  但这并不意味着这条线对应于段的开头。  实际上、十六进制输出中只有几行对应于段的开头。  其余的不是。

    若要查看每个段的起始地址、请检查链接器映射文件。

    是否有办法强制生成的 hex 文件始终从 xxx8/xxx0开始,为128位对齐

    否。  这篇文章说明了为什么没有必要这样做。

    谢谢。此致、

    -乔治

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

    我同意十六进制中只有几行对应于显而易见的段开头。

    我想我在票证中的观察结果是、在 Intel 十六进制输出中、大部分行起始地址是128位对齐的、wihich 说、它从 xxx8或 xxx0地址开始、但并不总是如此。  

    对于从非128位对齐地址开始的行、如果仔细查看存储器映射、可以看出存储器实际上没有中断、这让我对其产生了一个疑问。

    下面的一些图片可以更好地说明:

    英特尔十六进制文件中的行:

    实际上、所有行从行1到我突出显示的行(64B6)之上的行、它们的起始地址都是 xxx0 (或者 xxx8、在某些情况下无法在这里显示)。 在 第695行中、它具有一个起始地址64B6、该地址不是128位对齐的。

    相应的此地址上的存储器映射为:

     

    显然,在这里的记忆中没有不忠之处。

    我相信英特尔十六进制有一定的原因或规则、这可能远远超出了我处理应用程序所需要的知识。 我只是想知道为什么英特尔 hex 文件生成器必须这样做--考虑到 hex 文件是描述内存映射,有不同的选项可以这样做。 在这种情况下、为什么生成器选择"使64B0行不为满、同时故意启动一条从64B6开始的新行、继续将十六进制数置于后面"、即使 memoy 映射没有间断性。 为什么不只是"将64B0放入一个完整的十六进制数行、并继续在64C0"、因为上面的行通常遵循此模式。

    期待得到进一步的建议。

    此致、

    魏  

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

    在下一篇文章中附加链接器映射文件、而不是屏幕截图。  请在论坛中添加文件扩展名 .txt 反馈回路。

    谢谢。此致、

    -乔治