打印
[开发工具]

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

[复制链接]
3328|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
freny|  楼主 | 2009-4-2 16:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近做项目的时候碰到了一个因为局部变量导致堆栈越界的问题,虽然最后靠扩大堆栈空间暂时解决了,但这也限制了全局变量的定义。有没有一种好的方法来解决这些问题了?
看了看编译后的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是如何分散加载,以及如何才能将堆栈放置在最尾端,谢谢,小弟才疏学浅,在此先谢过了。
沙发
香水城| | 2009-4-2 16:39 | 只看该作者

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

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

使用特权

评论回复
板凳
freny|  楼主 | 2009-4-2 23:01 | 只看该作者

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

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

使用特权

评论回复
地板
freny|  楼主 | 2009-4-3 15:48 | 只看该作者

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

老哥哟,如何使用烦请细细道来呀。
我就不用堆,呵呵,反正堆还要申请了,只要全局或则局部。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

37

帖子

0

粉丝