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:有关使用 ARM 十六进制实用程序生成固件的问题

Guru**** 2595805 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1118136/tms320f28388d-an-issue-regarding-generating-a-firmware-using-arm-hex-utility

器件型号:TMS320F28388D

您好!

我正在使用 controlCARD 板(TMDCNCD28388D)。 我正在尝试使用 ARM 十六进制实用程序生成固件的十六进制格式。 然后、我使用自己开发的另一个固件将生成的十六进制文件加载到 CM 内核的闪存中。 但是、在加载固件并重新启动内核后、新固件将无法成功运行。 为了弄清这一点、我将十六进制文件内容与 JTAG 生成并加载到闪存中的实际固件进行了比较。 我发现除了某些特定位置外、几乎所有这两个内容都是相同的。 因此、我尝试更改十六进制实用程序生成的固件、并使其与 JTAG 生成的固件类似。 这样、在闪存上加载固件后、固件成功执行、一切正常。 不过,我可以找出这一问题的根本原因是什么。 但是、我发现这两个文件中有两个差异、可能有助于找到解决方案。 我在这里详细介绍 了这两种差异。 如果有人能帮助我解决这个问题、我将不胜感激。

1 -十六进制实用程序生成的固件中有6个额外字节、大小为0xFFFF、而 JTAG 生成的固件中的同一个块中不存在这6个字节。 在下图中、我突出显示了十六进制实用程序生成的额外6个字节。 这张图片是一个大小为0xFFFF 的块末尾的快照。

此外、我在下图中展示了 CM 的存储器映射、其中加载了由 JTAG 生成的同一固件块。 这张图片是我在上图中展示的同一块末尾的快照。

2-由 JTAG 生成的固件中的最后一个字节为"1F"、而十六进制实用程序生成的固件中的最后一个字节(我是指这些额外6个字节之前的最后一个字节)为"00"。

老实说、我不知道这些结束字节的含义。 所以、我只是尝试找到一个解决方案。 因此、我尝试更改十六进制实用程序生成的固件、并使其与 JTAG 生成的固件相同。

另外、作为另一个观察结果、我应该提到、当我尝试生成一个小尺寸固件时、例如其大小小于闪存扇区、一切都正常。 例如、当我使用十六进制实用程序生成 LED_blinky 示例时、生成的文件与 JTAG 生成的文件相同。 但是、当我尝试生成一个大尺寸固件时、如果是~170KB、则会将其放置在闪存的多个扇区上、这将会发生此问题。 如果有人能够解释为什么会发生这种情况、我将不胜感激。

