5456|7

86

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

如何将堆栈放置在RAM最尾端? [复制链接]

最近做项目的时候碰到了一个因为局部变量导致堆栈越界的问题,虽然最后靠扩大堆栈空间暂时解决了,但这也限制了全局变量的定义。有没有一种好的方法来解决这些问题了?
看了看编译后的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是如何分散加载,以及如何才能将堆栈放置在最尾端,谢谢,小弟才疏学浅,在此先谢过了。
此帖出自stm32/stm8论坛

最新回复

                                 FLASH 映射模式的仿真老死循环!用生成的HEX ,HJTAG.EXE可以可以烧写FLASH,而且运行正常。RAM 映射模式的 也是仿真不了的。难道H-JTAG+WIGGLER 板哪里设置不对了!真要ULINK?要编写 Scatter 加载文件!栈在尾端,向下, 堆在栈的前面向上(向栈靠拢)起点到堆是代码 手工 复制初始化数据。初始化~~   详情 回复 发表于 2009-4-3 16:43
点赞 关注
 

回复
举报

62

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

这就是让人恼火的地方!

                                 因此我一直用不成RVMDK!  
此帖出自stm32/stm8论坛
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

堆栈放置在RAM最尾端与放置在全局变量的后面没有本质区别

                                 它并没有解决局部变量导致堆栈越界的问题,而且这样手动地修改,变相地破坏了调试软件对堆栈越界的检查机制,一旦堆栈越界破坏了全局变量,也得到不到报警,使得你不能及时发现程序中的隐患,后果会更严重。
此帖出自stm32/stm8论坛
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 

问个怎么用调试软件来坚持堆栈越界?谢谢

问个怎么用调试软件来坚持堆栈越界?谢谢
我的意思是堆栈放最尾上,全局放头上,他们是向中间靠拢的,只要不要定义得太多,还是越不了届的呀,不比将堆栈放全局后面,那样堆栈的长度就定了,一旦多了那么点就跑到全局去了,这样也就是变相得将堆栈长度拉大了,但是确实隐性的。特别是给客户二次开发的那种,你也不知道客户是喜欢定义全局了还是局部,这种堆栈的长度就不能弄得太大,太大了他定义了很多全局,结果就编译都搞不过去。
谢谢!
此帖出自stm32/stm8论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

5
 

这个很难理解为何~~!

ADS,IAR 都不是这样。为何 ?后来KEIL把它设为这样的。

唯一的解释就是这样可以避免 堆与栈的重叠问题。堆会申请失败。
但另一个问题就来了,栈与全局变量可能重叠--这个问题编译器能检测出来吗?

而把堆栈设到顶端,堆与栈的重叠问题是否就不能检测出来呢?
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 

呵呵!看了最新资料,原来也不难!

                                 RVMDK 3.24版本。ARM7/ARM9/CORTEX-M3通通可以使用。
此帖出自stm32/stm8论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

7
 

如何使用烦请细细道来呀。

老哥哟,如何使用烦请细细道来呀。
我就不用堆,呵呵,反正堆还要申请了,只要全局或则局部。
此帖出自stm32/stm8论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

8
 

唉!还是有问题啊!??

FLASH 映射模式的仿真老死循环!用生成的HEX ,HJTAG.EXE可以可以烧写FLASH,而且运行正常。


RAM 映射模式的 也是仿真不了的。
难道H-JTAG+WIGGLER 板哪里设置不对了!真要ULINK?

要编写 Scatter 加载文件!
栈在尾端,向下, 堆在栈的前面向上(向栈靠拢)
起点到堆是代码 手工 复制初始化数据。初始化~~

此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表