MSP430如何理解堆栈和寄存器输出

时间:2013-09-14 22:02:10

标签: assembly stack msp430

我正在开发一个简单的MSP430应用程序,它通过无线电与类似的其他设备进行通信,并将数据记录到闪存中。我正在使用收音机唤醒以节省电力。我正在使用mspgcc和mspdebug在C中进行编程。

我的问题如下: 我的计时器在一段时间后停止工作,但是设备继续接收数据.i.e。接收中断继续工作,但计时器停止,因为主循环依赖于计时器。

我知道我的堆栈可能已损坏。当设备卡住时,当我打印当前寄存器值时,它们总是相同的:

    pc/r0: 8092  sp/r1: 053e  sr/r2: 0059  r3: 0000  
    fp/r4: ffff  r5: 5a08     r6: ffff     r7: ffff  
    r8: ffff     r9: ffff     r10: ffff    r11: 0000  
    r12: 0009    r13: 000c    r14: 0009    r15: 0001 

一个简单的回溯在堆栈上没有显示任何内容..只是main() 我总是为SP和SR获得相同的值。我有当前的堆栈,但是我对汇编知之甚少,有什么方法我可以理解发生了什么,而不是学习汇编和手动回溯一切。 如果需要进一步的信息,请告诉我。我真的很抱歉提出这样的问题,但谷歌没什么帮助。如果我有整个内存转储,有没有办法可以回溯(不是手动)?

1 个答案:

答案 0 :(得分:1)

您可能遇到堆栈溢出的情况。真实的,而不是网站:)

0x0530对于堆栈指针来说非常低。在我的设备的内存映射中,它用于外围设备。

为什么它会获得这个价值?我只能推测。

  1. 您是否在启动时初始化SP?您的编译器可能会为您执行此操作。如果您不知道,请在运行前(程序启动时)检查调试器的SP值。运行几秒钟,停止并再次检查。
  2. 在编译时生成的列表或映射文件中搜索“stack”。你能找到关于你的堆栈的位置和大小的任何信息吗?
  3. 你有递归函数吗?
  4. 您是否在函数中声明了大型本地数组?
  5. 其他可能需要大量内存的东西?