引导加载程序重定位后的ARM M0 +异常堆栈指针

时间:2017-02-09 02:09:31

标签: pointers memory stack

我使用Crossworks作为我的开发平台。

我不认为我做过 - 但我写的引导程序放置了#34; main"堆栈内存不足。稍后(在Crossworks升级之后) - 我编写了应用程序代码,链接器将堆栈放在高内存中。

经过3天的调试后,我发现了应用程序中内存损坏的根本原因。

应用程序使用复位时定义的堆栈指针(重新定位的地址零 - 0x4000),这是高内存但中断代码正在使用来自引导加载程序(低内存)的堆栈指针,这会破坏我的数据。

问题 - ARM文献说(我没有使用"进程"堆栈) - 应用程序和异常处理程序使用" main"堆。引导加载程序从第一个字加载SP并跳转到第二个字中包含的地址。然后启动代码再次设置堆栈指针。因此,如果启动代码正在设置堆栈指针(" main"堆栈)并且THAT是应用程序使用的堆栈,那么HOW是否仍在使用来自引导加载程序的堆栈指针的异常处理程序?

鉴于我在低内存中使用堆栈的引导加载程序和在高内存中使用堆栈的应用程序 - 如何让应用程序异常使用当前被认为是" main&#34的相同堆栈指针;堆栈?

我在该领域有产品,因此我必须更正应用程序的异常堆栈指针,而不仅仅是创建一个使用高内存堆栈的新引导加载程序。

我希望我解释这个比泥更清楚。

1 个答案:

答案 0 :(得分:0)

引导加载程序使用了“进程”堆栈,因此控制寄存器的位设置为1。

我清除了重定位应用程序中的控制寄存器,以便使用一个堆栈并解决我的问题。