- 43
- 0
- 约13.28万字
- 约 36页
- 2016-12-03 发布于河南
- 举报
IAR的CSTAK和RSTACK的设置
IAR的CSTACK和RSTACK的设置
RSTACK 程序返回用的,保存的是程序调用函数的返回地址 , 你填写的数值 X 2才是占用的字节数,例如,你填写10,那么RSTACK尺寸是20字节,可以函数嵌套10层左右
CSTACK 函数局部变量用的区域,所有的功能函数使用的局部变量都是从这个堆栈申请使用的,用完了再还回去。子函数里面用到的局部变量都是在这里面取来用的.
例如:
void Fn(void)
{
unsigned char TT[64];
}
TT[64] 就会从CSTACK取出来用,用完后TT没用了,就可以还给CSTACK了,当子函数使用局部变量太多的时候,要注意CSTACK尺寸
当出现CSTACK和RSTACK溢出的时候,一般有2种情况:
1. CSTACK和RSTACK真的不够用
2. 中断反复重入,例如:当进去一个中断,你直接开启总中断,如果这个中断信号还在,那么中断函数会重入,这样你不管设置CSTACK和RSTACK多大,溢出是必然的, 一般情况是,如果你系统想执行所为的中断嵌套,你进去中断后,首先要关闭自身中断,然后再开总中断,退出时再重新开启自身中断
CSTACK设大点,200也不算大。
RSTACK一般设置到32就够了。
32层函数,中断嵌套,一般应该够了。
如果代码空间不是很紧张,最高优化建议用speed优化。
这个问题也困扰过我,现在整理了拿出来。。。。
在中断的时候,RAM溢出了,一般在中断里,堆栈最深,中断里出问题一般是RSTACK 的问题,这个是存函数调用返回地址的,也就是说,函数嵌套调用太多了。而C编译器编译的代码操作堆栈的次数远比我们想的多,当然这也是一个优秀C编译器的高级之处。
我一般碰到的问题是CSTACK设置问题,CSTACK是用来存数据的,这些数据主要用于函数间传递参数、全局变量同步等等。这个你要看E文版的IAR说明书。
这两个参数具体要设置多少,要看MAP文件。IAR不会自动告诉你的,而是需要由用户设定好。
我把我的一个程序改了,在中断里出现下面的提示:
Wed Apr 08 12:53:08 2009: The stack CStack is filled to 100% (16 bytes used out of 16). The warning threshold is set to 90%.
说明我的0X10小了,实际用到的大于16了,而到底这个大于16的数是多少,要看MAP文件里的相关数据。
在你工程目录的Debug\List下,找到你的MAP文件,里面记载着编译器编译你的工程时,资源的使用情况。
打开.MAP文件,搜索 CALL GRAPH ,你会发现你写的每个的函数都在这里,而每个函数用了多少资源,也都列在此。
找到最大的数,设置一下,试试吧。
没遇见过,一般来说函数嵌套调用的层数不会太多,RSTACK我一般设为32都够用了,CSTACK看单片机RAM大小,除了全局变量占用的之外我都全部分配给CSTACK,也就是说CSTACK = RAM大小 - 全局变量总数 - RSTACK
AVR的堆栈分为2种,一种是硬件堆栈,另一种是软件堆栈。
硬件堆栈存放调用函数的返回地址,其大小跟函数的调用层数相关。如果打开C/C++编译选项中优化选项的交叉调用的值为“unlimited”时,要特别小心。一般设为32应该没什么。其类型为RStack,界面设置值为调用深度,字节数是其2倍。
软件堆栈存放所以局部变量(部分局部变量可能是寄存器变量),如果函数的局部变量中有数组,则其大小要设置大一些。如果不想出错,就跟上楼所说的一样。
硬件堆栈和软件堆栈都是向下增长的(编译器默认),至于是硬件堆栈在低地址,还是软件堆栈在低地址,默认情况下由编译器决定,其地址应该在RAM的相对低的地址,但也可以通过.xcl配置文件进行更改。如:
-D_..X_RSTACK_SIZE=16 // 硬件堆栈的大小
-D_..X_CSTACK_SIZE=20 // 软件堆栈的大小
-Z(DATA)RSTACK+_..X_RSTACK_SIZE=(_..X_SRAM_END-_..X_RSTACK_SIZE)-_..X_SRAM_END
-Z(DATA)CSTACK+_..X_CSTACK_SIZE=(_..X_SRAM_END-_..X_RSTACK_SIZE-_..X_CSTACK_SIZE)-(_..X_SRAM_END-_..X_RSTACK_SIZE)
上述例子就硬性确定了硬件堆栈和软件堆栈的大小与位置。
另:以-D定义的数值,其变量名是可以自己定的。
在编译开关里面加入
原创力文档

文档评论(0)