IAR编译cstack错误及解决办法

时间:2021-08-20 04:51:15

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函数的调用,进行内存释放。