用CC2530做红外学习功,定义了一个数组:unsigned char data[255]
出现以下信息:原因是ISTACK堆栈溢出
Error[e16]: Segment ISTACK (size: 0x5f align: 0) is too long for segment definition. At least 0x7 more bytes needed. The problem occurred while processing the segment
placement command "-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#08-_IDATA0_END", where at the moment of placement the available memory ranges were "IDATA:a8-ff"
查询资料发现
说这是因为idata的大小设置不对,实际上idata最大只能设置为256字节,这是因为所有的8051单片机所决定的。且本IAR设置的实际大小为0x5f如图所示
关于idata,xdata,pdata的说明如下:
data: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
idata:固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同。
xdATa: 外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。
pdATa: 外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG, 建议少用。
也是就是说如果定义超过256字节的数组,编译器默认分配到idata,但是这是超过idata的大小的因为,我们要做的就是要把数组分配到xdata中去。因此修改如下:
unsigned char __xdata data[255] //其中“__”是两个,不是一个“_”
不再有编译错误,而且可以稳定运行。