IAR MSP430设置合理堆栈大小(the stack pointer for stack is outside the stack range)

摘要:

    本文给出IAR设置堆栈合理大小的详细方法,并分享一些好博文(icf及map讲解)。

    最近在MSP430-169LCD(MSP430F169,RAM为2KB)调试一些ucos演示例子,IAR for MSP430默认的堆栈大小是80字节,编译可以通过,运行结果不确定性,调试过程会提示"the stack pointer for stack is outside the stack range",堆栈溢出。那么,到底设置多大的堆栈够用且不浪费呢。

一、合理设置堆栈大小

首先,查看程序共需要多大的堆栈,生成map文件,方法如下:

图1 生成map文件

    生成的map文件在项目目录下的/Debug/List,打开map文件在CALL GRAPH找到找到栈的最大使用量(我的理解是main主函数,用栈最多,所以直接拉到文件末尾,靠近SEGMENTS IN ADDRESS ORDER的地方),如下图所示:

图2 最大栈使用

    由上图可知,最大栈使用量是00000076(注意这里是16进制),即118字节。

接着,设置堆栈大小,方法如下,可以设置比最大栈稍微大一些:-)

图3 设置栈大小

 

二、一点小心得

通过上述方法,设置堆栈后,再编译有可能会报如下连接错误(受限的内存远不够使用):

图4 内存不够用链接错误

此时,唯一的办法就是重新设计程序了。在单片机上跑uC/OS,可以通过以下方法来减少内存使用:

    (1)如果是跑uC/OS,可以在os_cfg.h文件配置系统,如将最大任务数(OS_MAX_TASKS)设小一些,关掉一些扩展功能(以EN结尾的变量)

    (2)将一些局部变量数组设成全局变量(我就遇到这个问题,我想在MSP430-169LCD完成类似printf功能,难免需要一些字符数组)

 

三、我的疑问

    在实际调试过程中,尽管我把堆栈设得比查看map文件堆栈要大得多(map文件是0x76,即118,我设成250),调试的时候,依然有这个问题,如下:

  1. Sat Dec 22, 2012 22:23:21: The stack pointer for stack ‘Stack‘ (currently Memory:0x55A) is outside the stack range (Memory:0x906 to Memory:0xA00)

    很费解,求指点[email protected]

四、一些好资料

[1] 博文《IAR常见段名含义

[2] 博文《深入剖析之通过IAR MAP文件查看目标文件内存分配

[3] 博文《写在"五一"之解析IAR的ILINK链接器icf配置文件

[4] 博文《IAR堆栈分配原则

时间: 2024-08-29 18:49:51

IAR MSP430设置合理堆栈大小(the stack pointer for stack is outside the stack range)的相关文章

线程堆栈大小的使用介绍

先来讲说线程内存相关的东西,主要有下面几条: 进程中的所有的线程共享相同的地址空间. 任何声明为 static/extern 的变量或者堆变量可以被进程内所有的线程读写. 一个线程真正拥有的唯一私有储存是处理器寄存器. 线程栈可以通过暴露栈地址的方式与其它线程进行共享. 有大数据量处理的应用中,有时我们有必要在栈空间分配一个大的内存块或者要分配很多小的内存块,但是线程的栈空间的最大值在线程创建的时候就已经定下来了,如果栈的大小超过个了个值,系统将访问未授权的内存块,毫无疑问,再来的肯定是一个段错

线程堆栈大小 pthread_attr_setstacksize 的使用

pthread_create 创建线程时,若不指定分配堆栈大小,系统会分配默认值,查看默认值方法如下: # ulimit -s8192# 上述表示为8M:单位为KB. 也可以通过# ulimit -a 其中 stack size 项也表示堆栈大小.ulimit -s  value 用来重新设置stack 大小. 一般来说 默认堆栈大小为 8388608; 堆栈最小为 16384 . 单位为字节. 堆栈最小值定义为 PTHREAD_STACK_MIN ,包含#include <limits.h>

VC++中出现stack overflow错误时修改VC++的默认堆栈大小

