你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 4889|回复: 0

如何将堆栈放置在RAM最尾端?

[复制链接]

5

主题

14

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2009-4-2 15:52:09 | 显示全部楼层 |阅读模式
最近做项目的时候碰到了一个因为局部变量导致堆栈越界的问题,虽然最后靠扩大堆栈空间暂时解决了,但这也限制了全局变量的定义。有没有一种好的方法来解决这些问题了?
看了看编译后的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是如何分散加载,以及如何才能将堆栈放置在最尾端,谢谢,小弟才疏学浅,在此先谢过了。
回复

使用道具 举报

关于 意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版