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.

[参考译文] F28M35H52C:ARM 堆栈指针配置

Guru**** 2538940 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/653644/f28m35h52c-arm-stack-pointer-configuration

主持人注意:此主题已从拆分  。   

您好、Santosh、

在 M3引导加载程序中、我尝试更新应用程序端 MSP 值、为此、我尝试下面指出的操作。 通过这种方法、MSP 和 SP 会比我通过寄存器 R0实际加载的内容增加2个字节。

内联 void set_sp (uint32_t app_stack){

asm (" MSR MSP、r0\n");



这个2字节的 INN 递增会导致我的应用代码调用 FaultISR 例程。

我实际传递到 app_stack (r0)= 0x20002358



实际传递给 MSP 的内容= 0x200002360

如果我没有尝试设置 MSP/SP 值、我可以从引导加载程序轻松跳转到我的应用程序、所有操作恢复正常。

您能否确认这是 ARM ISA 的行为方式、或者是否存在我缺少的内容。

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Preetham、
    您能否确认更改堆栈的原因? 是否正在尝试使用特权模式和用户模式?

    SP 自动与字、4字节边界对齐。 您能否检查这是不是发生了什么情况? 此外、如果内联函数真正内联或正在发生其他情况、请检查拆分窗口、并添加额外的推送以使 SP 递增?

    如果您不是切换模式、并且不使用不同的权限级别、为什么不能使用简单的 MOV SP R0指令?

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

    您好、Santosh、

    [引用 user="Santosh Athuru"]您能否确认更改堆栈的原因? 是否正在尝试使用特权模式和用户模式? [/报价]

    实际上、我不需要设置我的堆栈指针值。 但我尝试这样做只是为了实现更强大的软件实现。 在中、我尝试确保在从引导加载程序进行跳转之前已为应用程序设置 SP 的 RITE 值。  

    但是,由于您引入了专用和用户模式选项,您能否告诉我是否有一条汇编指令可用于在这些模式之间切换? 如果不是,应用软件如何切换 ARM 模式? 我相信复位时,ARM 将默认设置为特权模式,用户必须像在 RTOS RITE ? 您能指出我应该使用什么寄存器来更改模式吗?

    [引用 user="Santosh Athuru"]SP 自动与字、4字节边界对齐。 您能否检查这是不是发生了什么情况? 此外、如果内联函数真正内联或正在发生其他情况、请检查拆分窗口、并添加额外的推入以使 SP 递增?

    我根据您的建议发表了一些意见。 请按照以下屏幕截图操作。  

    1。  

    从上图中可以看到、在这个实例中、我尝试向堆栈写入一个值0x20002358、这就是我传递给寄存器 R0的参数。 我认为内联函数没有问题。

    2.  

    这是有趣的地方。 一旦我退出内联函数,我就会看到 SP 值增长了2个字节??  

    3.  

    为了增加混乱,appEntry 值本身更改为0x00000001 ??

    但是、当我不设置 SP 值时、appEntry 值为0x0022162B、这是 我的应用程序的 ResetISR 值(从应用程序.map 文件验证)!! 因此、它会跳转到该值、我的闪烁应用程序会很高兴地工作。  (以下屏幕截图显示了未设置 SP 时的 appEntry 值)

    [引用 user="Santosh Athuru"]如果您不切换模式且未使用不同的权限级别、为何不能使用简单的 MOV SP R0指令? [/报价]

    这就是我使用的方法、而遵循的行为就是我在上面指出的。  

    谢谢

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

    正确的是、ARM 会重置为特权线程模式。 要切换模式、您必须接受异常、然后返回到所需的模式(特权模式或用户模式)。 如果您参考有关执行模式的 ARM 文档、则可以找到更多详细信息。

    2字节调整可能是因为它在栈上分配空间以存储 r0、因为它通常会被压入常规函数。 我并不完全确定、但我非常确信这是预期的 ARM 行为。 指针值可能会损坏、因为它正在从堆栈中读取其值、而使用新的堆栈指针值时、它找不到原始值。

    此致
    Chris