IAR编译cstack错误及解决办法


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

你可能感兴趣的:(iar,嵌入式软件设计)