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.

[参考译文] MSP430F5438A:将 MCU 执行从大型指令集切换到小型指令集

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/566690/msp430f5438a-switching-mcu-execution-from-large-to-small-instruction-set

器件型号:MSP430F5438A

您好!

我们开发了一个在正常闪存上运行的引导加载程序、并处理也写入正常闪存中的客户端应用程序(来宾代码)。

但我们遇到了问题。 虽然如果此代码是以扩展格式编译的(因此处理器可以使用20位寻址、因此所有可用 ROM)、引导加载程序可以运行来宾代码、但当我们的引导加载程序跳转到执行代码时、加载使用"正常"标志编译的来宾代码(不带地址扩展)、它 停止运行...

我对这个问题的看法是、MCU 在扩展指令上运行、然后中断、因为它认为下一条指令也扩展了、但它们没有扩展。  

我在这里的问题是、我能否使用汇编语言(或 C)来切换 MCU、以及如何操作? 我知道 MCU 始终正常启动、但它无法仅通过 CC 的十六进制代码输出从"扩展"切换回正常状态。

提前感谢您、

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

    16位/20位之间没有运行时 CPU 切换。 为 CPU 混合16位和20位指令不是一个问题(除了某些特殊情况、由 C 编译器自动解析、或者对于汇编器源代码、将会出现警告)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如何不进行推理? MCU 不会以不同的方式对数据进行解密、因为是不同的吗?

    我用20位的客户代码和两个应用程序(16位和20位,都可以单独运行)进行了测试,但在调用应用程序时,20位开始,但16位不……

    MCU 与16/20位有何区别? 现在您已经谈到它、可能是因为引导加载程序调用了:

    void start_program (void){
    void (* StartHolder)(void);
    StartHolder =(void *)* pStartHolder;
    TA1CTL &= MC_0;//HALT 定时器
    //禁用所有中断
    _disable_interrupt ();//禁用中断
    TA1CTL &=~TAIE;//Disable Timer General interrupts
    TA1CCTL0 &=~CCIE;//禁用计时器 CCR0中断
    UART_disableInterrupts ();//禁用 USCI_A0中断
    //清除所有中断标志?
    disableXT2();

    SYSCTL &=~SYSRIVECT;//激活 ROM IVT
    //TODO:将 CLK 状态重新添加到用户设置
    ASM (" MOV.W #0x05C00、SP");//重置堆栈指针
    ((((void (*.)))StartHolder)();//START 代码
    //while (1);


    如果处理器未区分16/20位、则问题出在上一个调用"开始代码"中、该调用加载到 PC 的次数超过它应该加载的次数?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CPU 具有16位和20位指令、并且始终能够执行所有这些指令。 就 CPU 而言、没有16/20位模式。

    在16位模式下编译程序时、编译器不使用任何20位指令。 (它还限制程序代码/数据大小、以便知道永远不会有一个20位地址。)

    即使在16位程序中、也可以将20位指令与内联汇编器一起使用、或通过明确告知编译器使用20位指针来实现。

    这看起来像是您的16位程序中的一个错误。 "停止运行"到底意味着什么? 简单的 LED 闪烁测试程序是否起作用?

    是否为20位指针编译了引导加载程序? 如果是、它会在堆栈上压入一个20位返回地址。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这不是程序中的错误... 由于程序是单独运行的(程序是闪烁 LED,有 nop 延迟)....
    停止运行意味着它会跳转到客户代码、但随后它会将其自身锁定在循环中、而不运行任何内容... 如果我复位、MCU 将照常从我的引导加载程序启动

    请以该示例为例

    GuestStart ->[0、1、2、3、4、5、6、7、8、9]
    如果这是我的 ROM 存储器、它包含 IS 和数据、则会发生以下情况:

    如果我运行16位:
    引导加载程序加载 PC<-*GuestStart
    处理器不会开始将指令解释为[0、1];PC+2;执行[2、3];PC+2;执行[3、4]等

    而不是像它应该的那样运行[0];PC+1;[1];PC+1;[2]; PC+1……?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    到目前为止、有两个人告诉您、这不是 CPU 的行为方式。 如果您不相信我们、请参阅用户指南第6章中的说明格式。

    "将自身锁定在环路中"到底意味着什么? 什么循环? 您实际观察到什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Diogo Guerra2">Stop Running 意味着它会跳转到客户代码、但随后它会将其自身锁定在循环中、不运行任何内容... 如果我复位、MCU 将以正常的引导加载程序启动

    也许 slaa600a MSPBoot–适用于 MSP430微控制器的主存储器引导加载程序以及源代码可以帮助您了解如何跳转到加载的应用。