IAR EW51:大型CONST阵列位置

时间:2016-06-20 09:21:37

标签: linker iar segment

CC2541 (IAR EW51/7.20)项目中,我需要存储几个大的const数组(每个~30KB)。

我定义了第一个数组:

const uint8 demo_signal_1[30000] = {
    0X00,
    0X01,
    0X10,
    // rest of the data
};

它链接到XDATA_ROM_C段并且运行得很好。

然后我在另一个段中添加另一个30KB阵列以克服32KB限制:

const uint8 demo_signal_2[30000] = {
    0X22,
    0X33,
    0X44,
    // rest of data
}

链接器抛出错误:

错误[e104]:无法将所有段放入指定范围。在段XDATA_ROM_C中发现的问题。无法将96个块(总共0xe37e个字节)放在0x8000个字节的内存中。

任何人都可以指导如何在自己的网段上找到第二个数组,以便链接传递吗?

我试图按照文档和论坛进行操作,但我似乎无法掌握一些内容。

非常感谢任何支持

感谢。

更新(很长,但请耐心等待):

我玩了一些段定义 -

我已经在xcl文件中添加了两个新的(CONST)段:

// Define segments for const data in flash.
// First the segment with addresses as used by the program (flash mapped as XDATA)
-P(CONST)XDATA_ROM_C=0x8000-0xFFFF
-Z(CONST)XDATA_ROM_C2=0x28000-0x2FFFF   // Added
-Z(CONST)XDATA_ROM_C3=0x38000-0x3FFFF   // Added
//

并定义了要在这些段中定位的数组

// Array 1 in it own segment
const uint8 demo_signal_1[28800] @ "XDATA_ROM_C2"= {
        0X00,
        0X00,
        0X01,
        0X01,
// ...rest of initialization data
}

// Array 2 in it own segment
const uint8 demo_signal_2[28800] @ "XDATA_ROM_C3" = {
        0X00,
        0X00,
        0X02,
        0X02,
// ...rest of initialization data
}

这次链接很好并生成以下地图文件

                ****************************************
                *                                      *
                *      SEGMENTS IN ADDRESS ORDER       *
                *                                      *
                ****************************************


SEGMENT              SPACE    START ADDRESS   END ADDRESS     SIZE  TYPE  ALIGN
=======              =====    =============   ===========     ====  ====  =====
INTVEC               CODE          00000000 - 00000085          86   com    0
CSTART               CODE          00000086 - 00000136          B1   rel    0
BIT_ID               CODE               00000137                     dse    0
BDATA_ID             CODE               00000137                     dse    0
IDATA_ID             CODE               00000137                     dse    0
IXDATA_ID            CODE               00000137                     dse    0
PDATA_ID             CODE               00000137                     dse    0
DATA_ID              CODE               00000137                     dse    0
XDATA_ID             CODE          00000137 - 0000057A         444   rel    0
BANK_RELAYS          CODE          0000057B - 0000151C         FA2   rel    0
RCODE                CODE          0000151D - 00001C4F         733   rel    0
CODE_N               CODE               00001C50                     dse    0
DIFUNCT              CODE               00001C50                     dse    0
NEAR_CODE            CODE          00001C50 - 00002C14         FC5   rel    2
<BANKED_CODE> 1      CODE          00002C15 - 00002C17           3   rel    0
<BANKED_CODE,CODE_C> 1
                     CODE          00002C18 - 00007FFB        53E4   rel    2
<BANKED_CODE,XDATA_ROM_C_FLASH> 1
                     CODE          00008000 - 0000FFFD        7FFE   rel    2
<BANKED_CODE> 2      CODE          00010000 - 00017FF9        7FFA   rel    0
<BANKED_CODE> 3      CODE          00018000 - 0001DE08        5E09   rel    0
BLENV_ADDRESS_SPACE
                     CODE          0003E800 - 0003F7FF        1000   rel    0
REGISTERS            DATA          00000000 - 00000007           8   rel    0
VREG                 DATA          00000008 - 00000017          10   rel    0
PSP                  DATA               00000018                     dse    0
XSP                  DATA          00000018 - 00000019           2   rel    0
DATA_I               DATA               0000001A                     dse    0
BREG                 BIT        00000020.0  -  00000020.7        8   rel    0
DATA_Z               DATA          00000021 - 00000028           8   rel    0
SFR_AN               DATA          00000080 - 00000080           1   rel    0
                     DATA          00000086 - 0000008A           5 
                     DATA          0000008C - 0000008D           2 
                     DATA          00000090 - 00000091           2 
                     DATA          00000094 - 00000097           4 
                     DATA          0000009A - 000000A9          10 
                     DATA          000000AB - 000000AF           5 
                     DATA          000000B3 - 000000B4           2 
                     DATA          000000B6 - 000000B6           1 
                     DATA          000000B8 - 000000B9           2 
                     DATA          000000BB - 000000C7           D 
                     DATA          000000C9 - 000000C9           1 
                     DATA          000000D1 - 000000DB           B 
                     DATA          000000E1 - 000000E9           9 
                     DATA          000000F1 - 000000F5           5 
                     DATA          000000F8 - 000000FA           3 
                     DATA          000000FC - 000000FF           4 
