[
转
] IAR
集成开发环境如何设置堆栈大小
GCC
和
IAR
分配堆栈的方式不同,
IAR
先分配堆栈空间,相当于定义一个
全局数组为堆栈空间,堆栈初始为堆栈空间最高地址;
GCC
不用先分配堆栈,
自动把
RAM
剩余空间作为堆栈空间,堆栈初始为
RAM
最高地址。
初学者很容易忽视这个问题,造成程序跑飞而找不到问题的症结,我在用
IAR For MSP430
的时候没遇到过这个问题,
因为
MSP430
的
RAM
比较大,
IAR
默认是
80
字节,足够一般程序使用。
但是使用
IAR For SAM8
的时候,
有一个比较耗费堆栈的程序运行一段时间
后出问题,
由于要记录一个
24
小时的数组,
而数组元素的值是在堆栈里改变的,
所以,记录到一定时间以后,出现了堆栈不足的情况,初学者如果没有仿真器,
是很难发现这个问题的,还好我用的仿真器在
Debug
的时候出现了堆栈不足的
警告,我才意识到是这里问题。
IAR For SAM8
默认堆栈是
32
字节,
既然不够用,
那么就要增大,
但是设置
到多少合适呢?
首先编译你的程序,看程序用了多少自己的
RAM
,
转载
]IAR
下
Data stack(CSTACK)
的设置问题
" alt="[
转载
]IAR
下
Data stack(CSTACK)
的设置问题
"
src="http://s13.sinaimg.cn/middle/51f1a413g82a17692080c&690">
在看看芯片的
Datasheet
,看看芯片总共有多大的
RAM
,
转载
]IAR
下
Data stack(CSTACK)
的设置问题
" alt="[
转载
]IAR
下
Data stack(CSTACK)
的设置问题
"
src="http://s7.sinaimg.cn/middle/51f1a413gd1a4eeb64da6&690"
real_src="http://s7.sinaimg.cn/middle/51f1a413gd1a4eeb64da6&690">
好了现在你就知道剩余多少
RAM
了:
208-142=66
(
Byte
)
前面说过
IAR
的
CSTACK,NEAR_HEAP
和
RSTACK
是预先分配好的,占
用存储空间是固定不变的,相当于定义了一个全局数组,
GCC
堆栈策略与
IAR
不同,堆栈大小不是预先分配好的,而是把
SRAM
里面剩余空间作为堆栈空间。
如果是
GCC
,
那么编译器就会自动设置剩余的
RAM
为数据堆栈
(和数据返
回堆栈
RSTACK
,
NEAR_HEAP
等)。
在
IAR
里,
STACK
应该设置到多少呢?
在工程
-
》
Options-
》
Linker-
》
List
(不同的
IAR
版本会稍有不同),选择生
成
LIST
文件,并包含
stack
选项
转载
]IAR
下
Data stack(CSTACK)
的设置问题
" alt="[
转载
]IAR
下
Data stack(CSTACK)
的设置问题
"
src="http://s11.sinaimg.cn/middle/51f1a413g82a19e1658ea&690"
real_src="http://s11.sinaimg.cn/middle/51f1a413g82a19e1658ea&690">
在
./Debug/list
目录下,得到
.map
(可能是
.lst
等其他格式)文件,用记事本
打开,找到以下内容:
****************************************
* *
* CALL GRAPH *
* *
****************************************