此致、
Alex

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

    您好!

    我还附加了用于生成固件的配置(通过使用十六进制实用程序)。 我认为这可能会有所帮助。 但是、请记住、此配置适用于 LED_blinky 等小尺寸固件。

    最棒的

    Alex

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

    我没有完全按照你的解释。  但是、您可能遇到 了此论坛主题中描述的问题。  如果您认为您的情况相同、请告诉我。

    谢谢、此致、

    乔治

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

    尊敬的乔治:

    感谢你的答复。 我查看了您发送的论坛主题。 我 认为 这不是我的情况。 因为我能够使用闪存 API 写入整个固件(由 ARM 十六进制实用程序生成)。 这表明我没有这个线程中提到的对齐问题。

    [引用 userid="4373" URL"~/support/microcontrollers/C2000-microcontrollers-group/C2000/f/C2000-microcontrollers-forum/1118136/tms320f28388d-an-issue-regarding-generating-a-firmware-using-arm-hex-utility/4144799#4144799"]我不会完全按照您的解释[引用/引用]。

    让我以这种方式解释一下。  我有一个 CCS 工程、并使用 ARM 十六进制实用程序生成十六进制文件。 然后、我使用闪存 API 成功地将生成的十六进制文件加载到 CM 内核的闪存中。 但是、加载固件后、当我重新启动 CM 内核时、固件将无法成功运行。 但是、正如我之前提到的、当我在 CCS 中编译我的项目并使用 JTAG 将其加载到闪存上时、它会成功工作。

    在浏览 ARM 十六进制实用程序生成的十六进制文件后、我发现十六进制文件(由 ARM 十六进制实用程序生成)的内容与 JTAG 加载的固件之间存在一些差异。 我在第一篇帖子中解释了这些差异。 我希望能够清楚地解释我的问题。

    最棒的

    Alex

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

    Alex、

    我们很快就会回来。

    此致、

    Vivek Singh

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

    您好、Vivek、

    当然。 感谢您的告知。 我会等你。

    最棒的

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="475471" URL"~/support/microrims/C2000-microrims-group/C2000/f/C2000-microrims-forum/1118136/tms320f28388d-an-issue-regarding-generating-a-firmware-using-arm-hex-utility"时、当我使用十六进制实用程序生成 LED_blinky 示例时、JTAG 生成的文件与十六进制实用程序生成的文件相同。 但是、当我尝试生成一个大尺寸固件时、如果是~170KB、则会将其放置在闪存存储器的多个扇区上、则会发生此问题。[/引用]

    在大尺寸固件中、是否有比0xfffe 字大的段?

    谢谢、此致、

    乔治

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

    是的、有两个大小为0xFFFF 的段。 它们在0x00210000 (SECTOR4的开头)和 0x00220000 (SECTOR5的开头)上加载。

    最棒的

    Alex

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

    那么、很可能会受到 EXT_EP-10175的影响。  请升级到 C2000代码生成工具版本22.6.0.LTS、并使用新的十六进制实用程序选项 -boot_align_sect.  我不能保证这会解决问题。  但我认为这很可能。

    谢谢、此致、

    乔治

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

    哎呀!  您使用的是 C28x 器件、但我忽略了您为该器件上的 ARM CPU 内核构建的事实。  请忽略我的上一个帖子。

    您仍有可能受到 EXT_EP-10175的影响。 但是、没有任何版本的 ARM 代码生成工具实施此修复。  作为一个实验、您是否可以通过某种方式将大段的大小减小到小于0xFFe?

    谢谢、此致、

    乔治

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

    感谢您的回复、George。

    [~ userid="4373" URL"/support/microcontrollers/C2000-microcontrollers-group/C2000/f/C2000-microcontrollers-forum/1118136/tms320f28388d-an-issue-regarding-generating-a-firmware-using-arm-hex-utility/4150787#4150787"]

    作为一个实验、您是否可以通过某种方式将大段的大小减小到小于0xFFe?

    [/报价]

    在"large sections "中、您是指.cmd 文件中闪存存储器的扇区吗? 如果是、我 将 .cmd 文件中这些扇区的大小减小为随机值、例如0xFF00、如下图所示:

    虽然这对于这些扇区来说很有效、但当我将固件更改为闪存中的其他位置时、它不起作用。 例如、当我将固件的位置从 SECTOR7-SECTOR9更改为 SECTOR3-SECTOR5时、它不起作用。 下图中突出显示的行是我刚才提到的更改。

    在"大部分"中、如果您指的是其他内容、请向我解释我到底应该更改什么?

    最棒的

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="4373" URL"~/support/microcontrollers/C2000-microcontrollers-group/C2000/f/C2000-microcontrollers-forume/1118136/tms320f28388d-an-issue-regarding-generating-a-firmware-using-arm-hex-utility/4150787#4150787"]您仍然可能会受到 EXT_EP-10175[]的影响

    我还看了这个链接。 我认为这就像你之前提到的论坛主题、我认为这不是我的情况。 因为、如果我的问题是"段对齐"、那么我将无法在闪存上写入固件、并且我应该从闪存 API 函数接收到一个错误。 而我可以完全成功地将整个固件放在闪存上。 但是、我的实际问题是、在成功加载闪存上的固件并重新启动 CM 内核后、固件无法成功运行。  我是对的、还是缺少什么?

    如果您能解释此链接与我的问题的关系、我将不胜感激。

    最棒的

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="475471" URL"~/support/microcontrollers/C2000-microcontrollers-group/C2000/f/C2000-microcontrollers-forum/1118136/tms320f28388d-an-issue-regarding-generating-a-firmware-using-arm-hex-utility/4150904#4150904"]我的问题实际上是在加载闪存和重新启动固件后无法成功运行[引用]

    可能会显示固件已成功加载到闪存中。  但是、因为它没有运行、它真的是吗?

    我注意到您使用 armhex 选项--boot。  假设这意味着您使用引导加载程序、并且您需要 armhex 以引导加载程序所需的格式来布置代码和数据。   EXT_EP-10175 是关于与此用例相关的 armhex 问题。   

    当您使用 CCS 加载程序(通过菜单命令 Run | Load | Load Program 或类似命令)时、不会使用引导加载程序。  这是一种将程序导入系统的非常不同的方法。   

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="475471" URL"~/support/microcontrollers/C2000-microcontrollers-group/C2000/f/C2000-microcontrollers-forume/1118136/tms320f28388d-an-issue-regarding-generating-a-firmware-using-arm-hex-utility/4150896#4150896"]通过"引用闪存的大部分、您是否引用.cmd 文件中的大部分?]

    不。 我将更仔细地定义术语。  请阅读文章 链接器命令文件入门的第一部分。  重点了解术语 输入部分、 输出部分和 存储器范围。  在我之前的所有帖子中、当我使用术语 部分时、我指 的是输出部分。   

    那么、是否有任何输出段大于0xFFe?  如果是这样、作为一个实验、请删除它们的一些内容、使它们更小。  看看这种更改是否修复了问题。  本实验可能不切实际。  但如果是、这是一种查看我的猜测是否正确的简单方法。

    谢谢、此致、

    乔治