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.

[参考译文] TMS570LS1224:CAN 引导加载程序应用:将应用程序闪存代码移动到 RAM 时出现问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1370978/tms570ls1224-can-bootloader-application-problem-moving-application-flash-code-to-ram

器件型号:TMS570LS1224
主题中讨论的其他器件:HALCOGEN

工具与软件:

您好!

我们希望支持使用 CAN 引导加载程序进行固件升级。 因此、应可以通过引导加载程序和应用程序访问位置0x10000处的固件状态字段。

根据引导加载程序演示、我成功实现了以下功能:

引导加载程序:

-闪存上 ECC 的 halcogen 标志关闭。

- bl_link.cmd 负责 ECC

-位于闪存位置0x10000的固件升级状态标志

应用:

-闪存上 ECC 的 halcogen 标志关闭。

- sys_link.cmd 负责 ECC

-应用程序从0x10020开始

当应用程序代码都从闪存运行时、应用程序会正常运行、但访问固件状态字段会导致应用程序崩溃。

因此、从其他论坛帖子中、我知道我需要将闪存驱动程序移至 RAM。
我仅将 Fapi_Update 70uusProgram 函数复制到单独的 bl_flash.c fil 中、与引导加载程序所做的类似。
然后、我使用以下链接器文件将代码移动到 RAM 中:

--retain="*(.intvecs)"

/*用户代码 begin (1)*/
/*用户代码结束*/

/*------------------ */
/*内存映射                                                                */

小程序

   VECTORS (X) : origin=0x00010020 length=0x00000020 fill=0xFFFFFFFF
   FLASH0 (RX):origin=0x00010040 length=0x0012FFC0 fill=0xFFFFFFFF
   堆栈 (RW):origin=0x08000000 length=0x00002000
   RAM    (RW):origin=0x08002000 length=0x0002D000

/*用户代码 begin (2)*/
#if 1.
   ECC_VEC (R):origin=(0xf0400000 +(start (vectors)>> 3))
                  长度=(大小(矢量)>> 3)
                  ecc={algoL2R5F021、input_range=vectors}

   ECC_FLA0 (R):origin=(0xf0400000 +(start (FLASH0) >> 3))
                  长度=(SIZE (FLASH0) >> 3)
                  ECC={ALGORIGGER=Algorithm2R5F021、INPUT_RANGE=FLASH0}
#endif
/*用户代码结束*/
}

/*用户代码 begin (3)*/
ECC

   algoL2R5F021:address_mask = 0xfffff8 /*地址位31:3 */
                  Hamming_mask = R4        /*使用 R4/R5构建在掩码中*/
                  parity_mask = 0x0c      /*设置哪些 ECC 位为偶数和奇数奇偶校验*/
                  镜像   = F021      /* RM57Lx 和 TMS570LCx 是在 F021中构建的*/
}
/*用户代码结束*/

/*------------------ */
/*段配置                                                     */

部分中)

   .intvecs :{}>向量
#if 1.
   闪存 API:
     {
    .\HALCoGen\source\5280edFunctions.obj Fapi_User (.text、.data)
    .\HALCoGen\source\bl_flash.obj (.text、.data)
    --library="c:\ti\Hercules\F021 Flash API\02.01.01\F021_API_CortexR4_Be.lib"(.text、.data)
     }palign = 8 load = FLASH0、run = RAM、load_start (apiLoadStart)、run_start (apiRunStart)、size (apiLoadSize)
#endif
  .text :{}> FLASH0 /*初始化的可执行代码和常量*/
#if 1.
  .const:{}palign=8 load=FLASH0、run = RAM、load_start (constLoadStart)、run_start (constRunStart)、size (constLoadSize)
#endif

  .cinit :{}> FLASH0 /*初始化的全局和静态变量*/
  .pinit :{}> FLASH0
  .data :{}>RAM.
  bss  :{}> RAM  /*未初始化的全局变量和静态变量*/
  .sysmem :{}> RAM.
   
   FEE_TEXT_SECTION :{}> FLASH0
   FEE_CONST_SECTION :{}> FLASH0
   FEE_DATA_SECTION :{}>RAM.

/*用户代码 begin (4)*/
/*用户代码结束*/
}

登录到 sys_main 中。 添加了 C I:

extern unsigned int apiLoadStart;
   extern unsigned int apiLoadSize;
   extern unsigned int apiRunStart;

   extern unsigned int constLoadStart;
   extern unsigned int constLoadSize;
   extern unsigned int constRunStart;


   /*将闪存 API 复制到 SRAM*/
   //_copyAPI2RAM_(&apiLoadStart、&apiRunStart、&apiLoadSize);
   memcpy (&apiRunStart、&apiLoadStart、(UINT32)&apiLoadSize);

   /*复制.const 段*/
   //_copyAPI2RAM_(&constLoadStart、&constRunStart、&constLoadSize);
   memcpy (&constRunStart、&constLoadStart、(UINT32)&constLoadSize);

在 XL2-TLS57012板上、固件升级后红色 LED 会亮起。

