本文主要是介绍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编译cstack错误及解决办法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!