1. 代码段设置过小
Make 的link error message示例:
>>Error[e16]: Segment XDATA_ID (size: 0x1c3 align: 0) is too long for segment definition. At least 0xb8 more bytes needed. >>The problem occurred while processing the segment placement command >>"-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_START-_CODE_END",
>>where at the moment of placement the available memory ranges were "CODE:27f5-28ff"
>>Reserved ranges relevant to this placement:
>>CODE:0-85 INTVEC
>>CODE:86-165 CSTART
>>CODE:166-10a0 RCODE
>>CODE:10a1-18b8 NEAR_CODE
>>CODE:18b9-27f4 BANK_RELAYS
>>CODE:27f5-28ff XDATA_ID
>>BIT:0-7 BREG
>>BIT:80-97 SFR_AN
>>BIT:a0-af SFR_AN
>>BIT:b8-c7 SFR_AN
>>BIT:d8-df SFR_AN
>>BIT:e8-ef SFR_AN
>>BIT:f8-ff SFR_AN
我们可以看到, 这里提示是说0x1c3 is too long for segment definition,观察一下XDATA_ID这个段,地址区间为27f5~28ff。总共长度
只有0x10A的长度,所以偏移量0x1c3必然是超出预设置的数据段的范围咯。
在z-stack工程里面的tool目录下有一个.xcl文件, 打开它ctrl+F一下CODE_END这个词,会找到这样一句话
>>"-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_START-_CODE_END"
就是error信息中提示的那条正在执行的命令。继续Ctrl+F D_CODE_END这个词, 找到这个东西的定义处。
你会发现他定义为0x28FF,这跟error message是吻合的。根据提示,我们至少在需要让XDATA段有0x1c3的长度,所以我们可以将此变量
的值设定为 大于 0x27f5+0x1c3 = 0x29b8的数值。为了有较充足的空间,我设置成0x3500,再make,问题解决。