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.

[参考译文] MSP430F5252:从无 RTOS 引导加载程序跳转到 TI RTOS 应用程序

Guru**** 2502205 points
Other Parts Discussed in Thread: MSP430F5252

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/853949/msp430f5252-jump-from-no-rtos-bootloader-to-ti-rtos-application

器件型号:MSP430F5252

您好!

我目前正在使用引导加载程序(不运行 TI RTOS)来更新主应用程序、然后使用 TI RTOS 跳转到此应用程序。

我的引导加载程序将中断矢量重新映射到应用程序的代理矢量:

-在位于0xB000和0xB07E 之间的代理矢量内、它"复制"应用程序的0xFF80到0xFFFE 之间的值。

-它将0xFF80和0xFFFC 之间的值设置为我的代理矢量的地址(即0xB000到0xB07C)

-它通过调用跳转到主应用程序:

(*(void (*)(void))(*(uint16_t *) 0xB07E))(); 

它是我的应用程序的代理中断矢量中的复位矢量。

它似乎正确跳转到我的应用程序的开始位置(0xB200、这是我的应用程序的复位矢量中的值)、但它没有正确运行...

当我在没有引导加载程序的情况下运行应用程序时,主程序位于0x19FD0而不是0xB200,如何获取跳转以启动应用程序?

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

    您好 Clement、

    感谢您发表您的问题。 我们将仔细研究它、尽快返回给您。

    谢谢、

    是的

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

    您好、Yiding、

    我成功地使用跳转运行了我的应用程序、但为此、我必须将应用程序的中断矢量放在实际中断矢量中。

    可能我执行重映射时出错了。 当应用程序运行时,我应该如何准确地将中断重新映射到代理?

    感谢您的帮助!

    Clement

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

    有没有关于这个问题的最新情况?

    谢谢!

    Clement

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

    您好 Clement、

    对于位于信息存储器中的 TI BSL、地址应为0x1000。

    UG: http://www.ti.com/lit/ug/slau319ab/slau319ab.pdf 第1.3.2节对此进行了说明

    并确保在执行 BSL 之前禁用中断。

    谢谢、

    是的

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

    Yiding、您好!

    我将讨论主存储器中的引导加载程序、而不是 BSL 部件中的引导加载程序。

    当我编译应用程序时、我会得到一个从0xFF80到0xFFFE 的中断矢量、这是正常现象。

    我想将其作为代理重新定位到地址0xB000到0xB07E、因为我将有一个引导加载程序。 我不理解的是:

    如何通过代理矢量向应用程序“提供”中断?

    感谢您的帮助!

    Clement

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

    您好 Clement、

     

    • 首先、让我提一下、当 SYSCTL.SYSRIVECT=1时、MSP430F5252可选择将中断矢量重定向到 RAM。

    在这种情况下、复位后、"默认"矢量将始终位于0xFF80-0xFFFE 中、但您可以将这些矢量复制到 RAM、也可以复制完全不同的矢量(即对应于您的应用)。 复制向量后、设置 sysctl.SYSRIVECT、您无需在软件中执行向量重定向。

     

    在这里、代理表由"BRA"指令组成。

    -如您所知、原始矢量仅包含2个字节以及 ISR 的地址。

    即、如果 ADC10的 ISR 位于0xC000中、则矢量0xFFEC 将具有0xC000。

    -但在使用代理表时,引导程序将包含代理表中每个条目的地址。

    即、如果您的代理位于0xF000中、而 ADC10的代理矢量位于0xF020中、则0xFFEC 将包含0xF020

    现在,代理表不能仅仅具有 ISR 的地址,因为这不是 CPU 要执行的有效指令。 这就是您需要“BRA”指令的原因

               即矢量(0xFFEC)将包含代理地址(0xF020)、代理地址将包含 BRA 到 ISR (BRA 到0xC000)。

     

    • 您可能使用不同的方法、这是可以的、但是、您的方法对我来说并不完全清楚。  

    我不知道应用程序中的0xB200内容是什么,但请注意,如果使用 C 语言,编译器很可能会跳转到初始化例程,然后跳转到 main()。 如果您检查链接器文件、您可能会注意到0xB200的条目。

    根据我的理解、您有以下内容:

    -         0xB200 (初始化例程)

             - 0x19FBD0 (主)

    -         0xFFFE = 0xB200

    -         0xB07E = 0xB200

    您跳转到0xB07E 内容的指令似乎有效;但是,我无法真正解释为什么在您强制跳转到0xB200后器件无法正常工作。

    我建议与调试器一起分步运行。 如果器件正在复位、请确保禁用看门狗并检查复位源(SYSRSTIV)。 如果设备跳转至0xB200,但似乎没有有效的指令,则会出现错误,因为您的复位矢量不能具有此值。

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

    您好、Luis、

    感谢您的回答。 如何在代理矢量中将 BRA 放入 ISR 中? 这就是我无法绕着头的地方...

    [引用用户="Luis RC"]

    现在,代理表不能仅仅具有 ISR 的地址,因为这不是 CPU 要执行的有效指令。 这就是您需要“BRA”指令的原因

               即矢量(0xFFEC)将包含代理地址(0xF020)、代理地址将包含 BRA 到 ISR (BRA 到0xC000)。

    [/报价]

    我应该怎么做? 请记住、我的引导加载程序将用于更新应用程序、因此、当我的引导加载程序读取新应用程序时、它会在发现数据地址在矢量范围内(即0xFF80至0xFFFF)时将矢量置于代理中

    谢谢!

    克莱蒙特

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

    您好 Clement、

    关于您的问题:

    [引用 user="Clement Guillou1"]如何在代理矢量中向 ISR 放置 BRA?

    在 MSPBoot 中执行此操作的方式如下:

    • 引导加载程序定义矢量表、如下所示:
    /*写入未使用向量的值*/
    #define 未使用 (0x3FFF)
    /*! 用于计算应用程序代理表中向量地址的宏*/
    #define APP_PROXY 向量(x) ((uint16_t)&_appl_Proxy_Vector_Start[x*2])//这定义了"应用程序代理矢量表"的开头
    
    //此表必须放置在中断矢量位置(0xFF80-0xFFFD)
    //请注意,它不包括复位矢量,因为复位矢量指向
    //引导加载程序的开头。
    const uint16_t Vector_Table[]=
    {
    未使用、 // FF80 =未使用
    ... (更多未使用的矢量)
    未使用、 // FFD0 =未使用
    APP_PROXY 矢量(0)、 // FFD2 = RTC
    (笑声) (更多定义的向量)
    APP_PROXY 矢量(21)、 // FFFC = SYSNMI
    }; 

      • 请注意、它只是用一个值填充"保留"的位置。 0x3FFF 是一个"JMP $"、用于捕获器件。
      • "有效"向量指向代理表的相应地址(例如0xF000)
      • 重置未包含在表中、因为它会在编译代码后自动指向引导加载程序的开头。
    • 另一方面、应用程序定义其矢量如下:
    //此表应从_appl_Proxy_Vector_Start 开始放置 
    const uint16_t ProxyVectorTable[]= { 0x4030、(uint16_t)虚拟 ISR、 // app_proxy_vector (0) RTC <-器件的第一个有效 ISR。 应用程序未使用时的虚拟 ISR ... (其他虚拟或定义的 ISR) 0x4030、(uint16_t) P1_ISR、 // app_proxy_vector (6) Port1 <--由应用程序使用 ... (其他虚拟或定义的 ISR) 0x4030、(uint16_t)虚拟 ISR、 // app_proxy_vector (21) SYSNMI <-最后一个有效 ISR (不包括复位) };
      • 该表应放置在已知位置(根据我们的示例为0xF000)
      • 请注意、"0x4030"是 BRA 指令的操作码。
      • "应用程序复位矢量"也应放置在已知位置(即、在该表之后)。 可在链接器文件中调整复位矢量的地址(即、就像一个示例0xF1FE 一样)
      • 请注意、代理表忽略所有"保留"向量、仅在定义为 app_proxy_vector (0)的向量上启动
    • MSPBoot 始终开始执行引导加载程序。 引导加载程序决定它是应保持在引导加载程序模式还是应跳转到应用程序。 如果需要跳转到应用程序、它只需从"应用程序复位矢量"的已知预定义地址(即基于上面的示例的0xF1FE)中获取复位矢量

    还有其他方法可以执行代理表。 一个选项可以只是定义具有固定位置的代理 ISR、并使用它们跳转到实际的 ISR。 这比使用 OpCode 更不具有加密性。

    此致、

    Luis R

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

    谢谢您 Luis、

    我会尽快尝试、如果我有任何其他问题、我会回来回答、如果没有、我会将这个问题作为已解决的话题。

    Clement

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

    听起来不错。

    祝你好运:)

    LR