器件型号: TMS320F28375S
TI 团队大家好、
我正在开发一个具有双闪存组(闪存组 0 和闪存组 1)和自定义 CAN 引导加载程序的 C2000 器件。 我试图了解观察到的与链接器地址和闪存执行相关的行为、该行为似乎与常见指导有所不同。
我的应用程序从地址 0x088000(闪存组 0)开始链接闪存。 根据该构建结果、我生成一个 TI-TXT 文件。 刷写到闪存组 0 时、我的引导加载程序会按照生成的内容完全对 TI-TXT 文件进行编程。 当将同一应用程序刷写到闪存组 1 时、在读取文件时、我会在将其编程到闪存之前为每个地址添加一个固定偏移 0x40000。 这样、相同的应用映像存在于两个具有相同内部布局的组中、仅偏移了恒定值。 表示一个代码从 0x88000 到末尾(闪存存储体 0)、相同的代码从 0xc8000 到末尾(闪存存储体 1)。
在引导时、引导加载程序选择活动组并跳转到该组中的相应应用程序入口点。 即使应用程序仅针对 0x088000 闪存地址进行链接、并且没有实施明确的运行时重定位逻辑、该应用程序也能从闪存组 0 和闪存组 1 正确运行。
在大型应用中可以观察到这种行为、且不限于简单的测试用例。 该应用使用 PIE 和多个中断、包含切换实例语句、使用 Driverlib、并且从任一闪存组正常运行、不会发生崩溃或不正确的行为。
从一般 C2000 文档和 LFU 示例中、通常会指出、应用程序应专门链接它们执行的闪存地址、并且从不同的闪存组运行时、需要单独的链接器文件或重定位逻辑。 根据这一指导、我预计这种方法在从闪存组 1 运行时会失败、但在实践中它运行可靠。
我想澄清一下 C2000 器件上是否会出现这种行为。 如果不是、在什么具体条件下、这种方法会失败? 这种做法被认为是不受支持的、但实际上是可行的、还是正式不鼓励? 此外、是否有可能导致此行为意外中断的编译器选项或未来工具链更改?
我正在尝试了解这种做法在实践中发挥作用的建筑原因,以及在适当的限制下依赖是否安全。
我将连接链接器文件 FYR.2837xS_FLASH_CLA_lnk_cpu1.zip
感谢您抽出宝贵的时间提供指导。