Quantcast
Channel: Zigbee 和 Thread
Viewing all articles
Browse latest Browse all 16978

帖子: CC2530解决IAR调试出现IDATA溢出问题

$
0
0

用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]  //其中“__”是两个,不是一个“_”

不再有编译错误,而且可以稳定运行。

 


Viewing all articles
Browse latest Browse all 16978