无法读取内存

时间:2011-07-19 19:00:43

标签: memory stack-overflow interrupt-handling msp430

当我通过调试器运行代码时,经过一系列步骤后,它最终会丢失并无序执行命令。我不确定堆栈是否溢出或是什么。

这是我经常得到的错误:

MSP430:在长度为0x1d2的第0页的0xffe2e处读取内存块时出现问题:参数无效

有关它可能是什么的任何建议?我简要地阅读了有关不处理某些中断的可能问题。

另外,我正在尝试用特定的值填充我的RAM,以便我可以判断堆栈是否溢出,有关如何填充整个RAM的任何建议,比如说值为0x1234?

谢谢!

2 个答案:

答案 0 :(得分:0)

您使用的调试器和编译器是什么?我发现msp430-gcc和msp430-gdb / gdbproxy可能会在启用GCC优化时变得非常混乱。但是,破坏的代码有时会在没有打开的情况下发出(实际上它是一个高质量的产品)。

填充内存的最简单方法是修改crt0.s启动文件并自行链接。当内存设置为0时,您可以在那里更改模式。

您使用的是哪种设备?在16位器件上,0xffe2e位于处理器的地址空间之外,可能是数组索引或类似的已经消极的。

答案 1 :(得分:0)

我在使用代码编辑器工作室和TI的USBFET编程器时也看到了这个错误,尽管我还没有找到一个明确的原因。

假设您正在使用CCS,以下是一些提示:

1)捕获ACCV(UNMI)和VMA(SYSNMI)中断并在处理程序中设置断点。如果其中一个跳闸,请检查堆栈以找出触发中断的线索。

2)如果你有任何中断处理程序重新启用中断(GIE位),请确保它们没有重复被重新触发。

3)我在单步优化代码时看到了这个错误(莫名其妙);所以它可能有助于关闭优化。

如果您使用的是code composer studio,作为初始化RAM的替代方法,您可以在堆栈溢出时设置断点。此外,通过暂停的调试会话,CCS为您提供了通过“Memory”子窗口选择任何值来填充内存的一部分的选项。 How to fill MSP430 memory