【问题标题】:MSP430 How to understand stack and register outputMSP430 如何理解堆栈和寄存器输出
【发布时间】:2013-09-14 22:02:10
【问题描述】:

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

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

我了解我的堆栈可能已损坏。就像设备卡住和打印当前寄存器值一样,它们总是相同的:

    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 获得相同的值。我有当前的堆栈,但是我对汇编知之甚少,有什么方法可以让我理解发生了什么,而不是学习汇编并手动回溯所有内容。 如果需要更多信息,请告诉我。我真的很抱歉提出这样的问题,但是谷歌几乎没有帮助。如果我有整个内存转储,有什么方法可以回溯(不是手动)?

【问题讨论】:

  • 如果您正在使用像 MSP430 这样的嵌入式设备,学习组装可能是个好主意。
  • 你最近在 mspgcc 邮件列表上问过这个吗?一周前有一封电子邮件,其中包含从未回复的建议。他们是如何成功的?
  • 感谢您的回复。在 mspgcc 邮件列表上提出一些建议后,我已经取得了一些进展,因为现在我被困在我知道发生了什么的地方,更多的是关于堆栈中 053e 位置的问题。所以我没有在那里问。整个内存转储看起来令人生畏。然后我将开始学习汇编,我已经卡在这一点上好几个星期了。
  • 我不知道您使用的是哪个 msp430,但我的地址 0x053e 用于外围设备(0x0100 到 0x0fef)。请在用户指南中查看您设备的内存映射。

标签: assembly stack msp430


【解决方案1】:

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

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

为什么它得到这个值?我只能推测。

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

【讨论】:

  • 非常感谢您的回复。我正在使用 msp430f2274 设备,似乎该地址不在外围存储器中,而且似乎在 ram 中。这就是数据表所说的:RAM(05FFh-0200h) 和外围设备 (01FFh-0100h、0FFh-010h、0Fh-00h)。是的,我似乎确实有一些具有本地数组的函数。我将生成内存映射,看看我能找到什么信息。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 2012-04-27
  • 1970-01-01
  • 2015-06-23
相关资源
最近更新 更多