主题中讨论的其他器件: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开始 、一切正常)。 然而,文件似乎意味着这应该是不必要的。 下面我来回答这些问题:
- 当我将闪存原点设置为0x2000时、如果闪存原点不存在或当闪存原点设置为0x0000时、为什么需要 palign (8)? 换句话说、为什么 .intvecs 之后的段中的 palign (8)不 够用? 这是一个错误或预期行为吗?
- 我可以继续使用我现在拥有的链接器吗?
- 为什么所有这些段都是8字节对齐的、而不是4字节(32位)对齐? 它毕竟是一个32位处理器。 我正在努力提高我在这里的有限知识。
此致、
查理