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.

[参考译文] MSPM0G1507:将两个映像保存在闪存中、并将一个映像部署到 RAM 以进行执行。

Guru**** 2773145 points

Other Parts Discussed in Thread: MSPM0G3507

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1604400/mspm0g1507-hold-two-images-in-flash-and-deploy-one-to-ram-for-execution

部件号: MSPM0G1507
Thread 中讨论的其他器件: MSPM0G3507

尊敬的专家:

如下图所示、我的客户正在考虑一种配置、其中闪存区域由两个映像 (A 和 B) 和一个引导加载程序组成、而所选映像部署到 RAM 中进行执行。

Q1:#1 和#2 是否可行?
问题 2: 如果可行、您能告诉我任何限制或顾虑吗?
问题 3:还有、您能建议是否有更好的方法?

RAM_excute1.jpg

RAM_excute2.jpg

其他信息/用途:
-目标是在现场操作期间通过部署到 RAM 来实现固件(映像)切换。
-目前,用户将使用的图像 (A 或 B) 尚未确定,也未确定在更新过程中将更新的图像。
-将准备两组表数据以匹配图像,这些数据也将部署到 RAM 中。
-请参阅: MSPM0G1106:查询关于基于 MSPM0G1106 的 RAM 执行和发布构建 — 基于 Arm 的微控制器论坛 — 基于 Arm 的微控制器 — TI E2E 支持论坛 

