最近做项目的时候碰到了一个因为局部变量导致堆栈越界的问题,虽然最后靠扩大堆栈空间暂时解决了,但这也限制了全局变量的定义。有没有一种好的方法来解决这些问题了? 看了看编译后的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) } 我将上面的话加入到了.ObjAD_API.sct文件中,结果还是一样,更郁闷。
以上是我的一些尝试,很是不成功,请高手能否讲解下MDK是如何分散加载,以及如何才能将堆栈放置在最尾端,谢谢,小弟才疏学浅,在此先谢过了。 |