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.

[参考译文] TMS570LS0432:应用固件的自定义引导加载程序

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/590226/tms570ls0432-custom-bootloader-to-application-firmware

器件型号:TMS570LS0432

您好!

从引导加载程序跳过之后、我在使应用程序固件运行方面遇到了困难。 我已经阅读了几个主题、但无法解决我的问题。 我希望您能帮助我解决这个问题。  

引导加载程序映射到0x00000000、应用程序固件映射到0x00040000。

目前、我的应用固件不会将 Fapi 移动到 RAM、应用程序的.intvecs 被放置在0x00040000、应用程序固件被放置在0x00040020。 该应用程序在0x00040000从引导加载程序调用并运行调试器、在引导加载程序的 prefetchEntry (0x0000001C)结束。

引导加载程序和应用程序固件都使用了 Fapi。 两段代码是否都应将 Fapi 移动到 RAM?

2.两段代码能否共享相同的.intvecs? 或者应用程序应该在应用程序之前放置.intvecs (即.intvecs 应该位于0x00040000、应用程序应该移到0x00040020?) 如果应用程序要映射其自己的.intvecs、在跳转到应用程序之前、我是否需要执行任何操作?

提前感谢!

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

    您好 Gustavo、

    到 Ox40000的跳转距离很远。 您是否尝试过较小的分支机构来查看这是否有用? 我认为我们的引导加载程序应用手册中提供的示例和示例代码使用0x20000。 对于该器件、即使是0x20000也相当大。 为了方便 FAPI 操作、您应该将跳转对齐到扇区边界。 前12个扇区是8k 扇区、允许跳转地址是0x2000到0x16000之间的任何0x2000地址。 执行跳转时、请确保您保持运行模式、即 ARM 或 Thumb 模式。 Hercules 器件通常在复位时默认为 ARM 模式、因此这不是问题。  

    [引用用户="Gustavo Del Valle"]2. 这两段代码能否共享相同的.intvecs? 或者应用程序应该在应用程序之前放置.intvecs (即.intvecs 应该位于0x00040000、应用程序应该移到0x00040020?) 如果应用程序要映射其自己的.intvecs、在跳转到应用程序之前、我是否需要执行任何操作?

    中断矢量表必须位于0x0000000。 引导加载程序用户指南(下面的 SPI UG 除外)概述了如何使用引导加载程序来解决中断问题。

    以下是 LS0432 3种不同引导加载程序实现方案的一些链接:

    适用于 Hercules TMS570LS04X MCU 的 SPI 引导加载程序

    用于 Hercules TMS570LS04X MCU 的 UART 引导加载程序

    适用于 TMS570LS04X MCU 的 CAN 总线引导加载程序

    [引用用户="Gustavo Del Valle"]1. 引导加载程序和应用程序固件都使用了 Fapi。 两段代码是否都应将 Fapi 移动到 RAM?

    是的、两者可以共享相同的 FAPI 实例、但鉴于您可能希望定期更新器件上的 FAPI、并且您可能希望使用最新和最优秀的编程、您可以选择以不同的方式实现某个位。

    首先、您可能希望使引导加载程序 FAPI 独立、这样 FAPI 就会通过所选的串行协议加载到 RAM 中。 即、您连接、将 FAPI 下载到 RAM、并跳转到它以执行写入/擦除操作和传入数据的流控制。 通过这种方式、引导加载程序是一个简单的命令界面、无需 FAPI 和数据管理代码。 增益是引导加载程序的大小效率、在有人学习如何进入引导加载程序时的安全性、以及独立于器件更新程序加载/擦除目标代码的能力。

    另一种选择是在闪存中使用 FAPI。 应用程序和引导加载程序之间的共享实际上取决于您的系统要求。 引导加载程序和应用程序在通用代码上相互依赖可能是一个安全问题、也可能会使编程变得更加复杂。 即、如果 FAPI 是引导代码的一部分、则必须访问应用程序运行时间的引导部分、从而使 MPU 设置难以将应用程序与引导加载程序隔离。 如果 FAPI 存储在应用区域中、同样、从安全的角度来看、这也是两个操作隔离的问题。

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

    感谢您的回答。 这就是所发生的情况-固件将调用引导加载程序 API 函数、而这正是问题所在。

    我能够通过引导加载程序正确运行固件、方法是在闪存中为 FAPI 库创建单独的段、并为 API 提供接口代码。 引导加载程序和固件中的接口代码大小相同。 现在、根据运行的代码、其接口代码将加载到 LIKER 文件分配的指定 RAM 部分。

    不过,我还有另一个问题。 我将在编译后处理部分中使用以下行来创建.bin 文件:

    "${CCS_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin.bat ""${BuildArtiftFileName}""${BuildArtifactFileBaseName}.bin""${CG_TOOL_ROOT}/bin/armofd.exe ""${CG_TOOL_ROOT}/bin/armhex.exe ""${CCS_INSTALL_ROOT}/utils/tiobj2bin/mkhex4bin.exe

    但是、这会将.out 转换为.bin、是否可以确定闪存的特定段以从.out 文件转换为.bin? 如果情况不是这样,我如何去做呢? 目前、我正在使用固件所在的特定存储器范围将微控制器中的闪存保存到.bin 文件中。 这需要很长时间、如果我可以在 CCS 中执行此操作、那将非常有用。

    谢谢、

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

    您好 Gustavo、

    这是一个相对简单的修复。 只需修改连接器命令文件中闪存启动的闪存存储器定义。 请参阅下面的 CAN 引导加载程序应用手册(第10节)中的代码段 、此代码段与本主题前面的内容相关联。

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

    感谢您的所有支持。 现在一切都按预期工作。

    谢谢、

    Gustavo Del Valle