对于将代码从闪存移至 RAM 时出现什么问题、有什么想法吗?

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

    尊敬的 Geert Jacobs:

    [quote userid="341958" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1370978/tms570ls1224-can-bootloader-application-problem-moving-application-flash-code-to-ram 当应用程序代码全部从闪存运行时、应用程序运行、但访问固件状态字段时应用程序崩溃。

    我认为、读取固件状态字段不会导致应用崩溃。 尝试擦除或写入都将导致应用程序崩溃。 您在这里到底要做什么、您访问的意思是什么?

    [报价 userid="341958" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1370978/tms570ls1224-can-bootloader-application-problem-moving-application-flash-code-to-ram 从其它论坛帖子我知道我需要将闪存驱动程序移至 RAM.[/QUOT]

    [常见问题解答] TMS570LC4357:适用于 Hercules 控制器的示例和演示(例如 TMS570x、RM57x 和 RM46x 等)-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    可以参考上面常见问题解答中的以下重点示例。

    该控制器也只有一个存储库、因此在本例中、我将把 FAPI 库复制到 RAM 中、并从 RAM 中对该存储库执行擦除和写入操作。

    ——
    谢谢、此致、
    Jagadish。

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

    闪存中运行映像时、读取操作正常

    写入方式 与 引导加载程序崩溃应用程序的方式相同。

    从类似的论坛帖子中、我知道闪存驱动程序代码需要移至 RAM 中。
    我正在尝试这样做、但我的映像在升级后似乎没有开始。 升级后、XL2-TMS570板会显示一个红色 LED。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    以 与 引导加载程序崩溃应用程序相同的方式进行写入。

    是的、写入操作会使应用程序崩溃。 由于该器件具有单个存储体、因此如果您尝试在同一存储体上执行代码和写入、应用程序将崩溃。

    所以、您应该需要从 RAM 中执行闪存库。 请参阅我给出的示例。

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

    您好!

    我将 RM46示例移植到了 TMS570、并添加了一些 LED 闪烁以指示应用程序不会挂起。
    如果 我从地址0运行示例(不存在引导加载程序)、则会起作用。
    如果我在 sys_link.cmd 文件中使用 ECC 设置从地址0运行示例、那么这个示例将有效。
    但是、如果我将应用程序位置更改为从 sys_link.cmd 中的地址10020开始工作、以便使用引导加载程序、那么在使用引导加载程序升级后、它不会开始。 与我的应用程序一样。

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

    您好!

    [报价 userid="341958" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1370978/tms570ls1224-can-bootloader-application-problem-moving-application-flash-code-to-ram/5240457 #5240457"]但是、如果我为了使用引导加载程序而将应用程序位置更改为从 sys_link.cmd 中的地址10020开始工作、则使用引导加载程序进行升级后该应用程序不会开始。 与我的应用程序相同的问题。

    确保引导加载程序正确调用应用程序。

    您可以采用一种方式调试代码。

    1.首先将引导加载程序代码编程到闪存中。 确保启用了下面突出显示的行、这将有助于在不验证单一的情况下调用应用程序。

    2.现在调试应用程序项目,确保应用程序设置为"仅必要扇区"。 对于引导加载程序、您可以将"Entire Flash"(整个闪存)

    3.进入调试模式后,您可以从应用代码进行重置,并验证应用是否正常执行。

    ——
    谢谢、此致、
    Jagadish。

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

    您好!

    -使用调试程序对修改后的引导加载程序进行编程。  

    - 在调试配置中重建 TMS570应用程序,只加载必要的扇区:应用程序在调试模式下运行(LED 闪烁)

    -拔下 XL2-TMS570板上的 USB (电源)并重新插入。 (不存在调试。)
    预期修改后的引导加载程序将启动并调用应用程序。 没有 LED 闪烁、因此应用程序似乎无法启动。

     在应用程序的 sys_link.cmd 文件中尝试了使用和不使用 ECC 设置来完成此操作。 两个版本似乎都没有开始。

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

    另一个观察结果:当我从应用程序中删除要 RAM 的闪存副本并注释掉闪存测试时、请在调试模式下运行、这样就可以正常运行了。
    当我拔下 USB 插头时、也能正常工作! LED 在没有复制到 RAM 的情况下会在应用程序中闪烁。

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

    尊敬的 Geert Jacobs:

    问题是我没有 TMS570LS1224板、因此很难通过这些信息调试和找出问题。

    如果您没问题、我们可以在明天设置一个现场调试会话。 在该网站上、您可以共享您的屏幕并向我解释您的行为、我还可以提供我的建议。

    我将于上午10点至下午7点 IST (印度标准时间)提供服务。 因此、请在此时安排一个会议。

    ——
    谢谢、此致、
    Jagadish。

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

    尊敬的 Geert Jacobs:

    感谢您创建明天下午2点 IST 的会议。 我将加入会议。

    ——

    谢谢、此致、
    Jagadish。

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

    尊敬的 Jacobs:

    给我15分钟的时间看起来有一些音频问题。

    ——
    谢谢、此致、
    Jagadish。

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

    尊敬的 Jacobs:

    我了解了问题的根本原因!

    问题就在这里:

    在应用程序中、您正在尝试擦除和写入地址0x10000处。

    我希望您已经知道 Hercules 器件的最小擦除粒度是扇区。  

    因此、如果您尝试擦除 0x00010000、这个地址意味着整个扇区将获得擦除、这意味着0x10000至0x13FFF 中的数据将被擦除。

    但如果您验证您的应用代码、我们已将向量存储在0x10020处、将代码存储在0x10040处、因此我们的部分代码和向量表也将被擦除。

    这是您第一次遇到任何问题、因为我们没有擦除、而且我们从 RAM 执行代码。 但在重置后、我们应该只从闪存中读取、但闪存已经被擦除。 这就是我们面临问题的原因。

    解决方案是、最好 避免使用我们的应用程序存储的部门以进行额外的数据写入。 您可以使用存储的应用程序之后的扇区。  

    您可以使用应用程序的映射文件来查找此值。

    在这里、我的应用程序一直存储到地址0x10040+0x7D0C (即 0x17D4C)。

    该地址将位于闪存的扇区5中。 因此、最好使用来自地址0x180000的扇区6。

    这些屏幕截图是针对 RM46的、因此请验证  TMS570LS1224。

    ——
    谢谢、此致、
    Jagadish。

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

    尊敬的 Jacobs:

    如果您真的想在同一地址写入、那么不要擦除整个扇区、而不是直接写入您想要写入的数据。

    我之所以这样建议、是因为我假设引导加载程序将在对应用程序进行编程之前擦除此扇区。

    另外、我不明白您为什么要通过应用来执行该写入操作。 实际上、在我们的 CAN 引导加载程序项目中、此区域仅由引导加载程序写入、该区域指示是否存在有效的应用程序。 因此、首先可以引导加载程序擦除闪存(从引导加载程序之后的区域)、然后引导加载程序将应用程序写入已擦除的闪存中 、如果它成功将应用程序写入闪存、那么最终引导加载程序会将签名写入0x10000地址以指示有效的应用程序。

    ——
    谢谢、此致、
    Jagadish。

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

    目的是通过软件触发固件升级。
    因此、应用程序将在某个位置擦除/重写应用程序状态中由引导加载程序和应用程序共享的无效值。 之后应用程序将重置器件。
    TI 可以引导加载程序演示代码将此应用程序状态放置在地址0x10000、因此我使用了这个地址。

    我刚刚使用您针对这个特定测试用例的建议值0x18000进行了测试、这个测试用例是应用程序状态位置、这个功能看起来确实更好。  
    仍需要仅使用引导加载程序进行测试。
    感谢您的帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    目的是通过软件触发固件升级。
    因此、应用程序将擦除/重写由引导加载程序和应用程序共享的某个位置的应用程序状态中的无效值。[/QUOT]

    很有道理!

    我刚刚使用您针对这个应用程序状态位置的特定测试用例建议的值0x18000进行了测试、该测试用例似乎的确运行得更好。  
    仍需仅使用引导加载程序进行测试。

    好的雅各布斯。

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

    我一直在尝试将我的应用从应用状态的闪存扇区移开(0x10000)、以尝试确认您的理论。
    因此、我必须在三个位置调整应用地址:

    - PC 固件升级应用程序在编程时发送应用程序启动地址
    -引导加载程序接收编程地址,但也有硬编码的应用程序起始地址
    -测试应用程序需要更新其 sys_link.cmd。

    因此、我将所有这些应用程序开始位置更改为0x20000。
    这位于应用状态(0x10000)的闪存扇区之外。

    1.测试应用程序没有 RAM 代码副本,没有闪存写入/擦除,只 LED 闪烁:固件升级工作,应用程序从0x20000开始

    2.测试应用程序与 RAM 副本和只闪存初始化(不读/写)+ LED 闪烁:固件升级工作,但应用程序不启动(没有 LED 闪烁).

    现在、我仍然无法将闪存代码复制到 RAM 中的应用正常工作。

    此时我可能需要考虑收费选项。

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

    尊敬的 Jocobs:

    让我在 RM46电路板上尝试相同操作、

    我将尝试在星期一之前提供更新。

    ——
    谢谢、此致、
    Jagadish。

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

    使用闪存仿真 EEPROM 现在、我有了可以擦除 Application Status 字段的引导加载程序和应用程序。 这似乎是一种比直接将应用程序状态写入闪存某个位置更方便的方法。

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

    尊敬的 Jacobs:

    这似乎比将应用程序状态直接写入某个位置的闪存更方便。

    很有道理。

    我根据您的要求在 RM46中更改了代码。

    我开始将应用程序存储在地址 0x00020020处。

    我要从引导加载程序中调用相同的地址:

    我验证了 LED 闪烁和闪存写入、都可以正常工作、没有任何问题。

    我随附了我的项目供您参考、请浏览一下:

    应用:

    e2e.ti.com/.../FAPI_5F00_Bank0_5F00_RM46.zip

    引导加载程序:

    e2e.ti.com/.../0654.SafetyMCU_5F00_Bootloaders.zip

    ——
    谢谢、此致、
    Jagadish。