栈的理解以及如何计算程序所需栈的大小并在IAR中设置栈
2016-09-09 14:35
549 查看
文章首发于浩瀚先森博客
#栈的理解
一个程序大体上讲都是由变量和函数组合而成,变量有全局变量和局部变量,还有函数间传值的参数以及返回值。
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大小,如下图
#栈的理解
一个程序大体上讲都是由变量和函数组合而成,变量有全局变量和局部变量,还有函数间传值的参数以及返回值。
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中设置栈
- Heap堆的理解以及在IAR中如何设置堆的大小
- vs2010 如何设置MFC程序窗口大小
- 【iOS开发-72】设置状态栏的两种方式、程序生命周期以及更好地理解几大类(对象)之间的关系
- 关于FFT的一些理解,以及如何手工计算FFT加深理解和验证正确性
- Android 如何根据设置文字大小动态计算TextView长度、动态设置Relativelayout布局
- Qt如何设置窗口屏幕居中显示以及设置大小
- VB.net | 如何在程序中执行用户脚本以及进行代数式计算
- Java对象的内存布局以及对象所需内存大小计算详解
- Win8如何设置调节单个程序的音量大小
- Flex中如何通过backgroundImage和backgroundSize样式,设置VBox容器的背景图片以及大小
- 【iOS开发-72】设置状态栏的两种方式、程序生命周期以及更好地理解几大类(对象)之间的关系
- 如何理解虚表及其计算含虚函数的类的大小
- Java对象的内存布局以及对象所需内存大小计算详解
- Unity设置发布程序运行时候位置以及窗体大小
- 结构体大小的计算及设置内存字节对齐数原理理解
- Foxit Reader以及Foxit Phantom如何设置页面固定大小
- 如何理解虚表及其计算含虚函数的类的大小
- ios之如何让图片显示成圆形的样式/设置控件边框大小以及颜色
- Android 如何根据设置文字大小动态计算TextView长度、动态设置Relativelayout布局