文章首发于浩瀚先森博客

#栈的理解

一个程序大体上讲都是由变量和函数组合而成,变量有全局变量和局部变量,还有函数间传值的参数以及返回值。

Stack是为了程序运行过程中临时保存所需数据而在内存里分配的一小块空间。保存的数据类型一般情况下包括以下几种:

1. 函数中声明的局部变量以及参数

2. 函数返回值

3. 中断时CPU 寄存器值

4. 函数运行后返回的地址

比方说下面的例子,函数里声明的局部变量保存在stack里面,在该函数中调用其他函数的时候其他函数中的局部变量也会添加到stack里保存。

从IAR编译器里确定Stack。

在IAR编译器里通过使用Stack Windows来确认stack的使用量和stack中保存的值。(View->Stack->Stack Window)

用Bar Graph形式来查看stack的话stack中的数据和地址等信息都能查看的到。

* 上面为了确定stack最大使用量,通过菜单Tools->Options->Stack中的 Enable graphical stack display and stack usage tracking 选项来检查。

#如何设定stack大小

Stack的大小是由开发者直接设置,编译时由编译器分配空间。

Stack大小分配不足的话保存的变量要么overwrite,要么程序异常终止。相反,如果空间分配太大又浪费。

所以程序里要需要多大的stack空间必须准确的计算把握。

在IAR Compiler里提供了预测stack大小的stack使用量分析功能(stack usage analysis)。

(Project Option -> Linker -> Advanced -> Enable stack usage analysis)

stack使用量在map文件里可以查看得到,前提是你要打开生成map文件的功能,如下:

编译程序后,map文件在project output文件夹下

打开map文件可以看到stack usage情况,如下:

程序里使用最大的stack大小为108bytes,中断使用的stack大小为40bytes和16bytes。 所以程序里要设置比108+400+16大的stack空间才型。

CSTACK Size >= maxstack("Program entry") + totalstack("interrupt") + safety margin(100);

类似上面情况 需要分配108 + 40 + 16 + 100 = 264Byte 的stack空间。

#设置stack大小

程序需要的stack大小前面已经计算出来了,那么怎么设置呢?

如下图,在项目的Linker选项里设置。

Linker的 Config选项卡里点击Edit变更设置。

Stack/Heap Sizes选项卡里变更CSTACK的大小.

或者是用文本编辑器打开icf文件直接修改stack大小,如下图

栈的理解以及如何计算程序所需栈的大小并在IAR中设置栈的更多相关文章

  1. Struts学习之值栈的理解

    转自:http://blog.csdn.net/hanxuemin12345/article/details/38559979 页面一个请求发送过来,依次经过一系列拦截器(处理公共部分,如:往数据中心 ...

  2. 堆&栈的理解(转)

    (摘自:http://www.cnblogs.com/likwo/archive/2010/12/20/1911026.html) C++中堆和栈的理解 内存分配方面: 堆: 操作系统有一个记录空闲内 ...

  3. (深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)

    bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. bss是英文Block Started by Symbol的简称. bss段属于静态内存分配. ...

  4. 【转】(深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)

    bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. bss是英文Block Started by Symbol的简称. bss段属于静态内存分配. ...

  5. iOS 堆和栈 的理解

    本文部分内容整理于网络,感谢原作者. 堆(heap)和栈(stack)是C/C++编程不可避免会碰到的两个基本概念.首先,这两个概念都可以在讲数据 结构的书中找到,他们都是基本的数据结构,虽然栈更为简 ...

  6. EL与OGNL以及值栈的理解

    这里先添加下在项目遇到的问题: 这两天在做论坛项目的时候,犯了一个错误:将数据放入值栈中,结果jsp页面获取不到. 困扰了许久: 总结如下: (1)每个action对应相应页面的值栈中值的获取,在属于 ...

  7. java 堆和栈一般理解

    栈与堆都是Java用来在Ram中存放数据的地方.与C++不同.Java自己主动管理栈和堆.程序猿不能直接地设置栈或堆.  Java的堆是一个执行时数据区,类的(对象从中分配空间.这些对象通过new.n ...

  8. 理解Java虚拟机中的栈、堆、堆栈

    JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 栈区: 每个线程包含一个栈区,栈中只保存方法中(不包括对象的成员变量)的基础数据类型和自定义对象的引用(不 ...

  9. 从栈上理解 Go语言函数调用

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/518 本文使用的go的源码 1.15.7 前言 函数调用类型 这篇文 ...

随机推荐

  1. 工厂方法(Factory Method),思考

    最近看见一个关于如何通过工厂方法来重构代码的提问,发现这方面,自己还没有想得特别明白,所以,稍作总结. 只要有构造的地方,就有是用工厂方法的可能. 如果考虑到单元测试和实现的扩展,就有是用工厂方法的必 ...

  2. CSS3中的弹性布局——"em"的用法

    使用CSS也好久了,但一直都是在使用“px”来设置Web元素的相关属性,未敢使用“em”.主要原因是,对其并不什么了解,只知道一点概念性的东西,前段时间在项目中要求使用“em”作为单位设置元素,所以从 ...

  3. SharePoint 2007 User Re-created in AD with new SID issue on MySite

    When active directory users get deleted and re-created, even with the same user id, there's a nasty ...

  4. iOS 根据银行卡号判断银行名称

    如何根据银行卡号判断银行名称? + (NSString *)getBankName:(NSString*) cardId{ //"发卡行.卡种名称", NSArray* bankN ...

  5. drawRect与setNeedsDisplay简单介绍

    - (void)drawRect:(CGRect)rect { } p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: ...

  6. UIWebView加载本地html文件

    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(, , KScreenWidth, KScreenHeight-)]; ...

  7. 打开MySQL数据库远程访问的权限

    说明:转自,http://www.cnblogs.com/ycsfwhh/archive/2012/08/07/2626597.html    本人亲测方法1有效,方法2待验证 下载GPL版本安装 M ...

  8. jquery通过class验证表单不能为空

    在开发系统时,往往都有某些表单数据为必填项,若用jQuery通过ID去验证,不仅会影响效率,还会有所遗漏,不易于后期维护. 本章将介绍如何利用jQuery,通过为表单配置class进行统一验证.(ID ...

  9. java中遍历map的两种方式

    1.先将map对象转成set,然后再转为迭代器 Iterator iterator = map.entrySet().iterator(); while(iterator.hasNext()){ En ...

  10. Mysql时间类型处理

    关于Mysql中时间的处理 最近在读<人类简史>,读第二遍.只有晚上睡觉之前读一点点,有时候觉得一天可以抽出一个专门的时间来看书了,效率应该能高不少. 另外分享个网址可以随心创作 这里有一 ...