|
问题:当我在使用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空间。这样设置之后,空间就大了很多了。 |
|