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.

[参考译文] TMS320F2.8384万S:hex2000工具不在128位对齐的地址上拆分内存块

Guru**** 2394295 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1090676/tms320f28384s-hex2000-tool-does-not-split-memory-blocks-at-128-bit-aligned-addresses

部件号:TMS320F2.8384万S
主题中讨论的其他部件: C2000WARE

您好,

我们希望通过SCI8接口将自己编写的闪存应用程序下载到TMS320F2.8384万S CPU1内核,并通过CPU1闪存中的C2000闪存API对闪存应用程序进行编程。 C2000Ware flash_kernel示例项目的基本功能。 请注意,在访问闪存时,闪存API需要一个128[位]对齐的地址,否则闪存编程会导致错误

hex2000工具为我们创建TI启动表格式的二进制文件:

遗憾的是,该二进制文件中的长度信息只有16[位]宽,请参见此处标记为红色的内容:

我们的应用程序固件中有相当大的阵列/结构,这些阵列/结构由.const输出部分初始化:

遗憾的是,hex2000工具能在 128[位]对齐的地址上拆分输出部分.const。 我使用自己编写的PC工具验证了这一点,该工具评估由hex2000工具生成的二进制文件中的闪存地址和长度信息,并将 数据写入文本文件。 请查看引导表二进制代码是如何根据闪存地址和长度信息构建的,特别是包含.const输出部分数据的块6和7:

您可以在映射文件中看到数组c_DriveSpecialCommands[]是与上一张图片中的块号6和7交叉的数组。 该数组声明如下:

extern const struct SpecialCMDList c_DriveSpecialCommands[] init_VAR(=DRV_SPECIAL_commands_table);

因此 ,尝试在地址0x97FFE处对数据进行编程会导致闪存API程序函数出错。

是否有方法指示hex2000工具在128位对齐的地址上拆分输出部分? 如果不是,我们还有什么其他办法来避免这类问题?

 

谢谢!

