栈的理解以及如何计算程序所需栈的大小并在IAR中设置栈
文章首发于浩瀚先森博客
#栈的理解
一个程序大体上讲都是由变量和函数组合而成,变量有全局变量和局部变量,还有函数间传值的参数以及返回值。
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中设置栈的更多相关文章
- Struts学习之值栈的理解
转自:http://blog.csdn.net/hanxuemin12345/article/details/38559979 页面一个请求发送过来,依次经过一系列拦截器(处理公共部分,如:往数据中心 ...
- 堆&栈的理解(转)
(摘自:http://www.cnblogs.com/likwo/archive/2010/12/20/1911026.html) C++中堆和栈的理解 内存分配方面: 堆: 操作系统有一个记录空闲内 ...
- (深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)
bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. bss是英文Block Started by Symbol的简称. bss段属于静态内存分配. ...
- 【转】(深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)
bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. bss是英文Block Started by Symbol的简称. bss段属于静态内存分配. ...
- iOS 堆和栈 的理解
本文部分内容整理于网络,感谢原作者. 堆(heap)和栈(stack)是C/C++编程不可避免会碰到的两个基本概念.首先,这两个概念都可以在讲数据 结构的书中找到,他们都是基本的数据结构,虽然栈更为简 ...
- EL与OGNL以及值栈的理解
这里先添加下在项目遇到的问题: 这两天在做论坛项目的时候,犯了一个错误:将数据放入值栈中,结果jsp页面获取不到. 困扰了许久: 总结如下: (1)每个action对应相应页面的值栈中值的获取,在属于 ...
- java 堆和栈一般理解
栈与堆都是Java用来在Ram中存放数据的地方.与C++不同.Java自己主动管理栈和堆.程序猿不能直接地设置栈或堆. Java的堆是一个执行时数据区,类的(对象从中分配空间.这些对象通过new.n ...
- 理解Java虚拟机中的栈、堆、堆栈
JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 栈区: 每个线程包含一个栈区,栈中只保存方法中(不包括对象的成员变量)的基础数据类型和自定义对象的引用(不 ...
- 从栈上理解 Go语言函数调用
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/518 本文使用的go的源码 1.15.7 前言 函数调用类型 这篇文 ...
随机推荐
- js 把对象按照属性名的字母顺序进行排列
var obj = {name: "zhangsan", age: 8, ace: 5, nbme: "lisi"};//要排序的对象function objK ...
- GIS公交查询-flex/java
开发语言是flex.java,开发平台是myeclise.eclise,开发接口是arcgis api for flex,提供以下的功能: 1.站名-站名查询: 2.站点查询: 3.路线查询: 备注: ...
- SharePoint 2013 页面访问,Url中间多一段"_layouts/15/start.aspx#"
问题描述: 我想访问如下页面 http://Host/_layouts/15/ManageFeatures.aspx 点击以后页面地址没有错,但是中间多了一段“_layouts/15/start.as ...
- 【代码笔记】iOS-文字走马灯效果
一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...
- Android 最全Activity生命周期
新进入Activity:onCreate > onStart > onResume 退出Activity:onPause > onStop > onDestroy 目前处于该A ...
- Orchard中如何配置远端发布
Orchard中默认安装是有Blog功能的.下面介绍如何配置Remote Blog Publishing功能,使用Windows Live Writer客户端发布博客. 一,开启Remote Blog ...
- SQL SERVER 2012 修改数据库默认位置不立即生效
今天修改SQL SERVER 2012的数据库默认位置:即数据文件.日志文件默认位置时遇到一个问题,单击"服务器属性"(Server Properties)--> 数据库设置 ...
- JVM之Parallel Old收集器
Parallel Scavenge的老年代版本 标记-整理算法 注重吞吐量及cpu资源敏感环境.
- 内存管理内幕mallco及free函数实现
原文:https://www.ibm.com/developerworks/cn/linux/l-memory/ 为什么必须管理内存 内存管理是计算机编程最为基本的领域之一.在很多脚本语言中,您不必担 ...
- hive建表与数据的导入导出
建表: create EXTERNAL table tabtext(IMSI string,MDN string,MEID string,NAI string,DestinationIP string ...