网站大量收购闲置独家精品文档,联系QQ:2885784924

IAR的CSTAK和RSTACK的设置.doc

  1. 1、本文档共36页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
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)

pep2233 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档