在线时间1 小时
UID60510
ST金币0
蝴蝶豆0
注册时间2007-6-21
新手上路
- 最后登录
- 1970-1-1
|
a0a.1 0b0c
最近做项目的时候碰到了一个因为局部变量导致堆栈越界的问题,虽然最后靠扩大堆栈空间暂时解决了,但这也限制了全局变量的定义。有没有一种好的方法来解决这些问题了?
看了看编译后的MAP文件,发现MDK将STACK放在了最后一个全局变量的后面。现在我有一个想法,因为M3的堆栈是向下的,能不能将堆栈的首地址放置在RAM的最尾端了?
这样只要不是很过分的定义,一般全局变量的部分是不会跟堆栈搭上界的,这样你可以定义很多的全局变量也可以大量使用局部变量,不至于出现刚说的要么全局要么局部
只能一种定义的限制。
看了下其实文件,我做了以下修改:
1.
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =0x20002800;(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, =0x20000200;Stack_Mem
这样不就将堆栈的位置固定在最尾了吗(2800是因为我的MCU只有10KBYTE的RAM),然后去设置将微小库给取消调,最后在调用main前来初始化下
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
LDR R0, =__user_initial_stackheap
BX R0
IMPORT __main
LDR R0, =__main
BX R0
ENDP
然而我再去看MAP时,结果还是堆栈从全局后开始,郁闷。
2.不行就分散加载
STACKS 0x20028000 UNINIT
{
STM32F10x.o (Stacks)
}
我将上面的话加入到了.\Obj\AD_API.sct文件中,结果还是一样,更郁闷。
以上是我的一些尝试,很是不成功,请高手能否讲解下MDK是如何分散加载,以及如何才能将堆栈放置在最尾端,谢谢,小弟才疏学浅,在此先谢过了。 |
|