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

查看: 4937|回复: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版