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.

[参考译文] MSPM0L1305:将链接器中的闪存来源更改为0x2000、需要.intvec 具有 palign (8)、为什么?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1229394/mspm0l1305-changed-flash-memory-origin-to-0x2000-in-linker-requires-intvec-to-have-palign-8-why

器件型号:MSPM0L1305
主题中讨论的其他器件:UNIFLASH

您好!

我有一个测试应用、我想在闪存中从0x2000开始、而不是从默认的0x0000开始(我有一个在0x0000处运行的引导加载程序、然后跳转到 应用程序代码)。  我 从 TI 示例中获取了提供的链接器文件、将闪存来源从0x0000000更 改为0x00002000、并将".intvecs :> 0x00000000"更改为".intvecs:> 0x00002000"。

当我在 Code Composer Studio 中通过调试器(而不是 Theia)进行测试时、一切都运行正常(我先加载应用程序、然后加载引导加载程序、而不擦除闪存、我可以调试)。   后来、我启用了导出二进制文件的选项、这使用 tiarmhex.exe 实用程序从.out 文件创建.bin。  使用 Uniflash 在地址0x2000中加载此应用程序二进制文件(并将引导加载程序二进制文件加载到0x0000)不起作用!

因此、使用.out 文件(即 CCS 调试器的功能)加载固件可以正常工作、但加载生成的.bin 不能正常工作。  我使用.out 文件在器件上加载了固件、然后使用 Uniflash 将闪存内容读回文件中(我将其称为"导出的二进制文件")。  当我将这个导出的二进制文件与 tiarmhex.exe 生成的二进制文件进行比较时、我看到唯一的区别是、在导出的映像中、.text 段似乎从0x20e8开始(在8字节边界上)、而在生成的二进制文件中、它从0x20e4开始。  (.text 是.intvecs 之后的段) 这会导致所有函数调用 被一个32位指令或两个16位 Thumb 指令偏移。

在查看由 CCS 生成的.map 文件时、可以看到.text 从 000020e8开始、这符合预期。  另外、在链接器(.cmd)文件中、我有".text  :palign (8){}> flash"。   TIArmClang 文档 指出 palign (n)会告知链接器将段的起始地址和结束地址边界放置在 n 个字节。  因此这里似乎存在错误或不准确、因为一旦我将闪存和.intvecs 原点从0x0000更改为0x2000、tiarmhex.exe 就无法真正在8字节边界上启动.text。

我可以通过将".intvecs:> 0x00002000"更改为".intvecs:palign (8)> 0x00002000"、使 tiarmhex.exe 输出正确的二进制文件(其中.text 从000020e8开始 、一切正常)。  然而,文件似乎意味着这应该是不必要的。  下面我来回答这些问题:

  1. 当我将闪存原点设置为0x2000时、如果闪存原点不存在或当闪存原点设置为0x0000时、为什么需要 palign (8)?  换句话说、为什么 .intvecs 之后的段中的 palign (8)不 够用?  这是一个错误或预期行为吗?
  2. 我可以继续使用我现在拥有的链接器吗?  
  3. 为什么所有这些段都是8字节对齐的、而不是4字节(32位)对齐?  它毕竟是一个32位处理器。  我正在努力提高我在这里的有限知识。

此致、

查理


e2e.ti.com/.../mspm0l1305.cmd.txt

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

    这取决于我们的闪存操作、mspm0闪存会一次写入8个 字节、因此我们建议将映像文件对齐为8个字节对齐。

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

    Gary、

    好的、这回答了我的第三个问题、谢谢。   那么问题1和问题2呢?

    谢谢
    查理

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

    我想与我们需要一次写入8个字节的答案相同、因此我们将使用的所有存储器保持为8个字节对齐、这些字节将包括中断表。

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

    Gary、

    我重新表述问题1。  中断表已采用8字节对齐方式、无需添加 palign (因为0x2000可被8整除)。  问题是.text 段没有对齐,即使我一直有".text  : palign (8){}> flash"。  TI 文档中说明 palign (n)会强制某个段在 n 字节边界上开始和结束、因此、第46行中的 palign (8)应始终强制.text 在8字节边界处开始。   以前、当 FLASH origin 和.intvecs origin 位于0x0000时、.text 段是8字节对齐的、因此我认为当我将其更改为0x2000时、应该仍然是8字节对齐的。

    将 palign (8)添加到第45行会导致.text 再次按8字节对齐、但这似乎更像是一种权变措施或黑客行为、并且运行方式与文档中预期的情况相反。  同样、从文档中可以看到、我希望第46行中的 palign (8)总是足以强制.text 在8字节边界处开始、无需将其添加到第45行中、因为我将.intvecs 和 FLASH origin 从0x0000更改为0x2000。

    编辑:正如我之前提到的,这个明显的"错误"只会在我使用-- binary 选项调用 tiarmhex.exe 以生成二进制文件时出现。  映射文件似乎总是正确的、这似乎表明 tiarmhex.exe 解释链接器文件的方式存在错误(或未记录的差异、如果您愿意的话)。

    查理

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    ,它使用 tiarmhex.exe 实用程序从.out 文件创建.bin

    CCS 支持来直接生成 bin 文件、为什么需要使用此工具?

    [quote userid="462579" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1229394/mspm0l1305-changed-flash-memory-origin-to-0x2000-in-linker-requires-intvec-to-have-palign-8-why 通过生成的二进制文件,从0x20e4开始

    0x20e4未采用8字节对齐方式、我认为  tiarmhex.exe 生成 bin 文件的操作应该有一些问题。 因此、我建议使用 CCS 内部工具来生成 bin 文件。

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

    CCS 支持来直接生成 bin 文件、为什么需要使用此工具?

    因此我建议使用 CCS 内部工具来生成 bin 文件。

    "内部工具"是什么意思?  在 CCS 中、我转至工程 属性、然后选择"Build">"Arm Hex Utility"->"Output Format Options"->"Output Format"->"select --binary"。  使用此设置时、 CCS 只需使用此选项调用 tiarmhex.exe。  我有一个单独的脚本、这个脚本使用 CCS 使用的完全一样的选项来调用 tiarmhex.exe。  我这样做是因为 CCS 只给我选择一种格式的选项、但我希望自动生成多个格式(Intel 和二进制)。  我使用的命令选项与 CCS 使用的二进制设置完全相同、结果完全相同。

    请告诉我、这是您所说的"内部工具"、还是您所说的其他内容。  我也遇到了一些与--intel (hex)选项相关的问题,但这可能是以后的主题。

    谢谢。

    查理

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

    您是否曾尝试生成易于查看地址和数据的 TI_TXT 格式文件? 您可以帮助提供能够重现此问题的项目吗? 我想先在 myside 重复出现此问题。

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

    Gary、

    很抱歉延迟、我一直在努力重现并在最后修复此问题。  我已经确定了我们在代码中所做的与默认项目不同的更改。  我们有一些特别希望存储在.intvecs 段之后的数据字节。  数据 位于不是8字节倍数的结构中。  我找到了修改.cmd 链接器文件的另一种解决方案、即在结构体的末尾添加一个空的 uint32_t 变量、以便将数据填充为8个字节的倍数。

    再次、仅当闪存来源更改为0x2000并且仅在生成.bin 文件时、才会出现此问题。  我仍然认为.cmd 文件的.text 段中的 palign (8)关键字会阻止这种情况的出现。  不管怎样、我已经测试了上述备选解决方案、我们将继续采用该解决方案。

    此致、

    查理