此致、
正常

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

    尊敬的专家:

    很抱歉耽误你。 是否有任何更新?

    此致、
    正常

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

    嗨、O.H

    我将研究这个问题,并回答你明天。

    此致、

    Zoey

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

    尊敬的 O.H :

    为什么需要将一个部署到 RAM 中进行执行?

    对于#1 为是、映像 B 可以在 RAM 中执行、而 #2 不是、只将矢量表放入 SRAM。

    对于#1、您需要注意的是确保图像编译器基于 RAM 地址。 例如、图像 B 项目的矢量和其他项目已经基于 0x20000200(例如)、您不确定将 0x0000 作为图像 B 的项目

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

    你好、 

    感谢您的答复。

    [报价 userid=“402494" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1604400/mspm0g1507-hold-two-images-in-flash-and-deploy-one-to-ram-for-execution 其他信息/用途:
    -目标是在现场操作期间通过部署到 RAM 来实现固件(映像)切换。
    -目前,用户将使用的图像 (A 或 B) 尚未确定,也未确定在更新过程中将更新的图像。
    -将准备两组表数据以匹配图像,这些数据也将部署到 RAM 中。

    以上是原因。  目前、我们已将其设计为具有灵活性。

    对于#1、您需要注意的是确保您的图像编译器基于 RAM 地址。 例如、图像 B 项目的矢量和其他项目已经基于 0x20000200(例如)、您无法确定将 0x0000 作为图像 B
    的项目。

    让我确认以上内容。 这是否指编译器的 Section 设置? 如果我在段设置 阶段指定了 RAM 执行区域(例如 ImageB=0x20000200、ImageA=0x20001000)、这是否意味着 ImageB 不能在 0x20000200 以外的任何位置执行?

    此致、
    正常

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

    你好、 

    关于第 2 项、我有一个更正和一个附加问题。

    步骤 ①–③ 中的过程相同。 该术语 “修改后的矢量表“ 在步骤 ③ 中是指位于执行之后将跳转到的闪存区域中的矢量表的地址

    我的意图是这样做 “修改后的矢量表“变量 、以便可以在 A 图像和 B 图像之间自由选择跳转目标。

    我使用的示例代码位于:
    C:\ti\mspm0_sdk_<version>\examples\nortos\LP_MSPM0G3507\boot_manager
    作为参考、但在示例代码中、跳转目标矢量表是固定的。

    上述方法是否可行?

    此致、
    正常

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

    你好、 

    很抱歉耽误你。  是否有任何更新?

    此致、
    正常

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

    嗨、O.H

    很抱歉晚才回复。 E2E 电子邮件通知中可能存在一些错误。

    以上就是原因。  目前,我们的设计是灵活的。

    到目前为止、我在 RAM 执行方面没有灵活性。 为什么您不想 在闪存中执行?

    让我确认以上内容。 这是否指编译器的 Section 设置? 如果我在段设置 阶段指定了 RAM 执行区域(例如 ImageB=0x20000200、ImageA=0x20001000)、这是否意味着 ImageB 不能在 0x20000200 以外的任何位置执行?

    是的。 您将在编译器中编译用于 imageA/B 的代码、对吧? 这将修复要存储函数的哪个地址(例如计时器中断处理程序)? 所有中断处理程序地址都将记录在中断表中、CPU 将执行并输入相关地址。

    此致、

    Zoey

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

    嗨、O.H

    您不能通过矢量中断表选择需要执行哪个图像。 您需要更改 PC 地址以执行不同的 main 函数。  将中断矢量表存储在 RAM 中的优点是、您可以自由修改每个中断的地址、以跳转到 ImageA 或 ImageB 中的特定中断。

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

    尊敬的 Zoey Wei:

    感谢您的答复。

    很抱歉有其他问题。

    QRegarding 对于矢量表以外的应用程序区域、我的理解是、每个映像中包含的中断函数(处理程序)的地址默认分配为 绝对地址 在构建时?

    如果使用下面的构建选项 ( -ar 选项 )、将分配地址 相对 而是?

    在仅将矢量表放置在 RAM 中的情况下、根据前面说明的理解、当前使用调用所选映像的中断函数(处理程序) 绝对地址
    但是、我想确认是否可以访问它们 使用相对地址 、或者如果绝对寻址是唯一有效的机制。

    此致、
    正常

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

    嗨、O.H

    是的。

    所有这些都用于绝对地址。

    但好消息是 、如果您只是将中断矢量表放置在 RAM 中的任何位置、则只需将表的地址放在 SCB->VTOR 寄存器中。 当中断发生时、CPU 将跳转至中断矢量表并获取中断服务例程的地址。

    如果您想对映像 A 和映像 B 使用单个中断矢量表、则在切换期间需要修改中断矢量表中中断服务例程的条目地址。 例如、如果映像 A 的计时器处理程序位于 0x2000、而映像 B 的计时器处理程序函数位于 0x4000、则当从 A 切换到 B 时、您需要将中断矢量表中的计时器中断地址更改为 0x4000。

    如果下面是构建选项 ( -ar 选项 )、将分配地址 相对 相反?

    我在 TICLANG 中找不到相关的-ar 选项说明。 很抱歉、我对此不熟悉。 您需要查看您的编译器用户指南并检查它是否可行。  

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

    尊敬的 Zoey Wei:

    [引述 userid=“571916" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1604400/mspm0g1507-hold-two-images-in-flash-and-deploy-one-to-ram-for-execution/6209481

    但好消息是 、如果您只是将中断矢量表放置在 RAM 中的任何位置、则只需将表的地址放在 SCB->VTOR 寄存器中。 当中断发生时、CPU 将跳转至中断矢量表并获取中断服务例程的地址。

    如果您想对映像 A 和映像 B 使用单个中断矢量表、则在切换期间需要修改中断矢量表中中断服务例程的条目地址。 例如、如果映像 A 的计时器处理程序位于 0x2000、而映像 B 的计时器处理程序函数位于 0x4000、则当从 A 切换到 B 时、您需要将中断矢量表中的计时器中断地址更改为 0x4000。

    [/报价]

    感谢您的答复。 我明白了。

    抱歉、我忘记了链接。 下面列出了-ar 选项的详细信息、但细节很难理解、因此如果您有任何信息、请告知我。

    10.4.5.链接器输出选项—TI Arm Clang 编译器工具用户指南

    此致、
    正常

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

    其他信息。

    顺便说一下、当我实际在 CCS 中设置并编译时、似乎无法同时设置这两个代码。

    实际 CCS 版本为 20.4.1、Clang v5.0 相同。

    此致、
    正常

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

    尊敬的 O.H:

    MSPM0 器件似乎不支持它? 不确定...因为我不熟悉 TIClang ,让我把这条线导向 SDTO 团队寻求帮助。 谢谢!

    Zoey

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

    很抱歉耽误你的时间。

    合并链接器选项 --可重定位 -- absolute_exe.  不支持。  我提交了 EXT_EP-13217 以更新文档。  您可以随时通过该链接访问它。

    我不了解有关您的系统的所有内容。  但我理解足以提出这一建议。   

    链接器支持分配一个输出段、在一个地址加载并在另一个地址执行。  在此基础上、两个输出段可以具有相同的运行地址、但加载地址不同。  我认为这在您的情况下很有用。

    tiarmclang 在线手册中、从 使用由链接器生成的复制表的子部分开始。  关注标题为“ 重叠管理示例“的子部分。  但请勿使用运算符 LOAD_START RUN_START 尺寸小 。  请改用复制表。   

    我知道没有关于您的情况的例子。    有关方便高效使用存储器的信息、请参阅应用手册高级链接器技术。   相关示例适用于不同的处理器系列、不使用当前版本的 CCS 构建。  但仍然值得一看的示例源。

    谢谢。此致、

    -乔治

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

    您好、 George、

    感谢您的支持。 我明白了。

    如果我有任何其他问题、我会审核您的评论并创建新主题。

    此致、
    正常