IAR编译cstack错误及解决办法

来源:互联网 发布:淘宝卖文具赚钱吗 编辑:程序博客网 时间:2024/06/05 17:10

IAR编译cstack错误:

Error[e16]: Segment CSTACK (size: 0x20 align: 0x1) is too long for segment definition. At least 0x6 more bytes needed. The problem occurred while processing the segment placement  command "-Z(DATA)CSTACK+_CSTACK_SIZE#40-fd", where at the moment of placement the available memory ranges were "DATA:e4-fd"    Reserved ranges relevant to this placement:    DATA:41-44           DATA_I    DATA:45-56           DATA_Z    DATA:57-5a           DATA_N    DATA:5b-61           OVERLAY    DATA:62-8e           IDATA_I    DATA:8f-e3           IOVERLAY    DATA:e4-fd           CSTACK    BIT:b0-bf            DATA_AN    BIT:d0-df            DATA_AN    BIT:e8-ef            DATA_AN    BIT:100-117          DATA_AN    BIT:120-13f          DATA_AN    BIT:178-19f          DATA_AN    BIT:200-200          BIT_N  Total number of errors: 1 Total number of warnings: 0 


原因:此错误是所定义的全局变量和数组缓冲区等所占的RAM超出硬件支持所致,size: 0x6为超出的大小。只要减少不要的全局变量和尽量缩小数组缓冲区就可以了!


查看原程序中定义太多大的数组:

main(){  int8_t hitag3_buff[20];...  func(hitag3_buff);   }

这种方式定义数组没有在RAM释放,所以有可能出现超出RAM。

我的解决办法:

就是把数组封装到相应的函数:


func_total(){int8_t hitag3_buff[20];func(hitag3_buff)}

那么原函数就变成;

main(){...  func_total();   }


即在调用函数后数组得到释放。留下更多RAM空间可供使用。


函数内参数的变化:

1 局部变量。
即在函数内部定义的变量,且变量不带static修饰。这时,在退出函数后,变量自带内存会自动释放。
2 静态变量。
函数内部定义的带static修饰的变量为静态变量,这种变量在函数退出后不会释放内存,直到程序退出时一起释放。
3 动态分配内存。
指通过malloc,calloc,zalloc等函数申请的内存空间,这类空间在退出函数后不会自动释放,要释放只有通过free函数的调用,进行内存释放。

原创粉丝点击