XSTACK               XDATA         00000001 - 00000280         280   rel    0
XDATA_Z              XDATA         00000281 - 00000BE4         964   rel    0
XDATA_I              XDATA         00000BE5 - 00001028         444   rel    0
<XDATA_N> 1          XDATA         00001029 - 00001C2A         C02   rel    0
XDATA_AN             XDATA         0000780E - 00007813           6   rel    0
<XDATA_ROM_C> 1      CONST         00008000 - 00008805         806   rel    2
XDATA_ROM_C2         XDATA         00028000 - 0002F07F        7080   rel    0
XDATA_ROM_C3         XDATA         00038000 - 0003F07F        7080   rel    0
IDATA_I              IDATA              00000029                     dse    0
IDATA_Z              IDATA         00000029 - 0000002A           2   rel    0
ISTACK               IDATA         00000040 - 000000FF          C0   rel    0

                ****************************************
                *                                      *
                *        END OF CROSS REFERENCE        *
                *                                      *
                ****************************************

 126 461 bytes of CODE  memory
      34 bytes of DATA  memory (+ 86 absolute )
   7 210 bytes of XDATA memory (+  6 absolute )
     194 bytes of IDATA memory
       8 bits  of BIT   memory
  59 654 bytes of CONST memory

Errors: none
Warnings: none

两个观察结果(滚动到地图文件的底部):

  • CODE大小减少了28803字节作为原始大小 类似地,数组位于原始段中  段大小减少了相同的28803个字节。和;
  • 新添加的CONST段(在xcl文件中)在地图文件中显示为XDATA

如果我可以将生成的二进制文件下载到芯片中,但是当我尝试下载和调试时,这一切都会没问题。我收到以下消息:

Fatal Error: Everything you want to place in flash memory must be placed with Xlink CODE memory segment type.

我试图绕过并生成英特尔扩展的hex文件,将其独立闪存,但IDE返回以下错误:

Error[e133]: The output format intel-extended cannot handle multiple address spaces. Use format variants (-y -O) to specify which address space is wanted

到目前为止,我尝试了另外一件事,并根据错误消息的建议将新段定义更改为(CODE)。

// Define segments for const data in flash.
// First the segment with addresses as used by the program (flash mapped as XDATA)
-P(CONST)XDATA_ROM_C=0x8000-0xFFFF
-Z(CODE)XDATA_ROM_C2=0x28000-0x2FFFF    // Modified to (CODE)
-Z(CODE)XDATA_ROM_C3=0x38000-0x3FFFF    // Modified to (CODE)

再次链接正常,地图文件显示(滚动到底部):

                ****************************************
                *                                      *
                *      SEGMENTS IN ADDRESS ORDER       *
                *                                      *
                ****************************************


SEGMENT              SPACE    START ADDRESS   END ADDRESS     SIZE  TYPE  ALIGN
=======              =====    =============   ===========     ====  ====  =====
INTVEC               CODE          00000000 - 00000085          86   com    0
CSTART               CODE          00000086 - 00000136          B1   rel    0
DATA_ID              CODE               00000137                     dse    0
BDATA_ID             CODE               00000137                     dse    0
BIT_ID               CODE               00000137                     dse    0
IDATA_ID             CODE               00000137                     dse    0
IXDATA_ID            CODE               00000137                     dse    0
PDATA_ID             CODE               00000137                     dse    0
XDATA_ID             CODE          00000137 - 0000057A         444   rel    0
BANK_RELAYS          CODE          0000057B - 0000151C         FA2   rel    0
RCODE                CODE          0000151D - 00001C4F         733   rel    0
DIFUNCT              CODE               00001C50                     dse    0
CODE_N               CODE               00001C50                     dse    0
NEAR_CODE            CODE          00001C50 - 00002C14         FC5   rel    2
<BANKED_CODE> 1      CODE          00002C15 - 00002C17           3   rel    0
<BANKED_CODE,CODE_C> 1
                     CODE          00002C18 - 00007FFB        53E4   rel    2
<BANKED_CODE,XDATA_ROM_C_FLASH> 1
                     CODE          00008000 - 0000FFFD        7FFE   rel    2