VC++中,在栈空间上申请存储的结构体或者类对象的数组空间时,如果数组长度过大,造成申请的栈空间超过或者逼近1MB时,程序可以编译通过,但是不能够执行起来.打到调试模式时会弹出如下图所示的栈空间越界错误对话框. 如下面的类定义: class Character { public: Character() { x0 = 0; y0 = 0; x1 = 0; y1 = 0; offsetX = 0; offsetY = 0; } unsigned int x0:10; unsigned int y0

详解μC/OS-II如何检测任务堆栈实际使用情况——即如何设置ucosii任务堆栈大小

不少屌丝同学都有类似经历吧,在使用ucosii创建任务时,关于任务堆栈大小设为多大合适搞的不清不楚,郁闷之下就随便整个数,比如就1024吧,呵呵,反正也没见得出问题,那就不多想了. 我想大多数同学都是这样做的吧.这样只是因为在一般情况下,1024确实已经足够大了,堆栈溢出的可能性很小而已.那么,如果你任务实际使用率只有很小的百分之几,一旦被你知道了,你会痛心不?我想你不痛心,μC/OS-II也会痛心的,它会觉得这个coder真是浪费啊,哈哈!顺便提醒下大家,堆和栈是完全不同的两个概念,出于国内习

堆栈和堆栈大小

正在执行的程序为执行该程序的初始(或主)线程维护一个主堆栈,并为每个从属线程维护不同的堆栈.堆栈是临时内存地址空间,用于保留子程序或函数引用调用期间的参数和自动变量.如果线程堆栈的大小太小,则可能会出现堆栈溢出,从而导致无提示数据损坏或段故障. 使用 f95 -stackvar 选项编译 Fortran 程序会强制在堆栈中分配局部变量和数组,就好像它们是自动变量.显式并行化的程序暗指对 OpenMP 程序使用 -stackvar,因为该选项可提高优化器将循环中的调用并行化的能力.(有关 -sta

SylixOS线程堆栈大小浅析

目录 1. SylixOS线程.线程栈介绍    1 1.1    线程的介绍    1 1.2    线程栈的介绍    1 2. SylixOS线程栈大小的分配    1 2.1    线程.线程栈相关属性的设置    2 2.2    线程栈大小    2 2.3    线程堆栈警戒区    3 3. 总结    5 4. 参考资料    5 SylixOS线程.线程栈介绍 SylixOS是多线程操作系统,系统能够同时创建多个线程,具体最大线程数量取决于系统内存的大小以及编译SylixOS

学习堆栈大小限制

堆栈大小在运行程序时起着重要作用 1. 程序中堆栈的最大大小是多少? 在Linux上,可以使用ulimit命令获得允许的最大堆栈大小. [[email protected] c]# ulimit -a core file size????????? (blocks, -c) 0 data seg size?????????? (kbytes, -d) unlimited scheduling priority???????????? (-e) 0 file size??????????????

MyEclipse设置JVM内存大小

1.为什么要设置JVM内存大小呢? 因为如果你的程序运行时超过JVM默认内存大小,就不会报传说中内存溢出异常. Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at junit.Bean.main(Bean.java:25) 2.在MyEclipse 菜单 Run->run configurations 如下图: 这样设置以后.你的JVM内存大小就是266m了,如果不够的话.可以自行更改

cocos2d-x3.0rc 版 设置模拟器窗体大小

由于刚接触这职业时间不是非常长.也是第一次写博客,假设有错误的地方还请大神们指出,开通这博客目的非常easy相互学习和讨论(更重要的是记录工作中学到的东西以方便以后自己查阅) 先后參与过两个项目.只是框架都是搭建好了,非常大一部分都已经完毕.当要用到的时候仅仅要复制后进行改动,都说程序员越懒前进的越快,后来我才懂得原来复制是高手在用的,我这样的菜鸟不适合.在复制中把非常多C++的东西都过滤掉了,晚上闲着没事就自己创建了个project,当我打开project却无从下手.我開始害怕... 原来我什