查看: 11804|回复: 3

Error[e16]: Segment XDATA_I is too long for segment definition.

[复制链接]
pybrave0604 发表于 2011-11-20 19:49:39 | 显示全部楼层 |阅读模式
问题:当我在使用UART时,把UART的最大接受量HAL_UART_DMA_RX_MAX改为530字节时,出现了XDATA_Z内存不足的错误:
Error[e16]: Segment XDATA_I (size: 0xbe align: 0) is too long for segment definition. At least 0x99 more bytes needed. The problem occurred while processing the segment  placement command "-Z(XDATA)XDATA_N,XDATA_Z,XDATA_I=_XDATA_START-_XDATA_END", where at the moment of placement the available memory ranges were   "XDATA:fd31-fd55"
   Reserved ranges relevant to this placement:
   XDATA:f000-f0ff      XSTACK
   XDATA:f100-fd55      XDATA_Z
   BIT:0-7              BREG
   BIT:80-97            SFR_AN
   BIT:a8-af            SFR_AN
   BIT:b8-c7            SFR_AN
   BIT:d8-df            SFR_AN
   BIT:e8-ef            SFR_AN
   BIT:f8-ff            SFR_AN

解决方法:
1)网上有些解决方法:既然XDATA内存不足,那么就把一些比较大的数组定义到CODE区,这样可以节省出XDATA内存;这种方法在一定程度上可以解决问题,但是腾出的空间并不是很大,并且还要求存放在CODE的数组不能改动(静态的)。
2)自己的解决方法:从“msa_cc2430.map”文件中可以看到各个存储空间的占用量,XDATA是用来存放全局变量的,分别分为XStack,XDATA_Z,XDATA_I和XDATA_N,其中,XDATA_Z用来存放初始化为0的全局变量,XDATA_I用来存放初始化为非零的全局变量,(并且在程序开始执行前,变量放在XDATA_I中,具体初始化值放在XDATA_ID中,程序开始执行后,XDATA_ID的值复制到XDATA_I中去,具体的见IAR帮助文档)。
同时在“f8w2430.xcl”文件中发现虽然SRAM有8k字节的内存空间,但是XDATA却只能使用4K来存储数据(-D_IXDATA_START=F000至-D_IXDATA_END=FD55),后来知道,原来这跟芯片的节能电源模式有关,当电源模式选择节能模式,工作在模式PM2/PM3时,存储在xdata低4k字节的数据会丢失,所以,为了保险起见,“f8w2430.xcl”文件中就值用高4k字节来存数据。而我们暂时不考虑省电节能,可以选择PM0/PM1(默认为PM0),所以可以把XDATA 范围设置在-D_IXDATA_START=E000至-D_IXDATA_END=FEFF之间,有8k空间。这样设置之后,空间就大了很多了。
outman 发表于 2011-11-22 10:33:11 | 显示全部楼层
审核晚了,多谢楼主共享经验
lizheng86312 发表于 2012-8-29 13:23:31 | 显示全部楼层
学到东西了。顶。。。
baoliguo 发表于 2013-10-25 16:35:43 | 显示全部楼层
我也遇到了这个问题,但是怎么定义和使用呢?是不是和在内存中一样呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表