XDATA_ROM_C2         CODE          00010000 - 0001707F        7080   rel    0
<BANKED_CODE> 2      CODE          00017080 - 00017FF3         F74   rel    0
XDATA_ROM_C3         CODE          00018000 - 0001F07F        7080   rel    0
<BANKED_CODE> 3      CODE          0001F080 - 0001FFF0         F71   rel    0
<BANKED_CODE> 4      CODE          00020000 - 00027FF9        7FFA   rel    0
<BANKED_CODE> 5      CODE          00028000 - 0002BF23        3F24   rel    0
BLENV_ADDRESS_SPACE
                     CODE          0003E800 - 0003F7FF        1000   rel    0
REGISTERS            DATA          00000000 - 00000007           8   rel    0
VREG                 DATA          00000008 - 00000017          10   rel    0
PSP                  DATA               00000018                     dse    0
XSP                  DATA          00000018 - 00000019           2   rel    0
DATA_I               DATA               0000001A                     dse    0
BREG                 BIT        00000020.0  -  00000020.7        8   rel    0
DATA_Z               DATA          00000021 - 00000028           8   rel    0
SFR_AN               DATA          00000080 - 00000080           1   rel    0
                     DATA          00000086 - 0000008A           5 
                     DATA          0000008C - 0000008D           2 
                     DATA          00000090 - 00000091           2 
                     DATA          00000094 - 00000097           4 
                     DATA          0000009A - 000000A9          10 
                     DATA          000000AB - 000000AF           5 
                     DATA          000000B3 - 000000B4           2 
                     DATA          000000B6 - 000000B6           1 
                     DATA          000000B8 - 000000B9           2 
                     DATA          000000BB - 000000C7           D 
                     DATA          000000C9 - 000000C9           1 
                     DATA          000000D1 - 000000DB           B 
                     DATA          000000E1 - 000000E9           9 
                     DATA          000000F1 - 000000F5           5 
                     DATA          000000F8 - 000000FA           3 
                     DATA          000000FC - 000000FF           4 
XSTACK               XDATA         00000001 - 00000280         280   rel    0
XDATA_Z              XDATA         00000281 - 00000BE4         964   rel    0
XDATA_I              XDATA         00000BE5 - 00001028         444   rel    0
<XDATA_N> 1          XDATA         00001029 - 00001C2A         C02   rel    0
XDATA_AN             XDATA         0000780E - 00007813           6   rel    0
<XDATA_ROM_C> 1      CONST         00008000 - 00008805         806   rel    2
IDATA_I              IDATA              00000029                     dse    0
IDATA_Z              IDATA         00000029 - 0000002A           2   rel    0
ISTACK               IDATA         00000040 - 000000FF          C0   rel    0

                ****************************************
                *                                      *
                *        END OF CROSS REFERENCE        *
                *                                      *
                ****************************************

 184 061 bytes of CODE  memory
      34 bytes of DATA  memory (+ 86 absolute )
   7 210 bytes of XDATA memory (+  6 absolute )
     194 bytes of IDATA memory
       8 bits  of BIT   memory
   2 054 bytes of CONST memory

Errors: none
Warnings: none

Voilla,CONST缩小了,CODE按预期扩展了57600字节。

它甚至可以下载和调试并生成hex文件。

但是在调试代码时,看起来代替访问0x28000 / 0x38000,内存控制器访问0x8000处的数据,这是原始的&#39; (CONST)XDATA_ROM_C段。

总结:

当将两个新段定义为(CONST)时,代码链接但不能调试也不能生成hex文件和
将两个新段定义为(CODE)时,代码会链接,加载和运行,但内存不会被访问。

p,这是很长的描述。任何想法有人????

请注意,此线程在TI e2e论坛以及here

中都是重复的

1 个答案:

答案 0 :(得分:0)

我有同样的问题。似乎所有数据常量都需要在一个32K段中,该段被映射到Xdata区域。我在第二次尝试使用-Z(CODE)XDATA_ROM_C2 = 0x38000-0x3FFFF声明将我的第二个32K数据数组映射到BANK6时做了一个微弱的工作。在我的代码访问例程中,我通过使用HalFlashRead例程将32字节块拉入本地数组然后索引到本地数组 - 大量的位丢失,但是HaFlash例程需要2k页码,偏移到页面,缓冲区放置数据和字节数。这不是一个可靠的便携式解决方案,但允许我继续前进。 - 希望它有助于或为您提供更多见解

rd_addr = 0x38000 + offset;
HalFlashRead((rd_addr>>0x11)&0xff), (rd_addr & 0x7ff), *ptr32bytes, 32);
realdata = ptr[0];  // offset == [0], offset+1= [1], ....