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.

[参考译文] MSP430FR5964:GCC 如何构建调用帧?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1166350/msp430fr5964-how-does-gcc-structure-call-frames

器件型号:MSP430FR5964

我试图追问一个问题、我认为这是由 ISR 内的堆栈损坏引起的- ISR 永远不会像预期的那样返回到非 ISR 模式。

为了尝试并达到其底部、我一直在尝试了解 在 ISR 入口生成的调用帧、但我仍在努力。 根据我可以了解的内容、调用帧由触发 ISR 时的 PC 和 SR 组成、编译器决定存储在栈上的任何 ISR 局部变量以及需要在 RETI 上恢复的一组寄存器的值、 但实际范围完全取决于编译器确定的需求。 除了反汇编代码之外、是否还有其他方法可以查看调用帧的范围、以及到底会推入什么内容? 我找到了 slaa140、它在概念上概括了如何构建呼叫帧-在任何地方还有什么其他可用的东西吗?  

Code Composer 能够生成调用层次结构、而无需(大概)访问底层堆栈操作。 这使我认为呼叫帧中存在一些我缺失的元数据(可能是某种帧指针?)。 CCS 是如何通过堆栈生成调用层次结构的?

该代码全部由 GCC 生成。 感谢您的任何见解或指导。

Andrew

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

    编译器确实会在生成的代码中添加一些注释、您可以看到是否在生成汇编源代码后将其停止。 但您认为它是对的。 硬件推送 PC 和 SR 以响应中断。 编译器随后会执行所需的操作、以在执行代码之前保留状态。 一个简单的示例:

           .section        __interrupt_vector_45,"ax",@progbits
            .word   Timer_A
                    .section        .lowtext
            .type   Timer_A, @function
    Timer_A:
    .LFB2:
            .loc 1 73 2
    ; start of function
    ; attributes: interrupt wakeup 
    ; framesize_regs:     0
    ; framesize_locals:   0
    ; framesize_outgoing: 0
    ; framesize:          0
    ; elim ap -> fp       4
    ; elim fp -> sp       0
    ; saved regs:(none)
            ; start of prologue
            ; end of prologue
            .loc 1 74 4
            .loc 1 74 8 is_stmt 0
            ADD.W   #1, &tick
            .loc 1 75 2
            ; start of epilogue
            BIC.W   #240, 0(SP)
            RETI
    .LFE2:
            .size   Timer_A, .-Timer_A
    

    ISR 通常足够简单、因此不需要大型堆栈帧。

    如果 ISR 破坏了堆栈、则最可能的原因是指针地址错误。 索引字符串时出现一个 off by one 错误是我的常见错误。

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

    感谢您提示捕获生成的汇编代码-我们没有考虑过这一点、希望能提供比原始反汇编更好的编译器意图概念。 我会有一个游戏并告诉您。

    是否有 CCS 如何反向跟踪堆栈的想法? 这里似乎没有足够的信息来完成这项工作、这让我认为我不得不错过一些东西!

    Andrew

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

    调试时、您希望将"-g"选项传递给 gcc、以便它包含 gdb 的调试信息。

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

    尊敬的 David:

    感谢您提供有关捕获汇编列表的提示。 这里的注释准确地告诉我我希望和需要了解的帧范围。 我只是在节节保留这些作为构建的伪影、因为 如果没有中断帧、将其解码将非常困难。

    我最终对眼前的问题掉下了一把,这样就解决了。 报告的帧大小也让我非常明确地指出、这个特定的 ISR 在中断级别执行得太多、因此接下来我 要做的就是这样。

    再次感谢- Andrew