Inno.(注:

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

    您好Inno,

    这是一个已知问题,将来的版本中将提供大的修复程序。

    现在,您是否可以在链接程序命令文件中将内存段的长度限制为0xFFF0?  这可能需要拆分链接程序命令文件中的内存条目。

    请查看以下网址:  https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/964813/compiler-tms320f28386d-hex2000-output-file-address-not-fit-alignment-128-bits</s>2000 200096.4813万2.8386万2000

    谢谢,此致,
    Vamsi

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

    您好Vamsi:

    首先,非常感谢您的快速回复。 此错误似乎已知已有一年多,开发团队尚未处理。 这一个对我们来说有相当的优先地位…

    但是,我不能肯定你在上面提到的那篇文章中的解决办法是否对我们有帮助。

    首先,请允许我提出一个有关输入部分的问题。 在我们的文件Terminal. c中,我们有几个属于.const输入部分的数组,如s_DriveCommandss_ErrListc_DriveSpecialCommands (您可以在我的第一篇文章的图片中找到这些数组)。 在  链接程序进程中,每个数组是被视为Terminal.obj文件的单独.const输入部分元素,还是 所有数组都被合并为 文件Terminal.obj的一个.const输入部分,并由链接程序作为一个输入部分处理? 当我查看以下网站的图表时,似乎所有数据(阵列,结构等…) 属于输入部分.const的特定文件被视为一个输入部分。 请参阅此处:

    https://software-dl.ti.com/ccs/esd/documents/sdto_cgt_Linker-Command-File-Primer.html#diagram

     

    这对我来说很重要,当我看到George在另一篇帖子( https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/964813/compiler-tms320f28386d-hex2000-output-file-address-not-fit-alignment-128-bits )2000 )中2000中的96.4813万的以下2.8386万以下陈述2000陈述时:

    当输出段对于第一个内存范围来说太大时,将对其进行拆分,并继续分配到第二个内存范围。  分割始终发生在输入部分边界上。  因此,一个功能永远不会被拆分。”

     

    现在让我解释一下为什么我认为我们可能无法使用这种方法,将物理内存分成大小为0xFFF8的块。 如果我查看文件Terminal.c中的所有.const数据,您会发现我们已经超出0xFFF8的总长度。 因此,我在上面提出的问题是,是否所有数组都被视为一个文件的一个输入部分,还是每个数组都被单独考虑。

    但即使是单个数组s_DriveCommands也将超过0xFFF8的大小(它目前的大小为0xF68E),我担心所谓的输入部分边界, 从不拆分的内存,超过0xFFF8大小,因此从不适合建议在链接程序命令文件中实现的那些物理内存块。

    在尝试应用另一篇文章中介绍的变通办法时,我们的阵列相对较大的大小是否可能会导致冲突?

    谢谢!

    Inno.(注:

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

    您好Inno,

    我会请George进一步帮助您。

    谢谢,此致,
    Vamsi

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

    这...

    2000128-bit-align-addresses/4039967#4039967"]因此403.9967万因此,403.9967万,从不会超出单个数组大小的命令/FFAM (因此,其最大值),因此,不会超出其最大值,

    .是一个合理的关切。  您可以使用0xFF8-0xf68e = 0x96a (约2400字)。  所以,也许您永远不会达到极限。  但是,如果您这样做,则链接程序变通办法失败。

    此时,您必须考虑可以对C代码进行的更改,这会导致s_DriveCommands变小。  我猜这是一组结构。  也许结构中的某些字段可以更改为位字段。  或者,也可以将某些字段更改为8位宽的值,这些值是使用文章 使用C28x CPU进行字节访问中所述的技术读取和写入的。  或者,根据这些思路提出其他想法。

    谢谢,此致,

    -George

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

    您好,George,

    它确实是一个结构数组,其中相当大一部分是对串行命令的ASCII描述, 位于该数组中。 因此,这意味着我们必须缩小数组(结构数组)的大小,或者我自己编写一个工具,重新排列*.hex文件内的内存地址/长度/数据信息,以匹配128[bits]对齐。 因此基本上是一个自己的书面"纠正工具"(这有点危险,因为该工具中的每一个错误都会破坏固件映像)。

    我还有两个一般性问题。 第一个问题是关于输入部分。 在我们的源 文件Terminal.c中有几个结构,它们都属于输入部分.const。 链接器根据以下图片从输入部分形成输出部分:

    我的问题是,如果文件中的每个单独数组在上图中代表一个绿色方块(因此,一个.obj文件中可能有多个方块进入同一个OSX输出部分),或者如果所有数组,  哪一个属于 该特定文件的输入部分.const,在 链接程序将其形成到输出部分之前,首先组合到一个公共输入部分.const?

    第二个问题是,您认为TI开发团队需要多长时间才能在即将推出的C2000编译器/工具链版本之一中修复该错误并发布新的hex2000版本?  你能估计一下吗?

    谢谢!

    Inno.(注:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果4.0992万如果以上每个单独的方形图中的一个表示绿色的阵列[引用]

    是的

    如果4.0992万如果所有阵列 都属于 第一个组合的特定输入部分,则属于第一个组合的输入部分[引用一个。

    以下是一种方法。  在链接程序映射文件中对于.const输出部分,您将看到来自文件Terminal.obj的多个输入部分。  一个名为.const:s_DriveCommands,另一个名为.const:s_ErrList等   

    TI开发404.0992万开发团队认为新版本发布需要多长时间[引述其评论]

    请参阅 EXT_EP-1.0175万,此问题针对十六进制实用程序提交的条目。  确保您能够升级到发布中列为Fix的版本之一。  目前的计划是在6月底之前提供所有这些版本。  请理解,这并不是完全保证的,只是当前的计划。

    谢谢,此致,

    -George

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

    您好,George,

    感谢您的解释。 现在一切都很清楚。 我相信我们希望一切都保持不变(因此我们不会使用您建议的变通办法来修改linke命令文件)。

    我开始编写一个C#/.NET工具,它通过*.hex二进制文件检测 任何未对齐的128[位]地址。 我将在*.hex二进制文件中重新排列数据块。

    我要做的是以下(我指 的是我在第一个帖子中的最后一张图片):

    我将 把第6项缩短 6个字。
    我还将 第7项缩短2个字(如果该项内有2个字)。
    我将在块6和块7之间压缩一个新的数据块,其中包含8个字(块7中的块6和块2分别包含6个和2个字)。 当然,我必须修改第6项(减少6项) 和第7项(减少2项)的字句长度。 我还必须 修改块7的地址(增加2)。
    该新数据块的字长度为8,地址为0x97FF8。

    再次感谢您的支持。

    -Inno