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