IAR EW51: расположение большого массива CONST

В проекте CC2541 (IAR EW51/7.20) мне нужно хранить несколько больших массивов const (~ 30 КБ каждый).

Я определяю первый массив:

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

Он связывается в сегменте XDATA_ROM_C и работает нормально.

Затем я добавляю еще один массив 30 КБ в другой сегмент, чтобы преодолеть ограничение в 32 КБ:

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

Компоновщик выдает ошибку:

Ошибка [e104]: не удалось уместить все сегменты в указанные диапазоны. Проблема обнаружена в сегменте XDATA_ROM_C. Невозможно разместить 96 блоков (всего 0xe37e байт) в 0x8000 байт (ах) памяти.

Может ли кто-нибудь подсказать, как найти второй массив в отдельном сегменте, чтобы связывание прошло?

Я пытался следить за документацией и форумом, но, кажется, что-то не понимаю.

большое спасибо за любую поддержку

Спасибо.


ОБНОВЛЕНИЕ (довольно долгое, но, пожалуйста, потерпите меня):

Немного поигрался с определениями сегментов -

Я добавил два новых (CONST) сегмента в файл xcl:

// 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

Два наблюдения (прокрутите до конца файла карты):

  • Размер КОДА уменьшен на 28803 байта по сравнению с размером исходного массива, расположенного в исходном сегменте, аналогично размер сегмента уменьшен на те же 28803 байта. а также;
  • Недавно добавленный сегмент CONST (в файле xcl) отображается как XDATA в файле карты

Все было бы хорошо, если бы я мог загрузить сгенерированный двоичный файл в чип, но когда я пытаюсь «загрузить и отладить», я получаю следующее сообщение:

Неустранимая ошибка: все, что вы хотите поместить во флэш-память, должно быть помещено в сегмент памяти типа Xlink CODE.

Я попытался обойти и сгенерировать расширенный шестнадцатеричный файл Intel для автономной прошивки, но 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

Достигнув этого момента, я попробовал еще одну вещь и изменил определение новых сегментов на (КОД), как указано в сообщении об ошибке.

// 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

Вуаля, CONST сократился, а CODE расширился ровно на 57600 байт, как и ожидалось.

Он даже загружает, отлаживает и генерирует шестнадцатеричный файл.

НО при отладке кода выясняется, что вместо доступа к 0x28000 / 0x38000 контроллер памяти обращается к данным по адресу 0x8000, который является «исходным» (CONST) сегментом XDATA_ROM_C.

Обобщить:

при определении двух новых сегментов как (CONST) код связывается, но не может отлаживать или генерировать шестнадцатеричный файл и
при определении двух новых сегментов как (CODE) код связывается, загружается и запускается, но доступ к памяти отсутствует соответствие.

уф, это было длинное описание. Есть идеи кто-нибудь ????

Обратите внимание, что эта ветка дублируется и на форуме TI e2e здесь


person eyalasko    schedule 20.06.2016    source источник
comment
Вы где-то определили другой раздел, например, в файле конфигурации компоновщика?   -  person user694733    schedule 21.06.2016


Ответы (1)


У меня точно такая же проблема. Кажется, все константы данных должны быть в одном 32-килобайтном сегменте, который отображается в область Xdata. Я сделал слабую работу, используя объявление -Z (CODE) XDATA_ROM_C2 = 0x38000-0x3FFFF во второй попытке сопоставить мой 2-й массив данных 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], ....
person Aardvark102    schedule 07.07.2016