我正在开发一个简单的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 值。我有当前的堆栈,但是我对组装知之甚少,有什么办法可以理解正在发生的事情,而不是学习组装并手动回溯所有内容。如果需要更多信息,请告诉我。我真的很抱歉问这样的问题,但是谷歌几乎没有帮助。如果我有整个内存转储,有什么方法可以回溯(不是手动)吗?
您可能遇到堆栈溢出的情况。真实的,而不是网站:)
堆栈指针的0x0530非常低。在我的设备的内存映射中,它是外围设备的内存映射。
为什么它会得到这个值?我只能推测。
- 是否在启动时初始化 SP?您的编译器可能会为您完成此操作。如果不知道,请在运行之前(在程序启动时)在调试器中检查 SP 的值。运行几秒钟,停止,然后再次检查。
- 在编译时生成的列表或映射文件中搜索"堆栈"。您能找到有关堆栈位置和大小的任何信息吗?
- 你有递归函数吗?
- 您是否在函数中声明大型本地数组?
- 还有什么可能占用大量内存的吗?